MFC對話方塊 重繪非客戶端區域(標題欄)

2021-07-02 03:33:19 字數 3762 閱讀 3837

某些情況下需要在對話方塊標題欄上新增按鈕,在此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)

MFC重繪非客戶區

1.去除視窗邊框和標題欄 oninitdialog函式,去除視窗邊框和標題欄 dword dwstyle getstyle dwnewstyle dwstyle setwindowlong m hwnd,gwl style,dwnewstyle dword dwexstyle getexstyle ...

非模態對話方塊 MFC

cvolsetdlg m pvoldlg null m pvoldlg newcvolsetdlg m pvoldlg create idd dlg vol m pvoldlg showwindow sw show 過載oncancel函式 void cxx oncancel todo add yo...

MFC 非模態對話方塊

非模態對話方塊 用mfc可以建立非模態的對話方塊,只是建立方式不同,模態對話方塊用 dlg.domodel 呼叫,而非模態對話方塊要用create函式建立呼叫。假設idd test dlg為已經定義的對話方塊資源的id號 ctestdlg dlg new ctestdlg dlg create id...