2016-07-25 23 views
0

Ich habe vier Fenster, die ein Elternfenster und drei untergeordnete Fenster sind. Ich möchte zwei dieser Kinderfenster erstellen, um Dinge zu zeichnen. Das erste unterordnete Fenster verwendet OpenGL und das zweite unterordnete Fenster verwendet GDI. Wenn ich nur ein paar Sachen in mein OpenGL-Fenster zeichne und alles funktioniert, aber wenn ich versuche, etwas anderes in meinem GDI-Fenster zu zeichnen (oder einfach zu versuchen, WM_PAINT-Nachricht zu verarbeiten), werden diese untergeordneten Fenster merkwürdig. Erstens werden einige Teile (wie Knöpfe, Statiken, Titelleiste) meines dritten Kindfensters fehlen. Zweitens, wenn ich versuche, eines dieser Fenster zu verkleinern, werden ein oder zwei untergeordnete Fenster fehlen. Aber sobald ich auf diese Fenster klicke, sind sie wieder da. Drittens, PeekMessage funktioniert nicht mehr, es gibt immer einen FALSCH zurück, MessageBox scheint nicht richtig zu funktionieren (ich kann das Popup-Fenster nicht sehen, aber ich kann den Ton hören).Wie kann ich OpenGL und GDI beide zur gleichen Zeit richtig arbeiten lassen?

Mein drittes Kind Fenster gerade erstellt. enter image description here

Nachdem ich es anklicke. enter image description here

Ich dachte, es könnte etwas mit der Verarbeitung der Nachricht nicht stimmen, aber ich kann nicht herausfinden, was tatsächlich passiert. Hat hier jemand irgendwelche Vorschläge?

Nachricht Loop:

MSG msg; 


DWORD dwLast; 
DWORD dwCurrent; 
DWORD dwInterval = 20;//50 FPS 1000/50 
dwLast = GetTickCount(); 

while (1) { 

    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == FALSE) 
    { 
     dwCurrent = GetTickCount(); 
     if (dwCurrent - dwLast < dwInterval) 
      continue; 

     SendMessage(Handle_Child_Demo, WM_PAINT, 0, 0); 

     dwLast = dwCurrent; 
    } 
    if (GetMessage(&msg, NULL, 0, 0) != TRUE) { 
     break; 
    } 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

ich nicht MDI bin mit meinem Kind Fenster zu schaffen, ich Create nur verwendet, um alle Fenster meines Kindes zu schaffen, und ich denke, dass etwas nicht stimmt mit ihm sein müssen, was denn sonst tun Ich muss tun, um sicherzustellen, dass diese Kinderfenster ordnungsgemäß funktionieren?

+0

anderes Fenster ist anderer Thread ... Sie müssen also einen separaten OpenGL-Kontext für jedes GL-Fenster haben und 'wglMakeCurrent' verwenden, um zwischen den Kontexten richtig zu wechseln (bei Activate- und bei Exit-Events). Auch GDI und visuelle WinAPI-Aufrufe müssen aufgerufen werden aus Hauptgewinde des Zielfensters (WndProc) sonst komische Dinge passieren, auch in nicht verwandten Code ... wie zufällige Ausnahme gfx Fehler abstürzt ... BTW können Sie GDI und GL im selben Fenster kombinieren ohne Probleme ... einfach sicherstellen, dass Updates nicht zur falschen Zeit neu zu streichen gezwungen sind. – Spektre

+0

Die wirklichen Probleme beginnen, wenn Sie ältere Intel Grafikkarten/Treiber bekommen sehen, siehe [Was ist die richtige OpenGL-Initialisierung auf Intel HD 3000?] (Http://stackoverflow.com/q/19099162/2521214) – Spektre

+0

Ich habe nur einen GL Fenster, und das ganze Programm verwendet nur einen Thread. Ich verwende wglMakeCurrent (DC, GL), wenn es beginnt, zu zeichnen, und wglMakeCurrent (NULL, NULL) zu verwenden, wenn es gestoppt wurde. – markable

Antwort

-2

MUSS MDI verwenden, um untergeordnete Fenster zu erstellen, denken Sie daran, verwenden Sie MDI !!!! Oder es wird etwas wirklich Seltsames geben, das ist so, weil diese Nachrichten nicht richtig verarbeitet werden und MDI uns dabei helfen wird.