Ist es nur eine Wahl zwischen dem Flackern des Fensters und dem Löschen des Hintergrunds?
Posted: 14 Jan 2025, 10:51
Ich erstelle ein Win32-Layoutsystem. Ich habe festgestellt, dass die untergeordneten Fenster und Steuerelemente häufig flackern, wenn ich die Fenstergröße ändere, sodass ich in WM_ERASEBKGND FALSE zurückgebe. Wenn ich zu diesem Zeitpunkt die Fenstergröße erneut ändere, bleiben Spuren der untergeordneten Fenster zurück (ich weiß leider nicht, mit welchem Wort ich dieses Phänomen beschreiben soll).

Wie kann ich dafür sorgen, dass das Fenster nicht flackert und den Rest löschen? Hintergrund?
Hier ist mein Code:

Wie kann ich dafür sorgen, dass das Fenster nicht flackert und den Rest löschen? Hintergrund?
Hier ist mein Code:
Code: Select all
#include
#include
// Enabling Visual Styles
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
std::vector hWndBtn;
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE:
{
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button1"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button2"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button3"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button4"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button5"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
hWndBtn.push_back(CreateWindow(TEXT("BUTTON"), TEXT("Button6"), WS_VISIBLE | WS_CHILD, 100, 100, 300, 200, hWnd, NULL, NULL, NULL));
break;
}
case WM_ERASEBKGND: return FALSE;
case WM_PAINT:
{
break;
}
case WM_SIZE:
{
INT width = max(0, LOWORD(lParam));
INT height = max(0, HIWORD(lParam));
int y = 100;
int spacing = 30;
HDWP hDWP = BeginDeferWindowPos((int)hWndBtn.size());
for (int i = 0; i < hWndBtn.size(); ++i)
{
height = 50;
DeferWindowPos(
hDWP,
hWndBtn[i],
NULL,
100, y,
width - 200, height,
SWP_NOZORDER
);
y = y + height + spacing;
}
EndDeferWindowPos(hDWP);
break;
}
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, BOOL) {
WNDCLASS wc = { 0 };
wc.lpszClassName = TEXT("wndclass");
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpfnWndProc = WinProc;
RegisterClass(&wc);
HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, 0, 0, hInstance, 0);
if (hWnd == NULL) return 1;
ShowWindow(hWnd, SW_SHOWNORMAL);
MSG msg = { 0 };
while (GetMessage(&msg, 0, 0, 0)) {
DispatchMessage(&msg);
}
return 0;
}