我正在尝试制作一个带有玻璃背景的窗口,但它不起作用。看我的代码:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_ERASEBKGND: {
RECT rect;
GetClientRect(hWnd, &rect);
FillRect(GetDC(hWnd), &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));
return(0);
} case WM_PAINT: {
RECT rect;
GetClientRect(hWnd, &rect);
rect.bottom = 262;
FillRect(GetDC(hWnd), &rect, (HBRUSH)COLOR_WINDOW);
return(0);
} case WM_CREATE: {
if (IsWindowsVistaOrGreater()) {
BOOL IsCompositionEnabled = FALSE;
DwmIsCompositionEnabled(&IsCompositionEnabled);
if (IsCompositionEnabled) {
MARGINS margins = {0, 0, 0, 0};
margins.cyBottomHeight = 100;
HRESULT hr = DwmExtendFrameIntoClientArea(hWnd, &margins);
if (SUCCEEDED(hr)) {
}
}
}
return(0);
} case WM_CLOSE: {
DestroyWindow(hWnd);
return(0);
} case WM_DESTROY: {
PostQuitMessage(0);
return(0);
} default: {
return(DefWindowProc(hWnd, message, wParam, lParam));
}
}
}
此代码显示以下窗口:See the image
这个窗口正是我想要做的,但是有一个问题。当我移动窗口时,它会闪烁。为什么会眨眼?
答案 0 :(得分:4)
你应该改变一些事情:
当您处理WM_PAINT
时,您应该致电BeginPaint
获取您的绘画的DC和其他信息,然后在完成后致电EndPaint
。这为您提供了一个DC,可以将您的绘画限制在所需的剪裁区域,并防止闪烁。
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect;
GetClientRect(hWnd, &rect);
rect.bottom = 262;
FillRect(hdc, &rect, (HBRUSH)COLOR_WINDOW);
EndPaint(hWnd, &ps);
return(0);
}
您还应该从WM_ERASEBKGND
返回1,因为您已完成删除。
HDC
中传递时使用的wParam
使用而不是窗口DC。
case WM_ERASEBKGND: {
RECT rect;
GetClientRect(hWnd, &rect);
FillRect((HDC)(wParam), &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));
return(1);
}