簡體   English   中英

處理 ON_WM_NCPAINT() 消息和 OnNCPaint() 覆蓋的問題。 (覆蓋默認 MFC window 邊框)[2020]

[英]Issues with handling ON_WM_NCPAINT() message and OnNCPaint() override. (Overriding default MFC window border) [2020]

我正在嘗試為我的 Windows 應用程序創建一個“暗模式”主題,並且在覆蓋 OnNcPaint() function 時遇到了一些不一致的問題。 請原諒那個巨大的紅色盒子。 我只是以這種方式着色它以顯示問題。

這是我最初的 function:

void CSoftwareDlg::OnNcPaint() {
    Default(); //I can also use "CDialgoEx::OnNcPaint();" here for the same result because it just calls "Default..."

    CDC* pDC = GetWindowDC();
    CRect rect;
    GetWindowRect(&rect);
    rect.top = 0;
    rect.left = 0;
    rect.bottom = rect.Size().cy;
    rect.right = rect.Size().cx;
    pDC->FillRect(rect, &m_brushRed);
    
    ReleaseDC(pDC);
}

和(通常的)結果: 默認

我可以通過刪除對Default(); 沒有默認值

...但是任何時候 window 被移動(或重繪我猜): 邊框重繪自身

我還可以添加一個Sleep(1000); 達到一些不同的結果,但不值得張貼圖片。 最終......我的覆蓋並不是真正的“覆蓋”,因為它應該基於我看過的大量示例代碼。 我知道Default(); 是某種線程回調 function,但我不知道如何進一步解決此問題。

我是否需要等待Default(); 命令? 我是否需要將OnNcPaint()實現為某種回調 function? 我需要覆蓋其他功能嗎?

正如@dxiv 所說,請處理WM_NCACTIVATE消息,

像這樣(win32下),

 case WM_NCACTIVATE:
    {
        // Paint the non-client area now, otherwise Windows will paint its own
        RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW);
    }
        break;

不確定您的客戶區域是否也需要保持相同的顏色。

如有必要,您可以額外處理WM_ERASEBKGND消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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