VS2010解决对话框设置背景图片和文字重叠

简介:

被严密封装的MFC应用程序界面开发是一个很大的问题。先从简单的对话框背景设置来说。

可以设置BITMAP图像或者其他格式的图片做为背景。

MFC内置了CImage类来加载和使用各种类型的图片。

简单使用方式如下:在Rect大小的区域用Image来绘制背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函数来绘制Rect区域)。

  1. <SPAN style="FONT-SIZE: 18px">CRect rect; 
  2. GetClientRect(rect); 
  3. CPaintDC dc(this); 
  4. CImage bkImage; 
  5. bkImage.Load(_T("res//bg.jpg")); 
  6. bkImage.Draw(dc, rect); 
  7. bkImage.Destroy();</SPAN> 
  1. <span style="font-size: 18px;">CRect rect; 
  2. GetClientRect(rect); 
  3. CPaintDC dc(this); 
  4. CImage bkImage; 
  5. bkImage.Load(_T("res//bg.jpg")); 
  6. bkImage.Draw(dc, rect); 
  7. bkImage.Destroy();</span> 
<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)中

  1. <span style="font-size: 18px;">HBRUSH CCourseInputDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  2.     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); 
  3.  
  4.     // TODO:  在此更改 DC 的任何特性 
  5.  
  6.     // TODO:  如果默认的不是所需画笔,则返回另一个画笔 
  7.         //通过控件ID的形式进行选择性设置背景为透明。 
  8.         if(IDC_LOGOUT==pWnd->GetDlgCtrlID() 
  9.         || IDCANCEL==pWnd->GetDlgCtrlID() 
  10.         || IDC_STTCTREE==pWnd->GetDlgCtrlID() 
  11.         || IDC_COURSEDMODELLIST==pWnd->GetDlgCtrlID() 
  12.         || IDC_STTCTREE==pWnd->GetDlgCtrlID() 
  13.         || IDC_COURSESMODELLIST==pWnd->GetDlgCtrlID() 
  14.         || IDC_COURSEANATLIST==pWnd->GetDlgCtrlID() 
  15.         || IDC_COURSESOUNDLIST==pWnd->GetDlgCtrlID() 
  16.         || IDC_CURCOURSE==pWnd->GetDlgCtrlID()) 
  17.     { 
  18.         pDC->SetBkColor(RGB(255,255,255)); 
  19.         pDC->SetBkMode(TRANSPARENT); 
  20.         return (HBRUSH)::GetStockObject(NULL_BRUSH); 
  21.     } 
  22.         //批量进行设置 
  23.         //switch(nCtlColor) 
  24.     //{ 
  25.     //  case CTLCOLOR_STATIC: //对所有静态文本控件的设置 
  26. //            { 
  27.     //           pDC->SetBkMode(TRANSPARENT);//设置背景为透明            
  28.     //           pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色 
  29.     //           return HBRUSH(GetStockObject(NULL_BRUSH)); // 必须 
  30.     //       } 
  31.     //  case CTLCOLOR_DLG: //对所有静态文本控件的设置 
  32.     //      { 
  33.     //          pDC->SetBkMode(TRANSPARENT);  
  34.     //          return hbr; //返回画刷句柄 
  35.     //      }  
  36.     //  default: 
  37.     //      pDC->SetBkMode(TRANSPARENT); 
  38.     //      return CDialog::OnCtlColor(pDC,pWnd, nCtlColor); 
  39.     //} 
  40.     //pDC->SetBkMode(TRANSPARENT); 
  41.     //return (HBRUSH)::GetStockObject(NULL_BRUSH); 
  42.     return hbr; 
  43. }</span> 
<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);

即可解决。

由于我是通过变量关联的控件所以

直接使用

  1. <SPAN style="FONT-SIZE: 18px">mCurCourseShow.ShowWindow(SW_HIDE); 
  2. mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串 
  3. mCurCourseShow.ShowWindow(SW_SHOW);</SPAN> 
  1. <span style="font-size: 18px;">mCurCourseShow.ShowWindow(SW_HIDE); 
  2. mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串 
  3. mCurCourseShow.ShowWindow(SW_SHOW);</span> 
<span style="font-size:18px;">mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);</span>

  1. <SPAN style="FONT-SIZE: 18px">//也可以直接使用 
  2. ((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE); 
  3.  
  4. ((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str); 
  5.  
  6. ((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);</SPAN> 

转载至:http://blog.csdn.net/maturn/article/details/8052244

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值