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