Регистрация: 15.02.2011
Сообщений: 6
|
Элементы управления(кнопки, меню) в fullscreen OpenGL приложении
Подскажите как сделать элементы управления(кнопки, меню) в fullscreen OpenGL приложении на С++, по возможности с исходниками, так проще понять
Код:
#include <windows.h>
#include <gl\glut.h>
#include <gl\glaux.h>
static HGLRC hRC;
static HDC hDC;
BOOL keys[256],
active = TRUE,
fullscreen = TRUE;
GLdouble xrot = 0,
yrot = 0,
zrot = 0,
rot = 0,
xspeed,
yspeed,
zspeed,
x = 0,
y = 0,
z = 0;
GLint initGL(GLsizei width, GLsizei height)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
return 0;
}
GLvoid reSizeGLScene(GLsizei width, GLsizei height)
{
if (height == 0) height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
GLvoid drawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(x, y, z - 20);
glRotated(xspeed, 1.0f, 0.0f, 0.0f);
glRotated(yspeed, 0.0f, 1.0f, 0.0f);
glRotated(zspeed, 0.0f, 0.0f, 1.0f);
}
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
RECT Screen;
GLuint PixelFormat;
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
switch (message)
{
case WM_CREATE:
hDC = GetDC(hWnd);
PixelFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC,PixelFormat,&pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
GetClientRect(hWnd, &Screen);
initGL(Screen.right, Screen.bottom);
break;
case WM_DESTROY:
case WM_CLOSE:
ChangeDisplaySettings(NULL, 0);
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd, hDC);
PostQuitMessage(0);
break;
case WM_KEYDOWN:
keys[wParam] = TRUE;
break;
case WM_KEYUP:
keys[wParam] = FALSE;
break;
case WM_SIZE:
reSizeGLScene(LOWORD(lParam), HIWORD(lParam));
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL WinClass";
RegisterClass(&wc);
hWnd = CreateWindow(
"OpenGL WinClass",
"OpenGL",
WS_POPUP |
WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0,
1680, 1050,
NULL,
NULL,
hInstance,
NULL);
DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof(DEVMODE));
dmScreenSettings.dmSize = sizeof(DEVMODE);
dmScreenSettings.dmPelsWidth = 1680;
dmScreenSettings.dmPelsHeight = 1050;
dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
ShowCursor(FALSE);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);
while (1)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else return 0;
}
drawGLScene();
SwapBuffers(hDC);
if (keys[VK_ESCAPE])SendMessage(hWnd, WM_CLOSE, 0, 0);
}
}
Код чуть-чуть другой, это урезанный вариант, но общее понятие дать может, у меня он 17,6 кб
Последний раз редактировалось suc-daniil; 15.02.2011 в 19:16.
|