某些情况下需要在对话框标题栏上添加按钮,在此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){
LRESULT lrst = CDialog::DefWindowProc(message, wParam, lParam);
if (!::IsWindow(m_hWnd))
return lrst;
if (message==WM_MOVE
||message==WM_PAINT
||message==WM_NCPAINT
||message==WM_NCACTIVATE
||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
return lrst;
}
其中 DrawTitleBar方法如下:
// 重绘标题栏
void CtestMyWndDlg::DrawTitleBar(CDC *pDC)
{
if (m_hWnd)
{
CBrush Brush(RGB(0,0,0));
CBrush* pOldBrush = pDC->SelectObject(&Brush);
CRect rtWnd, rtTitle, rtButtons;
GetWindowRect(&rtWnd);
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
// 避免与原有标题栏重叠
int nTitleTopDown = 0;
CPoint point;
//填充顶部框架
point.x = rtWnd.Width();
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+20;
pDC->PatBlt(0, nTitleTopDown, point.x, point.y, PATCOPY);
//填充左侧框架
point.x = GetSystemMetrics(SM_CXFRAME) + 1;
point.y = rtWnd.Height();
pDC->PatBlt(0, nTitleTopDown, point.x, point.y, PATCOPY);