内容:MFC基于对话框的项目设置背景图片以及解决设置对话框背景之后导致文字重叠(叠影)问题。
简介:
被严密封装的MFC应用程序界面开发是一个很大的问题。先从简单的对话框背景设置来说。
可以设置BITMAP图像或者其他格式的图片做为背景。
MFC内置了CImage类来加载和使用各种类型的图片。
简单使用方式如下:在Rect大小的区域用Image来绘制背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函数来绘制Rect区域)。
CRect rect;
GetClientRect(rect);
CPaintDC dc(this);
CImage bkImage;
bkImage.Load(_T("res//bg.jpg"));
bkImage.Draw(dc, rect);
bkImage.Destroy();
绘制可以放在OnPaint()(WM_PAINT消息函数)或者OnEraseBkgnd(CDC *pDC)(WM_ERASEBKGND消息函数)中。
其中又遇到两个问题,
第一个问题是在对话框中的每个控件都包含一个自己的背景色,导致出现了下面的问题。
产生原因:
每个控件默认带一个自己的背景色。
解决方法:
将其默认的背景色设置为透明即可。
在WM_CTLCOLOR消息对应的消息处理函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中
HBRUSH CCourseInputDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
//通过控件ID的形式进行选择性设置背景为透明。
if(IDC_LOGOUT==pWnd->GetDlgCtrlID()
|| IDCANCEL==pWnd->GetDlgCtrlID()
|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
|| IDC_COURSEDMODELLIST==pWnd->GetDlgCtrlID()
|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
|| IDC_COURSESMODELLIST==pWnd->GetDlgCtrlID()
|| IDC_COURSEANATLIST==pWnd->GetDlgCtrlID()
|| IDC_COURSESOUNDLIST==pWnd->GetDlgCtrlID()
|| IDC_CURCOURSE==pWnd->GetDlgCtrlID())
{
pDC->SetBkColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
//批量进行设置
//switch(nCtlColor)
//{
// case CTLCOLOR_STATIC: //对所有静态文本控件的设置
// {
// pDC->SetBkMode(TRANSPARENT);//设置背景为透明
// pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色
// return HBRUSH(GetStockObject(NULL_BRUSH)); // 必须
// }
// case CTLCOLOR_DLG: //对所有静态文本控件的设置
// {
// pDC->SetBkMode(TRANSPARENT);
// return hbr; //返回画刷句柄
// }
// default:
// pDC->SetBkMode(TRANSPARENT);
// return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
//}
//pDC->SetBkMode(TRANSPARENT);
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
return hbr;
}
pDC->SetBkMode(TRANSPARENT);
然后返回NULL_BRUSH即可。
第二个问题时出现文字重影问题。
绘制完之后会出现字体的重影问题,即文字在更新时旧有的文字没有被清除。如下图:
产生原因:
咱无
解决方法:
对包含该文字的控件在更新文字之前,
先调用ShowWindow(SW_HIDE);
然后等更新文字到控件之后。
再调用ShowWindow(SW_SHOW);
即可解决。
由于我是通过变量关联的控件所以
直接使用
mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);
//也可以直接使用
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE);
((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str);
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);