Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2011, 17:58   #1
suc-daniil
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию Элементы управления(кнопки, меню) в fullscreen OpenGL приложении

Люди, пожалуйста, подскажите как сделать кнопки, выпадающие меню и т.д. в полноэкранном 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);
	}
}

Последний раз редактировалось suc-daniil; 15.02.2011 в 19:01.
suc-daniil вне форума Ответить с цитированием
Старый 15.02.2011, 19:10   #2
suc-daniil
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

Код чуть-чуть другой, это урезанный вариант, но общее понятие дать может, у меня он 17,6 кб
suc-daniil вне форума Ответить с цитированием
Старый 27.02.2011, 02:06   #3
Crivel
Delphi\C++
Форумчанин
 
Аватар для Crivel
 
Регистрация: 18.06.2008
Сообщений: 277
По умолчанию

У самого OpenGL таких возможностей нет, поэтому надо всё рисовать вручную... Я например делал так: устанавливаю ортогональную проекцию и тупо рисую через glBegin/gEnd текстурируя. Обработку событий, типа нажатие кнопки, нужно проверить находится ли курсор внутри x, y, width и height кнопки.

Ортогональная проекция устанавливается так:
Код:
glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    glOrtho (0, WindowWidth, WindowHeight, 0, 0, 1);
    glMatrixMode (GL_MODELVIEW);
Где WindowWidth - Ширина окна, а WindowHeight - Высота окна.

Ещё как вариант использовать готовые библиотеки типа myGUI.

Последний раз редактировалось Crivel; 27.02.2011 в 02:10.
Crivel вне форума Ответить с цитированием
Старый 15.03.2011, 20:12   #4
suc-daniil
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

Я тоже уже думал так делать, но надеялся что можно через glut
п.с. как мне соотнести х и у мышки с теми единицами, в которых opengl измеряет?
suc-daniil вне форума Ответить с цитированием
Старый 30.03.2011, 22:11   #5
suc-daniil
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

Забил на всё, ушёл на Irrlicht
suc-daniil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Элементы управления Excel magana Microsoft Office Excel 4 15.12.2010 17:43
Элементы управления Lawliet32 Win Api 5 25.04.2010 21:12
Элементы управления ольгаг Microsoft Office Excel 0 12.03.2010 09:45
И сново sendMessage =) Как нажать пункт верхнего меню и меню правой кнопки? TwiX Win Api 9 15.10.2009 01:57
Элементы управления Rom1k06 Microsoft Office Excel 7 28.08.2008 09:47