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/