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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2010, 19:57   #11
Koshmarovsky
Пользователь
 
Аватар для Koshmarovsky
 
Регистрация: 09.05.2009
Сообщений: 25
По умолчанию

Вот application main loop, если я тебя правильно понял:
Код:
while (GetMessage(&msg, NULL, 0, 0))
	{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
	}
Ничего не менял.

Существует управляющий класс GLCore, при создании экземпляра которого происходит инициализация OpenGL и регистрация класса окна:
Код:
GLCore::GLCore(HINSTANCE hInst)
{
	hInstance = hInst;

	//----------------------------GL Settings--------------------------------//
	glShadeModel(GL_SMOOTH);
	glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
	glClearDepth(1.0f);
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	
	WNDCLASSEX	wc;												
	wc.cbSize			= sizeof(WNDCLASSEX);
	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
	wc.lpfnWndProc		= (WNDPROC) WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= GetModuleHandle(NULL);
	wc.hIcon			= LoadIcon(NULL, MAKEINTRESOURCE(IDI_DEALS));
	wc.hIconSm		= LoadIcon(wc.hInstance, MAKEINTRESOURCE(IDI_SMALL));
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= NULL;									
	wc.lpszMenuName	= NULL;
	wc.lpszClassName	= szWindowClass;

	RegisterClassEx(&wc);
}
После создания каждого окна вызывается следующая функция:
Код:
void GLCore::ReSizeGLScene (GLsizei width, GLsizei height)			// Resize And Initialize The GL Window
{
	if (height==0)
		height=1;

	glViewport(0,0,width,height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0f,width,height,0.0f,-1.0f,1.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
Вроде все...
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
Koshmarovsky вне форума Ответить с цитированием
Старый 07.09.2010, 20:15   #12
Koshmarovsky
Пользователь
 
Аватар для Koshmarovsky
 
Регистрация: 09.05.2009
Сообщений: 25
По умолчанию

Уоу! Заработало!
Всю ResizeGLScene запихнул в DrawGLScene. ValidateRect() убрал, и в потоке вызываю UpdateWindow(hWnd) для всех окон. Все работает так, как я и хотел, но быстродействие заставляет желать лучшего...

В общем проблема решена методом научного тыка, сейчас буду курить мануалы, ибо надо понять, почему все происходит так, как происходит...

Однако от отдельного потока хочу избавиться. Сейчас, если его отключаю, то корректно рисуется только активное окно. Нужно, что бы прорисовывались все. Как такое возможно реализовать?

Как вариант, в обработке WM_PAINT в цикле прорисовывать все окна (их HWND у меня хранятся в векторе). Но высший разум подсказывает мне, что есть решение попроще.
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru

Последний раз редактировалось Koshmarovsky; 07.09.2010 в 20:23.
Koshmarovsky вне форума Ответить с цитированием
Старый 07.09.2010, 21:32   #13
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Поздравляю, конечно.

Но рекомендую поступить следующим образом:

ReSizeGLScene добавить не в Draw, а сразу после SetWindowLong

Код:
...
SetWindowLong(hWnd,GWL_USERDATA,(LONG)hRC);

wglMakeCurrent(hDC,hRC);

glShadeModel(GL_SMOOTH);
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

ReSizeGLScene(...);
Т.е. выполнить инициализацию в контексте каждого окна. Draw не менять, и не рассылать WM_PAINT (удалить UpdateWindow/RedrawWindow).

GL функции вызванные до создания и выбора текущего контекста ни на что не влияют (GLCore).

Да, если после убийства второго потока не рисуется, поставь RedrawWindow там где я говорил (десятый пост, наверное).

Последний раз редактировалось f.hump; 07.09.2010 в 21:47.
f.hump вне форума Ответить с цитированием
Старый 08.09.2010, 11:21   #14
Koshmarovsky
Пользователь
 
Аватар для Koshmarovsky
 
Регистрация: 09.05.2009
Сообщений: 25
По умолчанию

Ну все, я вроде допедрил, как все это работает.
RedrawWindow все же нужного эффекта не дает, так как она перерисовывает только одно окно - активное. Поступил следующим образом:
Код:
vector<HWND> GLCore::Windows;

//...

hWnd=CreateWindowEx(...);
Windows.push_back(hWnd);

//...

case WM_PAINT:
for (unsigned int i=0; i<Windows.size(); i++)
{
	hRC = (HGLRC)GetWindowLong(Windows[i], GWL_USERDATA);
	hDC = GetDC(Windows[i]);
	wglMakeCurrent(hDC,hRC);
	DrawGLScene();
	SwapBuffers(GetDC(Windows[i]));
}
break;
Инициализацию и ReSizeGLScene() так же перенес. Теперь все ок.
Спасибо за помощь =)
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru

Последний раз редактировалось Koshmarovsky; 08.09.2010 в 11:24.
Koshmarovsky вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGl macintoshka12 Общие вопросы C/C++ 2 21.04.2010 12:59
проблемы с opengl. elenza Помощь студентам 1 19.11.2009 22:54
Opengl Алексадр Компоненты Delphi 4 29.09.2009 17:23
OpenGL Paul_AG C++ Builder 20 14.09.2009 19:07
OpenGL yanl Компьютерное железо 0 16.11.2008 00:52