【转载 ACM不挂科】 http://hi.baidu.com/acmbuguake/item/380c1344605f243311ee1e74
很多人都想改变对话框的背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。
只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于该消息不能用MFC ClassWizard添加,因为ClassWizard没有该消息添加的选项,我们需要手动添加,只需要在消息响应MAP添加一下ON_WM_ERASEBKGND(),如下所示:
BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)
//{{AFX_MSG_MAP(CSerialTestDlg)
ON_WM_ERASEBKGND()//添加重绘背景消息响应
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
我们然后进行消息响应,添加消息响应函数,然后在对话框类的声明文件添加该函数的声明virtual BOOL OnEraseBkgnd(CDC*pDC);在实现文件中进行该函数的书写,如:
BOOL CSerialTestDlg::OnEraseBkgnd(CDC*pDC)
{
CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_DLGBK);//加载背景图片,选择你对应的图片ID
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&m_bitmap);
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);//选择客户区域
BITMAP bmp;
m_bitmap.GetBitmap(&bmp);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);//绘制BMP背景图
m_bitmap.DeleteObject();
return TRUE;
}
但是这样做一般就可以,细心的人会发现字体有重叠,比如说静态文本框和EDIT控件,如果选择只读模式,作为输出,这时EDIT的背景是BMP背景图片,但是字体重叠,如下图,我这样就行消除。
用MFC ClassWizard添加WM_CTLCOLOR消息,如下图,然后编写该函数
HBRUSH CSerialTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr= CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
switch(nCtlColor)
{
case CTLCOLOR_STATIC: //对所有静态文本控件的设置
{
pDC->SetBkMode(TRANSPARENT);//设置背景为透明
pDC->SetTextColor(RGB(0,0,0)); //设置字体颜色
return HBRUSH(GetStockObject(HOLLOW_BRUSH)); // 必须
}
case CTLCOLOR_DLG: //对所有静态文本控件的设置
{
pDC->SetBkMode(TRANSPARENT);
return hbr; //返回画刷句柄
}
default:
return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
return hbr;
}
这里解决静态文本框背景,然后是关于字体重叠问题,只需要对EDIT控件进行隐藏,显示一下就可以了
((CEdit*)(GetDlgItem(IDC_EDIT_writetime)))->ShowWindow(SW_HIDE);
((CEdit*)(GetDlgItem(IDC_EDIT_writetime)))->SetWindowText(m_peoplelist.GetItemText(i,7));
((CEdit*)(GetDlgItem(IDC_EDIT_writetime)))->ShowWindow(SW_SHOW);
看看这样是不是可以了(*^__^*)嘻嘻……
PS:这里用到的函数,不理解可以百度或者MSDN,这里不解释,ACM不挂科版权所有,QQ:928765096,联系请发邮件lsjlhls@sina.com;转载请注明出处。