W
Hallo,
ich habe folgendes Problem:
Ich habe folgenden Code für das Registrieren einer Window-Class (den Code zum Erstellen des Fensters kann ich ebenfalls posten, wenn es bei der Problemlösung hilft):
WNDCLASSEX windowClass;
ZeroMemory (&windowClass, sizeof (WNDCLASSEX));
windowClass.cbSize = sizeof (WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
windowClass.lpfnWndProc = (WNDPROC)(WAI_WindowProc);
windowClass.hInstance = hInstance;
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
windowClass.lpszClassName = className;
if (!RegisterClassEx (&windowClass))
[...]
Bisher sah der Code zum Resizen im WindowProc folgendermaßen aus (und funktionierte auch):
case WM_SIZE:
switch (wParam)
{
case SIZE_RESTORED:
GLI_ReshapeGL (LOWORD (lParam), HIWORD (lParam)); // Kapselung der entsprechenden GL-Funktion
[...]
return 0;
}
Nun, das, was ich unschön fand, war, dass beim Resizen nur der graue Hintergrund des oben definierten Brushs angezeigt wird. Um dies zu beseitigen, änderte ich den Code zum Resizen folgendermaßen:
case WM_SIZE:
switch (wParam)
{
case SIZE_RESTORED:
GLI_ReshapeGL (LOWORD (lParam), HIWORD (lParam)); // Kapselung der entsprechenden GL-Funktionen (Viewport, Projektionsmatrix)
[...]
Draw();
SwapBuffers(window->hDC);
return 0;
}
Nun trat das Problem auf, dass ein Flickern zwischen grauem Hintergrund und per OpenGL gezeichnetem auftritt (das per OGL gezeichnete wird immer Millisekunden später durch grauen Hintergrund (der definierte Brush) überdeckt).
Auf folgende Lösungen kam ich:
Ersetzen von
windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
durch
windowClass.hbrBackground = 0;
Problem: da in Zukunft neben dem OpenGL-Zeug nicht auszuschließen ist, dass auch ein paar Windows-Widgets gezeichnet werden (es ist kein Spiel, sondern eine Anwendung), ist dieses Verhalten unerwünscht.
Ersetzen von
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
durch
windowClass.style = CS_OWNDC;
.
Problem hier: mir ist nicht wirklich klar, was das für Konsequenzen hat. Auf jeden Fall empfehlen alle mir bekannten OGL-Tutorials CS_HREDRAW | CS_VREDRAW zu setzen.
Ist euch ein besserer Weg bekannt? Wenn nicht: mit welchen Konsequenzen, von denen ich besser wissen sollte, muss ich bei Methode 2 rechnen?