MFC 对话框 背景图片 以及消除 字体重影 字体重叠

【转载 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;转载请注明出处。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值