VS2010解决对话框设置背景图片和文字重叠问题
2012-11-28 18:41
531 查看
原文地址:http://blog.csdn.net/maturn/article/details/8052244
内容:MFC基于对话框的项目设置背景图片以及解决设置对话框背景之后导致文字重叠(叠影)问题。
简介:
被严密封装的MFC应用程序界面开发是一个很大的问题。先从简单的对话框背景设置来说。
可以设置BITMAP图像或者其他格式的图片做为背景。
MFC内置了CImage类来加载和使用各种类型的图片。
简单使用方式如下:在Rect大小的区域用Image来绘制背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函数来绘制Rect区域)。
[css] view
plaincopy
<span style="font-size:18px;">CRect rect;
GetClientRect(rect);
CPaintDC dc(this);
CImage bkImage;
bkImage.Load(_T("res//bg.jpg"));
bkImage.Draw(dc, rect);
bkImage.Destroy();</span>
绘制可以放在OnPaint()(WM_PAINT消息函数)或者OnEraseBkgnd(CDC *pDC)(WM_ERASEBKGND消息函数)中。
其中又遇到两个问题,
第一个问题是在对话框中的每个控件都包含一个自己的背景色,导致出现了下面的问题。
产生原因:
每个控件默认带一个自己的背景色。
解决方法:
将其默认的背景色设置为透明即可。
在WM_CTLCOLOR消息对应的消息处理函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中
[cpp] view
plaincopy
<span style="font-size:18px;">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;
}</span>
pDC->SetBkMode(TRANSPARENT);
然后返回NULL_BRUSH即可。
第二个问题时出现文字重影问题。
绘制完之后会出现字体的重影问题,即文字在更新时旧有的文字没有被清除。如下图:
产生原因:
咱无
解决方法:
对包含该文字的控件在更新文字之前,
先调用ShowWindow(SW_HIDE);
然后等更新文字到控件之后。
再调用ShowWindow(SW_SHOW);
即可解决。
由于我是通过变量关联的控件所以
直接使用
[cpp] view
plaincopy
<span style="font-size:18px;">mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);</span>
[cpp] view
plaincopy
<span style="font-size:18px;">//也可以直接使用
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE);
((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str);
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);</span>
如上重影现象消失
出现字体重影的原因希望各位指点。
内容:MFC基于对话框的项目设置背景图片以及解决设置对话框背景之后导致文字重叠(叠影)问题。
简介:
被严密封装的MFC应用程序界面开发是一个很大的问题。先从简单的对话框背景设置来说。
可以设置BITMAP图像或者其他格式的图片做为背景。
MFC内置了CImage类来加载和使用各种类型的图片。
简单使用方式如下:在Rect大小的区域用Image来绘制背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函数来绘制Rect区域)。
[css] view
plaincopy
<span style="font-size:18px;">CRect rect;
GetClientRect(rect);
CPaintDC dc(this);
CImage bkImage;
bkImage.Load(_T("res//bg.jpg"));
bkImage.Draw(dc, rect);
bkImage.Destroy();</span>
绘制可以放在OnPaint()(WM_PAINT消息函数)或者OnEraseBkgnd(CDC *pDC)(WM_ERASEBKGND消息函数)中。
其中又遇到两个问题,
第一个问题是在对话框中的每个控件都包含一个自己的背景色,导致出现了下面的问题。
产生原因:
每个控件默认带一个自己的背景色。
解决方法:
将其默认的背景色设置为透明即可。
在WM_CTLCOLOR消息对应的消息处理函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中
[cpp] view
plaincopy
<span style="font-size:18px;">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;
}</span>
pDC->SetBkMode(TRANSPARENT);
然后返回NULL_BRUSH即可。
第二个问题时出现文字重影问题。
绘制完之后会出现字体的重影问题,即文字在更新时旧有的文字没有被清除。如下图:
产生原因:
咱无
解决方法:
对包含该文字的控件在更新文字之前,
先调用ShowWindow(SW_HIDE);
然后等更新文字到控件之后。
再调用ShowWindow(SW_SHOW);
即可解决。
由于我是通过变量关联的控件所以
直接使用
[cpp] view
plaincopy
<span style="font-size:18px;">mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);</span>
[cpp] view
plaincopy
<span style="font-size:18px;">//也可以直接使用
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE);
((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str);
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);</span>
如上重影现象消失
出现字体重影的原因希望各位指点。
相关文章推荐
- VS2010解决对话框设置背景图片和文字重叠问题
- VS2010解决对话框设置背景图片和文字重叠问题
- jquery mobile 设置背景图片铺满整个屏幕以及自定义背景图文字颜色问题
- MFC解决设置控件内容 文字重叠问题 (SetWindowText)
- 标签背景透明以及文字重叠问题解决方法
- android小问题:RadioButton设置文字在图片背景的下方
- 解决 UIView 设置背景为UIImage图片变型问题[XXX setBackgroundColor:[UIColor colorWithPatternImage:XXX]];
- 解决listview设置背景图片以后,拖动出现黑色的问题。
- 解决当静态文本或编辑框等控件设置为透明后文字重叠问题
- MFC对话框设置背景图片、背景颜色的问题
- 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
- 设置对话框的图片背景,控件的字体及透明等,字体重叠等
- 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
- 解决listview设置背景图片以后,拖动出现黑色的问题。
- 在MFC对话框中添加背景图片中遇到的问题之解决
- iOS 解决button设置背景图片的时候拉伸变形的问题
- QWebView中出现加载网页乱码、图片加载不出来的问题解决以级QMainWindow背景图片设置问题
- android textView设置html,解决图片和文字不对齐的问题
- 解决 UIView 设置背景为UIImage图片变型问题[XXX setBackgroundColor:
- MFC-对话框背景图片的设置