如何禁用在调整窗口大小时创建的透明框架?

问题描述 投票:0回答:2

当我要调整在 Windows/c++ 上创建的简单 GUI 的大小时

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {

    LoadStringW(hInstance, IDC_PROJECT2, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    if (!InitInstance (hInstance, nCmdShow))
        return FALSE;

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJECT2));

    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0)){
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

它创建一个透明矩形,显示它将扩展到的位置:

v

我想禁用它,因为我正在使用自定义无框架 GUI。

我尝试搜索这个透明矩形是如何调用的或者 WINAPI 创建它的内容,但我找不到它。

感谢对此的任何帮助。

c++ windows winapi
2个回答
0
投票

其原理与玻璃板类似。 enter image description here

基本上,玻璃板会展开成为父窗口,并且当窗口接触到屏幕边缘时,被拖动的窗口是分层窗口。

系统使用

SetLayeredWindowAttributes
使玻璃片透明,拖动的窗口不受
WS_POPUP
参数影响。

文档解释了如何实现透明和去透明。

要再次使该窗口完全不透明,请通过调用

WS_EX_LAYERED
删除
SetWindowLong
位,然后要求窗口重新绘制。删除该位是为了让系统知道它可以释放一些与分层和重定向相关的内存。代码可能如下所示:

// Remove WS_EX_LAYERED from this window styles
SetWindowLong(hwnd, 
              GWL_EXSTYLE,
              GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);

// Ask the window and its children to repaint
RedrawWindow(hwnd, 
             NULL, 
             NULL, 
             RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

我写了一个示例,经过测试确实有效。 enter image description here


0
投票

是不是这么简单:

CreateRectRgn(yourLeft, yourTop, yourRight, yourBottom)

并通过

将其设置到窗口

SetWindowRgn(Handle, RGN, true)

© www.soinside.com 2019 - 2024. All rights reserved.