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...