当我要调整在 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;
}
它创建一个透明矩形,显示它将扩展到的位置:
我想禁用它,因为我正在使用自定义无框架 GUI。
我尝试搜索这个透明矩形是如何调用的或者 WINAPI 创建它的内容,但我找不到它。
感谢对此的任何帮助。
基本上,玻璃板会展开成为父窗口,并且当窗口接触到屏幕边缘时,被拖动的窗口是分层窗口。
系统使用
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);
是不是这么简单:
CreateRectRgn(yourLeft, yourTop, yourRight, yourBottom)
并通过
将其设置到窗口SetWindowRgn(Handle, RGN, true)