WS_CHILD / WS_OVERLAPPED und openGl
-
Hallo Leute,
ich beschaeftige mich mit embedded WinMain in Tk-Containers und habe ein Problem.
Ich habe:
... WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_OWNDC | CS_PARENTDC | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_FEOUD); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = NULL; wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); ... hWnd = CreateWindow(szWindowClass, szTitle, WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, hWndParent, NULL, hInstance, NULL); ...Nun kan ich mit WS_CHILD oder mit WS_OVERLAPPEDWINDOW compilieren.
Zweiteres erzeugt ein zweites Fenster und ich sehe dort auch mein openGl-Zeug. Wenn ich es als WS_CHILD compiliere scheint etwas mit den hdc's nicht zu passen. Kann mir jemand einen Tipp geben?Woran kann es liegen, das es als WS_OVERLAPPEDWINDOW funzt, aber als WS_CHILD nicht?
MfG
-
ist dein hdc vom richtigen fensterhandle?
zeig doch mal deinen pixelformatdesciptor bzw. deinen wesentlichen initcode
-
Sag ob noch mehr noetig ist.
Das komische ist, das es als WS_OVERLAPPED funktioniert, aber wenn es als WS_CHILD eingebunden wird, dann geht es nicht.
Ich hab in WM_PAINT auch noch andere Paints drin, die in das selbe HWND gehen, und die landen dort auch. Im WS_OVERLAPPED landen diese DrawText... im WS_CHILD Frame und im WS_OVERLAPPEDWINDOW window.Also doppenlt, aber die openGl landen nur im Extra-fenster, und nicht doppelt.
OpenGl opengl; HWND hWnd; WinMain(...) { ... opengl = OpenGl(); ... } class OpenGl { public: OpenGl(); virtual ~OpenGl(); BOOL Init(HWND hWnd); void OnClose(); GLvoid resize(GLsizei, GLsizei); GLvoid initializeGL(GLsizei, GLsizei); GLvoid drawScene(GLvoid); private: BOOL bSetupPixelFormat(HDC); HWND hWnd; HDC ghDC; HGLRC ghRC; /* OpenGL globals, defines, and prototypes */ GLfloat latitude, longitude, latinc, longinc; GLdouble radius; GLvoid createObjects(); void polarView( GLdouble, GLdouble, GLdouble, GLdouble); }; BOOL OpenGl::Init(HWND hWnd) { hWnd = hWnd; ghDC = GetDC(hWnd); if (!bSetupPixelFormat(ghDC)) return FALSE; DWORD test2 = GetLastError(); ghRC = wglCreateContext(ghDC); DWORD test1 = GetLastError(); wglMakeCurrent(ghDC, ghRC); DWORD test = GetLastError(); return TRUE; } BOOL OpenGl::bSetupPixelFormat(HDC hdc) { PIXELFORMATDESCRIPTOR pfd, *ppfd; int pixelformat; ppfd = &pfd; ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); ppfd->nVersion = 1; ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; ppfd->dwLayerMask = PFD_MAIN_PLANE; ppfd->iPixelType = PFD_TYPE_COLORINDEX; ppfd->cColorBits = 8; ppfd->cDepthBits = 16; ppfd->cAccumBits = 0; ppfd->cStencilBits = 0; pixelformat = ChoosePixelFormat(hdc, ppfd); if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 ) { MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); return FALSE; } if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE) { MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); return FALSE; } return TRUE; } WndProc: ... case WM_CREATE: if(!opengl.Init(hWnd)) PostQuitMessage (0); GetClientRect(hWnd, &rt); opengl.initializeGL(rt.right, rt.bottom); break; case WM_MOVE: /* The frame has moved */ GetClientRect( hWnd, &rt ); InvalidateRect(hWnd,&rt,TRUE); break; case WM_SIZE: /* The frame changed size */ GetClientRect( hWnd, &rt ); opengl.resize(rt.right, rt.bottom); InvalidateRect(hWnd,&rt,TRUE); break; case WM_CLOSE: opengl.OnClose(); DestroyWindow (hWnd); break; case WM_PAINT: opengl.drawScene(); hdc = BeginPaint (hWnd, &ps); GetClientRect( hWnd, &rt ); DrawFocusRect(hdc,&rt); DrawText( hdc, "test", 4, &rt, DT_CENTER ); EndPaint( hWnd, &ps ); break; case WM_DESTROY: DestroyWindow(hWnd); PostQuitMessage( 0 ); break; default: CallWindowProc(lpPrevWndFunc,hWnd,message, wParam,lParam); return DefWindowProc( hWnd, message, wParam, lParam ); ...
-
Der Witz ist:
Im WS_OVERLAPPED habe ich also zwei Fenster. Das eine (Tcl/)Tk-Fenster und mein neues Fester(openGl). Das Tk-Fenster hat ein freien Frame in den das WS_CHILD passen soll.
Wenn ich jetzt mein Tk-Fenster verziehe, dann wird auch meine openGL-Szene in der groesse wie gewollt upgedateded und die Szene hat genau die Groesse wie der freie Frame.
Aber wenn ich nun WS_CHILD compiliere is nix mit openGL.