MoveWindow - und mein Prog stürzt ab??
-
hier (teilweise) der Code vom Child.
Das handle wird direkt aus der Klasse gezogen und sollte eigentlich stimmen.LRESULT CALLBACK C_Display::DisplayProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { C_Display *Ds = (C_Display*) GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_CREATE: return 0; case WM_CLOSE: return 0; case WM_SIZE: Ds->Resize (0,0,LOWORD(lParam), HIWORD(lParam)); return 0; case WM_DESTROY: return 0; default: return DefWindowProc (hWnd, message, wParam, lParam); } } void C_Display::Resize (int X, int Y, int W, int H) { XPos = X; YPos = Y; Width = W; Height = H; glViewport (XPos, YPos +10, Width, Height - 10); Refresh(); } void C_Display::Refresh(void) { /* draw the Object; */ glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glScalef(Height/Width, 1, 0); /* ToDo: Rotieren der Ansicht */ switch (Style) { case STYLE_POINTS: glBegin(GL_POINTS); break; case STYLE_LINES: glBegin(GL_LINES); break; default: glBegin(GL_TRIANGLES); break; } glColor3f(1.0,0,0); glVertex3f(0.0,1.0,0.0); glColor3f(0,1.0,0); glVertex3f(1.0,0,0.0); glColor3f(0,0,1.0); glVertex3f(-1.0,0,0.0); Object->ShowObject(0, ActAni, ActFrame); glEnd(); glPopMatrix(); SwapBuffers (hDC); }
Das Fenster wird so erstellt:
C_Display::C_Display(HWND P, int X, int Y, int W, int H, int S, int V, C_Objects *O) { WNDCLASS wc; hParent = P; Object = O; XPos = X; YPos = Y; Width = W; Height = H; ActAni = 0; ActFrame = 0; /* register window class */ wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.lpfnWndProc = DisplayProc; wc.hInstance = (HINSTANCE) GetWindowLong(hParent, GWL_HINSTANCE); wc.hIcon = NULL; wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)BLACK_BRUSH; wc.lpszClassName = "GLWindow"; wc.lpszMenuName = NULL; wc.style = CS_DBLCLKS; RegisterClass (&wc); /* create main window */ hWnd = CreateWindow ( "GLWindow", "", WS_CHILD | WS_VISIBLE, XPos, YPos , Width, Height , hParent, NULL,(HINSTANCE) GetWindowLong(hParent, GWL_HINSTANCE), NULL); /* enable OpenGL for the window */ SetWindowLong(hWnd, GWL_USERDATA, (long) this); EnableOpenGL (hWnd, &hDC, &hRC); Object->NewObject(); Resize(XPos, YPos, Width, Height); // Refresh(); }
cYa
DjR
-
Rufst du die Refresh-Funktion sonst irgendwo auch auf (also funktioniert diese?)
Versuche do mal in Resize glViewport() oder Refresh() wegzulassen, um den Fehler einzuschränken!
Wie genau sieht das abschmieren aus? Stürzt der Rechner ab? Fehlermeldung?!
-
Der Refresh ist in Resize drin und Resize wird beim Erstellen des Fensters aufgerufen. ergo: Das funktioniert.
Der Absturz kommt dann zustande, wenn ich das MoveWindow einbaue.
-
case WM_SIZE: if(IsWindow(Display->hWnd)) MoveWindow(Display->hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); return 0;
Wenn jetzt noch ein Absturz kommt, ist der Pointer "Display" ungültig (setzt voraus, daß der Absturz wirklich an dieser Stelle passiert).
-
hmm..
ich hab's ausprobiert und es funktionierte leider nichtwill sagen, dass Display->hWnd ein Fenster ist.
Hmm..
allerdings hab ich jetzt nochmal debuggt und plötzlich schmiert er mir beim Erstellen des ChildWondows ab.. kann mir einer das erklären??
[ Dieser Beitrag wurde am 18.01.2003 um 21:21 Uhr von DocJunioR editiert. ]
-
Hallo? Das hat dir doch schon MagiC Creator geraten: Ersetze ALLE return(0)'s durch break's. Dann sollte es klappen!
-
Ersetze ALLE return(0)'s durch break's.
Wozu soll das bitte gut sein? Das ist doch Quatsch.
-
Hmm, hast recht.
[EDIT] Wann genau sollte man Nachrichten an die DefWindowProc weiterleiten? [/EDIT]
[ Dieser Beitrag wurde am 19.01.2003 um 00:39 Uhr von WebFritzi editiert. ]
-
Wann genau sollte man Nachrichten an die DefWindowProc weiterleiten?
Immer dann, wenn Du als Reaktion auf eine Nachricht das Default-Verhalten benötigst.
-
Hmm.. wenn ich so drüber nachdenke, klar.
okay, werd ich tun.
Axo: die return 0s sind im Übrigen aus dem Template vom DevCpp 5.
Ich werd dsa wohl mal umbauen müssen - hatte drauf vertraut, dass die Franzosen wissen, was sie in ihre IDE einbauen..