1

我需要一个没有标题栏、没有控制框、没有系统菜单和框架的窗口(所有这些功能都由单独的控件提供)。

我怀疑这应该与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 编译。)

4

1 回答 1

1

顶级窗口的非客户区可以通过仅使用以下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,它允许您删除非客户区,但保留投影以使窗口从背景中更加突出。

于 2018-09-21T15:54:45.553 回答