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

2021-07-25 22:09:55 字數 3762 閱讀 2297

某些情況下需要在對話方塊標題欄上新增按鈕,在此mark下:

環境:win7 + vs2008 + sp1

專案:mfc對話方塊

步驟:1.重寫方法:defwindowproc

1.1 .h檔案新增**如下:

a.  virtual void dodataexchange(cdataexchange* pdx);    // ddx/ddv 支援

// 新增:

virtual lresult defwindowproc(uint message, wparam wparam, lparam lparam);

b.   重繪方法宣告:

void drawtitlebar(cdc *pdc);

c.   按鈕標識

crect m_rtbuttexit;    // 關閉按鈕位置

crect m_rtbuttmax;    // 最大化按鈕位置

crect m_rtbuttmin;    // 最小化按鈕位置

crect m_rtbutthel;    // 幫助按鈕

crect m_rticon;        // 圖示位置

1.2  .cpp檔案中實現:

lresult ctestmywnddlg::defwindowproc(uint message, wparam wparam, lparam lparam)

return lrst;

} 其中 drawtitlebar方法如下: 

// 重繪標題欄

void ctestmywnddlg::drawtitlebar(cdc *pdc)

}

2. 新增視窗訊息onnclbuttondown - 非客戶端滑鼠左鍵按下事件

2.1 .h標頭檔案中:

afx_msg void onnclbuttondown(uint nhittest, cpoint point);

2.2 .cpp 檔案實現:

void ctestmywnddlg::onnclbuttondown(uint nhittest, cpoint point)

else if (m_rtbuttexit.ptinrect(point))

else if (m_rtbuttmin.ptinrect(point))

else if (m_rtbutthel.ptinrect(point))

else if (m_rtbuttmax.ptinrect(point))

}else if (!iszoomed())

}3.  新增視窗訊息 onncmousemove - 非客戶端滑鼠移動事件

3.1 .h標頭檔案中:

afx_msg void onncmousemove(uint nhittest, cpoint point);

3.2 .cpp檔案實現:

void ctestmywnddlg::onncmousemove(uint nhittest, cpoint point)

else

rtbutton = m_rtbuttmax;

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);

pdisplaymemdc->selectobject(poldbitmap);

pbitmap->deleteobject();

//最小化button

if (m_rtbuttmin.ptinrect(point))

pbitmap->loadbitmap(idb_min_focus);

else

pbitmap->loadbitmap(idb_min_normal);

rtbutton = m_rtbuttmin;

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);

pdisplaymemdc->selectobject(poldbitmap);

pbitmap->deleteobject();

//幫助button

if (m_rtbutthel.ptinrect(point))

pbitmap->loadbitmap(idb_help_focus);

else

pbitmap->loadbitmap(idb_help_normal);

rtbutton = m_rtbutthel;

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);

pdisplaymemdc->selectobject(poldbitmap);

pbitmap->deleteobject();

}releasedc(pdisplaymemdc);

releasedc(pdc);

delete pdisplaymemdc;

delete pbitmap;

cdialog::onncmousemove(nhittest, point);

}4. 新增視窗訊息onnccalcsize - 調整非客戶端區域大小(根據需要可加可不加)

4.1       .h 標頭檔案

afx_msg void onnccalcsize(bool bcalcvalidrects, nccalcsize_params* lpncsp);

4.2        .cpp 實現檔案

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

5. 新增視窗訊息 onsize - 取消原來對話方塊標題邊框

5.1    .h 標頭檔案

afx_msg void onsize(uint ntype, int cx, int cy);

5.2    .cpp 實現檔案

void ctestmywnddlg::onsize(uint ntype, int cx, int cy)

VC 實現 自繪 窗體 標題欄 非客戶區

vc 實現 自繪 窗體 標題欄 非客戶區 1.準備工作。1 得到資料夾中的點陣圖控制代碼 首先要準備相應。hbitmap bitmap bitmap hbitmap loadimage afxgetinstancehandle skin test.bmp image bitmap,0,0,lr de...

MFC自繪標題欄和邊框

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

終結mfc標題欄重繪

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