如何制作一个带玻璃背景的窗户?

时间:2015-08-10 02:44:23

标签: c++ winapi

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

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

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

1 个答案:

答案 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);
}
相关问题