PMG https://forum.pmg.org.ru/ |
|
Второстепенное OpenGl окно внутри главного OpenGl окна https://forum.pmg.org.ru/viewtopic.php?f=1&t=7190 |
Страница 1 из 1 |
Автор: | bad_duck [ 04 ноя 2009 22:45 ] |
Заголовок сообщения: | Второстепенное OpenGl окно внутри главного OpenGl окна |
Добрый вечер! Я пытаюсь создать второстепенное OpenGl окно внутри главного OpenGl окна, но возникает ошибка при регистрации этого окна. Код, конечно же, взят из уроков nehe. Я так думаю нужно создать новые экземпляры этих классов. Также я создал WndProcTEX Код: HDC hDC=NULL, hDCTEX=NULL; HGLRC hRC=NULL, hRCTEX=NULL; HWND hWnd=NULL, hWndTEX=NULL; HINSTANCE hInstance, hInstanceTEX; Вот код создания второстепенного окна Код: BOOL CreateGLWindowTEX(char* title, int width, int height, int bits) { GLuint PixelFormat; WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect; WindowRect.left=(long)0; WindowRect.right=(long)width; WindowRect.top=(long)0; WindowRect.bottom=(long)height; hInstanceTEX = GetModuleHandle(NULL); //wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProcTEX; wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data wc.hInstance = hInstanceTEX; wc.hIcon = LoadIcon(hInstanceTEX, MAKEINTRESOURCE(IDI_ICON1)); //LoadIcon(NULL, IDC_APP_ICO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "OpenGLTEX"; if (!RegisterClass(&wc)) { MessageBox(hWndTEX,"Failed To Register The Window Class.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } и тут эта ошибка. Не пойму в чем проблема на всякий случай код основного окна Код: BOOL CreateGLWindow(char* title, int width, int height, int bits)
{ GLuint PixelFormat; INITCOMMONCONTROLSEX InitCommonControl; WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values WindowRect.left=(long)0; // Set Left Value To 0 WindowRect.right=(long)width; // Set Right Value To Requested Width WindowRect.top=(long)0; // Set Top Value To 0 WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height hInstance = GetModuleHandle(NULL); //wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; // Redraw On Size, And Own DC For Window. wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //LoadIcon(NULL, IDC_APP_ICO); //wc.hIconSm = NULL;//LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = (LPCTSTR) IDR_MENU; wc.lpszClassName = "OpenGL"; //EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DMsaved); if (!RegisterClass(&wc)) //if (!RegisterClassEx(&wc)) { MessageBox(hWnd,"Failed To Register The Window Class.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //WS_DLGFRAME; dwStyle=WS_OVERLAPPEDWINDOW; AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window "OpenGL", // Class Name title, // Window Title dwStyle | // Defined Window Style WS_CLIPSIBLINGS | // Required Window Style WS_CLIPCHILDREN, // Required Window Style 0, 0, // Window Position WindowRect.right-WindowRect.left, // Calculate Window Width WindowRect.bottom-WindowRect.top, // Calculate Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL))) // Dont Pass Anything To WM_CREATE { KillGLWindow(); // Reset The Display MessageBox(hWnd,"Ошибка при создании окна","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be { sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor 1, // Version Number PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format bits, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored 0, // No Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored 16, // 16Bit Z-Buffer (Depth Buffer) 0, // No Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context? { KillGLWindow(); MessageBox(hWnd,"Can't Create A GL Device Context.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) { KillGLWindow(); MessageBox(hWnd,"Can't Find A Suitable PixelFormat.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format? { KillGLWindow(); MessageBox(hWnd,"Can't Set The PixelFormat.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context? { KillGLWindow(); MessageBox(hWnd,"Can't Create A GL Rendering Context.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context { KillGLWindow(); MessageBox(hWnd,"Can't Activate The GL Rendering Context.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } MyToolBar(hWnd); /*InitCommonControl.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCommonControl.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&InitCommonControl); CreateStatusWindow(WS_CHILD|WS_VISIBLE, controlText, hWnd,ID_StatusBar); */ ShowWindow(hWnd,SW_SHOW); SetForegroundWindow(hWnd); SetFocus(hWnd); SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); Reshape(width, height); if (!Init()) { KillGLWindow(); MessageBox(hWnd,"Initialization Failed.","Ошибка",MB_OK|MB_ICONEXCLAMATION); return FALSE; } return TRUE; } |
Автор: | bad_duck [ 05 ноя 2009 11:05 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
о, нашел маленькую ошибку. Но в итоге получилось что прога просто вырубается. Получается что нельзя создать 2 окна? Мне просто нужно создать что-то типа диалоговского окна (чтобы оно принадлежало родителю), но при этом чтобы в нем был реализован opengl и можно было что-нибудь отрисовывать. |
Автор: | MagicWolf [ 05 ноя 2009 17:50 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
RegisterClass(&wc) - в этом! Ты уже зарегистировал этот класс окна, повторно его регистрировать не надо. |
Автор: | bad_duck [ 05 ноя 2009 18:54 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
ага, понятно. Теперь создалось окно (в котором просто цвет фона и когда вожу окно - отрисовываются части других окон), хотя в WndProcTEX у меня есть код отрисовки. И в добавок родительское не отвечает. Получается что и это не надо писать? Код: wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProcTEX; wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data wc.hInstance = hInstanceTEX; wc.hIcon = LoadIcon(hInstanceTEX, MAKEINTRESOURCE(IDI_ICON1)); //LoadIcon(NULL, IDC_APP_ICO); //wc.hIconSm = NULL;//LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL;//(LPCTSTR) IDR_MENU; wc.lpszClassName = "OpenGL"; Если этот код не писать, то как тогда задать, что нужно использовать этому окну WndProcTEX, а то мне кажется что оно использует wndproc родительского окна и поэтому не отвечает. Но тогда не понятно почему на нем ничего не отрисовывается... |
Автор: | MagicWolf [ 05 ноя 2009 19:09 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
Использовать wndproc родительского окна можно только hWnd должно быть не от родительского окна. |
Автор: | bad_duck [ 05 ноя 2009 19:27 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
так а где мне указывать какое hwnd нужно использовать? |
Автор: | MagicWolf [ 06 ноя 2009 13:35 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
По идее когда windows вызывает wndproc, то он передает ей hwnd окна, для которого wndproc вызвана. |
Автор: | bad_duck [ 06 ноя 2009 14:10 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
ну ладно тогда... Сделаю лучше разделение родительского экрана 4 части... |
Автор: | MagicWolf [ 07 ноя 2009 11:29 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
Тоже хорошая идея, но так я вроде делал несколько окон и вроде работало... |
Автор: | bad_duck [ 09 ноя 2009 19:37 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
MagicWolf, у меня еще вопрос: Почему в редакторе диалогов в 2008 вижуалке все кнопочки и рамки современные (под тему моего оформления XP), а когда компилирую, они становятся как в 98 винде? Дело я так понимаю в коде создания окна, потому что если использовать стандартные готовые проекты, то там всё нормально. |
Автор: | MagicWolf [ 09 ноя 2009 20:10 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
Скорее всего надо использовать интерфейс от .Net. Увы . Вот книга как использовать интерфейс .Net в С++: http://mirknig.com/knigi/1181216511-cc- ... shhix.html |
Автор: | bad_duck [ 09 ноя 2009 20:29 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
просмотрел книжку, получается единственный вариант - формы? Както не хочется все переделывать |
Автор: | MagicWolf [ 10 ноя 2009 20:17 ] |
Заголовок сообщения: | Re: Второстепенное OpenGl окно внутри главного OpenGl окна |
Ну что поделать ... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |