gpt4 book ai didi

c++ - 如何制作玻璃背景的 window ?

转载 作者:行者123 更新时间:2023-11-30 01:47:11 25 4
gpt4 key购买 nike

我正在尝试制作一个带有玻璃背景的窗口,但它不起作用。查看我的代码:

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

这个窗口是我正在尝试做的,但有一个问题。当我移动窗口时,它会闪烁。为什么会闪烁?

最佳答案

有几件事你应该改变:

当你处理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,因为您已完成删除。

删除时要使用的 HDCwParam 中传递,因此请使用它而不是窗口 DC。

case WM_ERASEBKGND: {
RECT rect;
GetClientRect(hWnd, &rect);
FillRect((HDC)(wParam), &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));
return(1);
}

关于c++ - 如何制作玻璃背景的 window ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com