[英]How can I remove a window's non-client area completely?
我需要一個沒有標題欄、沒有控制框、沒有系統菜單和框架的窗口(所有這些功能都由單獨的控件提供)。
我懷疑這應該可以與CreateWindowExA
的窗口樣式參數dwStyle
和lpWindowName
,如下所述: https : lpWindowName
這就是參數最初的樣子:
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class.
L"", // No window name (title text).
WS_OVERLAPPEDWINDOW, // Window style.
// Size and position.
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window.
NULL, // Menu.
hInstance, // Instance handle.
NULL // Additional application data.
);
但是,在dwStyle
,普通窗口樣式WS_OVERLAPPEDWINDOW
被定義為
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
WS_OVERLAPPED
為0x00000000L
。
簡單地提供 0 並省略其余部分是行不通的,正如文檔所暗示的那樣:“窗口是一個重疊的窗口。重疊的窗口有一個標題欄和一個邊框。”
(有趣的是,通過將ControlBox
屬性設置為False
然后使用Text = ""
刪除標題欄,我完全能夠在 VB.NET(甚至在 VB6)中完成此任務,因此我強烈懷疑在可能的情況下在VB中...)
我將如何在 C++ 中完成我的任務?
以防萬一需要WindowProc
來處理不同的消息,這里是它的簡約版本:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
(使用 VS 2017 編譯。)
僅使用WS_POPUP
樣式可以刪除頂級窗口的非客戶區:
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class.
L"", // No window name (title text).
WS_POPUP, // Window style.
// Size and position.
100, 100, 400, 300,
NULL, // Parent window.
NULL, // Menu.
hInstance, // Instance handle.
NULL // Additional application data.
);
請注意,用於大小和位置的CW_USEDEFAULT
僅對重疊窗口有效。 對於彈出窗口,您必須明確。
根據您的用例,此答案描述的技術可能更合適。 使用 DWM API,它允許您刪除非客戶區,但保留陰影以使窗口更好地從背景中脫穎而出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.