我正在嘗試創建自定義的非客戶區。
所以我WM_NCPAINT在 WndProc 方法中處理訊息,并嘗試在非客戶區創建一個紅色的矩形,但我發現了兩個問題。
- 我在非客戶區繪制的矩形也覆寫了客戶區。
因此,為了遇到它,我RedrawWindow在WM_NCPAINT訊息末尾添加了函式,但我不確定這是個好主意。我還能做些什么來糾正這個問題?
- 我多次在調整視窗大小時得到了一些奇怪的結果。我只是不知道如何解釋它,但我嘗試
這是我到目前為止所取得的成就

但是如果我連續多次調整它的大小(比如 10 - 15),它就會得到這個

整張圖是視窗的截圖(第一個)。我不知道它怎么了。白色部分畫錯了,右邊和底部看起來像透明的,但它是一個視窗的所有截圖。(SS通過剪切工具)
所有滑鼠點擊都通過透明部分。
視窗大小調整得很好,但沒有在其中正確繪制,大小不正確。繪圖的大小設定為某個最大大小(不知道是什么,它是隨機的)。
代碼Windows Desktop Application C 和visual studio的Template自帶的默認代碼一樣。
剛剛添加了WM_NCPAINT訊息的自定義代碼。
case WM_NCPAINT:
{
HDC hdc = GetWindowDC(hWnd);
if (hdc) {
RECT frame = { 0 };
GetWindowRect(hWnd, &frame);
frame.right = frame.right - frame.left;
frame.bottom = frame.bottom - frame.top;
frame.left = 0;
frame.top = 0;
FillRect(hdc, &frame, CreateSolidBrush(RGB(255, 0, 0)));
ReleaseDC(hWnd, hdc);
RedrawWindow(hWnd, &frame, (HRGN)wParam, RDW_UPDATENOW);
}
return 0;
}
uj5u.com熱心網友回復:
IInspectable 的評論對我有幫助。
來自CreateSolidBrush:“當您不再需要該HBRUSH物件時,請呼叫 DeleteObject 函式將其洗掉。 ”您沒有這樣做,并且會泄漏HBRUSH每個WM_NCPAINT回呼。GDI 資源是您的系統必須提供的最有限的資源之一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/345292.html
