簡體   English   中英

如何完全刪除窗口的非客戶區?

[英]How can I remove a window's non-client area completely?

我需要一個沒有標題欄、沒有控制框、沒有系統菜單和框架的窗口(所有這些功能都由單獨的控件提供)。

我懷疑這應該可以與CreateWindowExA的窗口樣式參數dwStylelpWindowName ,如下所述: 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_OVERLAPPED0x00000000L

簡單地提供 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM