C++ 如何删除窗口';什么是非客户区?

C++ 如何删除窗口';什么是非客户区?,c++,winapi,nonclient-area,C++,Winapi,Nonclient Area,我需要一个没有标题栏、没有控制框、没有系统菜单和框架的窗口(所有这些功能都由单独的控件提供)。 我怀疑这可能与CreateWindowExA的窗口样式参数dwStyle以及可能的lpWindowName有关,如下所述: 这是参数最初的样子: HWND hwnd = CreateWindowEx( 0, // Optional window styles. CLASS_NAME, //

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

我怀疑这可能与
CreateWindowExA
的窗口样式参数
dwStyle
以及可能的
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_overlapped window
定义为

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
WS\u重叠的
0x00000000L

仅仅提供0而忽略其余部分是行不通的,正如文档所暗示的:“窗口是一个重叠窗口。重叠窗口有一个标题栏和一个边框。”

(有趣的是,通过将
ControlBox
属性设置为
False
,然后使用
Text=”“
删除标题栏,我完全能够在VB.NET(甚至在VB6)中完成此任务,因此我强烈怀疑在VB中可能的情况下……)

< >我在C++中如何完成任务?<强> < /p>
以防需要使用
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\u弹出窗口
样式即可删除顶级窗口的非客户端区域:

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\u使用默认值
仅对重叠窗口有效。对于弹出窗口,您必须明确


根据您的用例,所描述的技术可能更合适。使用DWM API,它允许您删除非客户端区域,但保留下拉阴影,以使窗口更好地从背景中脱颖而出。

WS\u弹出窗口可能适合您@不幸的是,它没有退休。也许我还应该显示我的WindowProc,以防我没有捕获到所需的消息。现在更新。正如@RetiredInja指出的,无边框/无框窗口的装饰应该是
WS\u POPUP
。如果我提醒正确,VS2017生成的默认windows类将背景颜色设置为
(color\u WINDOW+1)
,并且您正在使用color
(color\u WINDOW+1)
绘制矩形。…
WS\u POPUP
正常工作。它在您的情况下不起作用,因为您仍然有
CW\u usefault
参数,这些参数仅对重叠窗口有效。“如果为弹出窗口或子窗口指定了CW_USEDEFAULT,则nWidth和nHeight设置为零。”,这将删除边框,但保留放置阴影。