MFC自繪標題欄和邊框

2021-09-05 09:40:46 字數 1799 閱讀 3006

mfc視窗有標題欄和邊框的時候,重繪不是很方便,在onncpaint中重繪標題欄如果呼叫基類的onncpaint,自己的後面的重繪都不生效,如果不呼叫基類的onncpaint,win10上的mfc程式出現了win7風格的邊框,而且寬度還不能控制。

移除邊框

dword dw = ::getwindowlong(getsafehwnd(), gwl_style);

dw = dw & ~ws_caption;//取消標題欄

dw = dw & ~ws_thickframe;//取消拖動改變大小//不取消的話,自繪標題欄上面會有一條白邊而且覆蓋不了

::setwindowlong(getsafehwnd(), gwl_style, dw);

去除標題欄之後就要自繪標題欄了

步驟如下

1.去除邊框標題欄

2.重新設定標題欄、邊框大小(onnccalcsize)

3.設定標題欄響應區域(onnchittest)

4.重繪(多個地方需要重繪,但是可以呼叫統一繪製方法wm_move、wm_paint、wm_ncpaint、wm_ncactivate、wm_notify)

dword dw = ::getwindowlong(getsafehwnd(), gwl_style);

dw = dw & ~ws_caption;//取消標題欄

dw = dw & ~ws_thickframe;//取消拖動改變大小//不取消的話,自繪標題欄上面會有一條白邊而且覆蓋不了

::setwindowlong(getsafehwnd(), gwl_style, dw);

//取消邊框內的邊緣,也就是取消3d效果

dw = ::getwindowlong(getsafehwnd(), gwl_exstyle);

dw = dw & ~ws_ex_dlgmodalframe;

dw = dw & ~ws_ex_clientedge;

dw = dw & ~ws_ex_windowedge;

::setwindowlong(getsafehwnd(), gwl_exstyle, dw);

//建議使用成員變數的方式儲存各個屬性

void videodialog::onnccalcsize(bool bcalcvalidrects, nccalcsize_params* lpncsp)

onnccalcsize第0個元素的初始值是視窗大小,說是計算ncsize,實際上是設定客戶區大小,多餘的就是non-client的size

top就是標題欄的高度,也就是視窗top距離client-top的距離,其他就是左邊距、右邊距、下邊距

//建議使用成員變數,標題欄高度:40

lresult videodialog::onnchittest(cpoint point)

else

}

這裡就是當視窗發生事件時,計算當前座標屬於什麼區域,高度40以內返回標題欄區域,就可以在重繪標題欄的基礎上用標題欄拖動視窗了

lresult videodialog::windowproc(uint message, wparam wparam, lparam lparam)

return cdialogex::defwindowproc(message, wparam, lparam);

}void videodialog::drawtitlebar(cdc *pdc)

}

效果圖:

****,一上傳就卡死,反正親測通過

終結mfc標題欄重繪

1.如果需要加高標題欄 用於貼圖等 就要呼叫onnccalcsize追加部分空間 非客戶區間 cpp view plain copy void cmy2011082302dlg onnccalcsize bool bcalcvalidrects,nccalcsize params far lpncs...

自繪對話方塊標題欄

本例中將涉及到對話方塊標題欄的自繪,雙緩衝點陣圖的顯示以及位圖按鈕類的使用。1.標題欄自繪 2.雙緩衝顯示位圖 雙緩衝顯示點陣圖的原理網上介紹的比較多,主要思路如下 本例中的ctestbitmapshowdlg主測試類中位圖的顯示,以及ccolortitledlg標題欄重繪類中標題欄的貼圖操作都是使...

MFC非客戶區自繪標題欄的實現(不斷更新)

某些情況下需要在對話方塊標題欄上新增按鈕,在此mark下 環境 win7 vs2008 sp1 專案 mfc對話方塊 步驟 1.重寫方法 defwindowproc 1.1 h檔案新增 如下 a.virtual void dodataexchange cdataexchange pdx ddx dd...