| PMG http://forum.pmg.org.ru/ |
|
| Рисование в дочернем окне через OpenGL ?? http://forum.pmg.org.ru/viewtopic.php?f=1&t=9407 |
Страница 1 из 1 |
| Автор: | Sid364 [ 13 июл 2012 19:44 ] |
| Заголовок сообщения: | Рисование в дочернем окне через OpenGL ?? |
У меня появились проблемы с этим, то есть я делаю все как для обычного окна, но оно получается белым и ничего не рисует ? в чем может быть проблема ? Есть какие то особенности рисования в дочернем окне ?? |
|
| Автор: | Sid364 [ 14 июл 2012 19:27 ] |
| Заголовок сообщения: | Re: Рисование в дочернем окне через OpenGL ?? |
ну вообщем я сначала регестрирую класс основного окна 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 = (HBRUSH)GetStockObject(WHITE_BRUSH);; wc.lpszMenuName = NULL; wc.lpszClassName = "Main Window"; if(!RegisterClass(&wc)) { MessageBox(0,"Failed To Register The Window Class. wc","Error",MB_OK|MB_ICONERROR); return FALSE; } main=CreateWindow("Main Window","Belphegor Engine 1.0",WS_VISIBLE | WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP,100,100,800,600,NULL,NULL,hInstance,NULL); ShowWindow(main,nCmdShow); UpdateWindow(main); потом на сообщение WM_CREATE создаю дочернее child = CreateWindow("static","CLASS", WS_CHILD | WS_VISIBLE |WS_CAPTION | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,10,10,400,300,main,NULL,hInst,NULL); ShowWindow(child,SW_SHOW); UpdateWindow(child); И вот WndProc Дочернего окна LRESULT CALLBACK WndChild(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { RECT Screen; // используется позднее для размеров окна GLuint PixelFormat; static PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры 1, // Номер версии (?) PFD_DRAW_TO_WINDOW |// Формат для Окна PFD_SUPPORT_OPENGL |// Формат для OpenGL PFD_DOUBLEBUFFER,// Формат для двойного буфера PFD_TYPE_RGBA, // Требуется RGBA формат 16, // Выбор 16 бит глубины цвета 0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?) 0, // нет буфера прозрачности 0, // Сдвиговый бит игнорируется (?) 0, // Нет буфера аккумуляции 0, 0, 0, 0, // Биты аккумуляции игнорируются (?) 16, // 16 битный Z-буфер (буфер глубины) 0, // Нет буфера траффарета 0, // Нет вспомогательных буферов (?) PFD_MAIN_PLANE, // Главный слой рисования 0, // Резерв (?) 0, 0, 0 // Маски слоя игнорируются (?) }; switch(msg) { case WM_CREATE: hDC = GetDC(child); // Получить контекст устройства для окна PixelFormat = ChoosePixelFormat(hDC, &pfd); // Найти ближайшее совпадение для нашего формата пикселов if (!PixelFormat) { MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); // Это сообщение говорит, что программа должна завершится break; // Предтовращение повтора кода } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) { MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } hRC = wglCreateContext(hDC); if(!hRC) { MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } if(!wglMakeCurrent(hDC, hRC)) { MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR); //PostQuitMessage(0); break; } GetClientRect(hWnd, &Screen); InitGL(400, 300); break; case WM_DESTROY: case WM_CLOSE: ChangeDisplaySettings(NULL, 0); wglMakeCurrent(hDC,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; } |
|
| Автор: | MagicWolf [ 16 июл 2012 11:25 ] |
| Заголовок сообщения: | Re: Рисование в дочернем окне через OpenGL ?? |
выложи весь проект, пожалуйста. |
|
| Автор: | Sid364 [ 16 июл 2012 15:05 ] |
| Заголовок сообщения: | Re: Рисование в дочернем окне через OpenGL ?? |
Код: #include "stdafx.h"
#include "Belphegor Engine.h" #include <windows.h> #include "KWnd.h" #include "resource.h" #include "resource1.h" #include "windowsx.h" #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); DLGPROC WndChild(HWND, UINT, WPARAM, LPARAM); GLvoid DrawGLScene(GLvoid); static HGLRC hRC; static HDC hDC; HWND main, child; HINSTANCE hInst; //////////////////////////////////////////////////////////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { hInst=hInstance; MSG msg; WNDCLASS wc, wc1; 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 = (HBRUSH)GetStockObject(WHITE_BRUSH);; wc.lpszMenuName = NULL; wc.lpszClassName = "Main Window"; if(!RegisterClass(&wc)) { MessageBox(0,"Failed To Register The Window Class. wc","Error",MB_OK|MB_ICONERROR); return FALSE; } main=CreateWindow("Main Window","Belphegor Engine 1.0",WS_VISIBLE | WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP,100,100,800,600,NULL,NULL,hInstance,NULL); ShowWindow(main,nCmdShow); UpdateWindow(main); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } DrawGLScene(); SwapBuffers(hDC); return msg.wParam; } GLvoid InitGL(GLsizei Width, GLsizei Height) // Вызвать после создания окна GL { glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // Очистка экрана в черный цвет glClearDepth(1.0); // Разрешить очистку буфера глубины glDepthFunc(GL_LESS); // Тип теста глубины glEnable(GL_DEPTH_TEST);// разрешить тест глубины glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции glLoadIdentity(); // Сброс матрицы проекции gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Вычислить соотношение геометрических размеров для окна glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели } 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(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очистка Экрана и буфера глубины glLoadIdentity(); // Сброс просмотра glTranslatef(-1.5f,0.0f,-18.0f); // Сдвинемся влево на 1.5 единицы и // в экран на 6.0 glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 1.0f, 0.0f); // Вверх glVertex3f(-1.0f,-1.0f, 0.0f); // Слева снизу glVertex3f( 1.0f,-1.0f, 0.0f); // Справа снизу glEnd(); glTranslatef(3.0f,0.0f,0.0f); // Сдвинем вправо на 3 единицы glBegin(GL_QUADS); glVertex3f(-1.0f, 1.0f, 0.0f); // Слева вверху glVertex3f( 1.0f, 1.0f, 0.0f); // Справа вверху glVertex3f( 1.0f,-1.0f, 0.0f); // Справа внизу glVertex3f(-1.0f,-1.0f, 0.0f); // Слева внизу glEnd(); } DLGPROC WndChild(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hRenderArea = GetDlgItem(hWnd, IDC_STATIC); RECT Screen; // используется позднее для размеров окна GLuint PixelFormat; static PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры 1, // Номер версии (?) PFD_DRAW_TO_WINDOW |// Формат для Окна PFD_SUPPORT_OPENGL |// Формат для OpenGL PFD_DOUBLEBUFFER,// Формат для двойного буфера PFD_TYPE_RGBA, // Требуется RGBA формат 16, // Выбор 16 бит глубины цвета 0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?) 0, // нет буфера прозрачности 0, // Сдвиговый бит игнорируется (?) 0, // Нет буфера аккумуляции 0, 0, 0, 0, // Биты аккумуляции игнорируются (?) 16, // 16 битный Z-буфер (буфер глубины) 0, // Нет буфера траффарета 0, // Нет вспомогательных буферов (?) PFD_MAIN_PLANE, // Главный слой рисования 0, // Резерв (?) 0, 0, 0 // Маски слоя игнорируются (?) }; switch(msg) { case WM_INITDIALOG: hDC = GetDC(hRenderArea); // Получить контекст устройства для окна PixelFormat = ChoosePixelFormat(hDC, &pfd); // Найти ближайшее совпадение для нашего формата пикселов if (!PixelFormat) { MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); // Это сообщение говорит, что программа должна завершится break; // Предтовращение повтора кода } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) { MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } hRC = wglCreateContext(hDC); if(!hRC) { MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR); PostQuitMessage(0); break; } if(!wglMakeCurrent(hDC, hRC)) { MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR); //PostQuitMessage(0); break; } else { MessageBox(0,"IT IS OK","OK",MB_OK|MB_ICONERROR); } GetClientRect(hRenderArea, &Screen); InitGL(400, 300); break; case WM_DESTROY: case WM_CLOSE: ChangeDisplaySettings(NULL, 0); wglMakeCurrent(hDC,NULL); wglDeleteContext(hRC); ReleaseDC(hRenderArea,hDC); PostQuitMessage(0); break; } return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: child = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1), main, (DLGPROC) WndChild); break; case WM_CLOSE: DestroyWindow(hWnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; } |
|
| Автор: | MagicWolf [ 18 июл 2012 11:38 ] |
| Заголовок сообщения: | Re: Рисование в дочернем окне через OpenGL ?? |
Если можно просто весь проект с *.vcproj и исходником в виде архива. Чтобы мог у себя на компе разархивировать, скомпилировать, посмотреть что к чему... |
|
| Автор: | MagicWolf [ 19 июл 2012 12:31 ] |
| Заголовок сообщения: | Re: Рисование в дочернем окне через OpenGL ?? |
Попробывал скомпилировать код - не получилось... А так анализировать, что не правильно - довольно сложно. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|