我需要一个没有标题栏、没有控制框、没有系统菜单和框架的窗口(所有这些功能都由单独的控件提供)。
我怀疑这应该与CreateWindowExA
的窗口样式参数有关dwStyle
,并且可能lpWindowName
与此处所述有关:https ://docs.microsoft.com/en-us/windows/desktop/winmsg/window-styles
这就是参数最初的样子:
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 并省略其余部分是行不通的,正如文档所暗示的那样:“窗口是重叠的窗口。重叠的窗口有一个标题栏和一个边框。”
(有趣的是,我完全能够在 VB.NET(甚至在 VB6)中通过将ControlBox
属性设置为False
然后使用删除标题栏来完成这项任务Text = ""
,所以我强烈怀疑在 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 编译。)