代码之家  ›  专栏  ›  技术社区  ›  Herb

如何完全删除窗口的非客户端区域?

  •  1
  • Herb  · 技术社区  · 6 年前

    我需要一个没有标题栏的窗口,没有控制框,没有系统菜单,没有框架(所有的功能都提供了单独的控制)。

    我怀疑这可能与 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而忽略其余部分是行不通的,正如文档所暗示的:“窗口是一个重叠的窗口。重叠窗口有标题栏和边框。“

    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);
    }
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   zett42    6 年前

    仅使用 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 对于大小和位置,仅对重叠窗口有效。对于弹出窗口,您必须明确。

    根据您的用例 this answer 可能更合适。使用dwmapi,它允许您删除非客户机区域,但是