在对话框中设置背景的三种方法 .

摘要:
),并添加映射代码[cpp]viewplaincopyprint?voidCqqqDlg::OnPaint(){如果{CPaintDCdc;//devicecontextforpaintingSendMessage;//CentericoninclientrectangleintcxIcon=GetSystemMetrics;intcyIcon=getSystemMetric;CRectrect;GetClientRect;intx=/2;inty=/2;//Drawtheicondc.DrawIcon;}else{//CDialog::OnPaint();//记下这句话。如果你没有,把它放在最后。为什么//粘贴背景图片CPaintDCdc;CBitmapbmpBk;bmpBk。加载位图W;//m_bmpBK。加载位图W;位图bmpSize;bmpBk。获取位图;//获取背景图像大小CRectrect;GetClientRect;//获取客户区域大小CDCdcMem;dcMem公司。创建兼容dc(&dc);dcMem公司。选择对象;直流。StretchBlt;//拉伸或压缩背景图像并将其复制到客户端区域//粘贴背景图片}}执行效果的截图如下:方法2:注释掉returnCDialog::OnEraseBkgnd;直接返回true(为什么不返回this并返回true?

方法一:

在OnPaint中StretchBlt

具体是:注释掉CDialog::OnPaint()或放到结尾(原因何在呢?),并加入贴图代码

  1. voidCqqqqqDlg::OnPaint()
  2. {
  3. if(IsIconic())
  4. {
  5. CPaintDCdc(this);//devicecontextforpainting
  6. SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0);
  7. //Centericoninclientrectangle
  8. intcxIcon=GetSystemMetrics(SM_CXICON);
  9. intcyIcon=GetSystemMetrics(SM_CYICON);
  10. CRectrect;
  11. GetClientRect(&rect);
  12. intx=(rect.Width()-cxIcon+1)/2;
  13. inty=(rect.Height()-cyIcon+1)/2;
  14. //Drawtheicon
  15. dc.DrawIcon(x,y,m_hIcon);
  16. }
  17. else
  18. {
  19. //CDialog::OnPaint();//<spanstyle="color:#6600cc;">注释此句,如果不注释的话,就放到结尾,原因何在呢?
  20. </span>//贴背景图片
  21. CPaintDCdc(this);
  22. CBitmapbmpBk;
  23. bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);
  24. //m_bmpBK.LoadBitmapW(IDB_BMPBK);
  25. BITMAPbmpSize;
  26. bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸
  27. CRectrect;
  28. GetClientRect(&rect);//获取客户区尺寸
  29. CDCdcMem;
  30. dcMem.CreateCompatibleDC(&dc);
  31. dcMem.SelectObject(&bmpBk);
  32. dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区
  33. //贴背景图片
  34. }
  35. }

执行效果截图如下:

在对话框中设置背景的三种方法 .第1张

方法二:

在OnEraseBkgnd中StretchBlt

具体是:注释掉return CDialog::OnEraseBkgnd(pDC);直接返回true(为什么不能返回这个要返回true呢?),代码如下:

  1. BOOLCqqqqqDlg::OnEraseBkgnd(CDC*pDC)
  2. {
  3. //TODO:Addyourmessagehandlercodehereand/orcalldefault
  4. //贴背景图片
  5. CBitmapbmpBk;
  6. bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);
  7. //m_bmpBK.LoadBitmapW(IDB_BMPBK);
  8. BITMAPbmpSize;
  9. bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸
  10. CRectrect;
  11. GetClientRect(&rect);//获取客户区尺寸
  12. CDCdcMem;
  13. dcMem.CreateCompatibleDC(pDC);
  14. dcMem.SelectObject(&bmpBk);
  15. pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区
  16. //贴背景图片
  17. returntrue;
  18. //returnCDialog::OnEraseBkgnd(pDC);
  19. }

效果与方法一相同,图片就不贴了,参见上图。

而且这里还有一个很有意思的现象,若在OnEraseBkgnd贴图,在OnPaint()函数中不调用基类的OnPaint,即注释掉CDialog::OnPaint(),则将界面隐藏后再显示出来则控件全没了,只有对话框以及背景。如下图:

在对话框中设置背景的三种方法 .第2张

原因见《在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。

方法三:

在OnCtlColor中返回带有背景位图的画刷

具体是:

1、在头文件中定一个背景刷

  1. public:
  2. CBrushm_brushBk;

2、在OnInitDialog中加入以下句

  1. //TODO:Addextrainitializationhere
  2. CBitmapbmp;
  3. bmp.LoadBitmap(IDB_BITMAP_tempbk);
  4. m_brushBk.CreatePatternBrush(&bmp);
  5. //m_brushBk.CreateSolidBrush(RGB(0,255,0));//用纯色作为背景
  6. bmp.DeleteObject();

3、在OnCtlColor函数中返回背景画刷

  1. HBRUSHCXXXXXDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
  2. {
  3. HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
  4. //TODO:ChangeanyattributesoftheDChere
  5. //TODO:Returnadifferentbrushifthedefaultisnotdesired
  6. if(pWnd==this)//this代表当前对话框窗口
  7. {
  8. returnm_brushBk;
  9. }
  10. returnhbr;
  11. }

效果如下图所示:

在对话框中设置背景的三种方法 .第3张

注意这个函数里面的if判断,这个pWnd参数很关键。

我们看看,如果没有这个if判断,直接返回m_brushBk;会是什么结果呢,代码如下:

  1. HBRUSHCqqqqqDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
  2. {
  3. HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
  4. //TODO:ChangeanyattributesoftheDChere
  5. //TODO:Returnadifferentbrushifthedefaultisnotdesired
  6. returnm_brushBk;
  7. }

截图如下:
在对话框中设置背景的三种方法 .第4张

看图说话,不解释,你懂的。

这种方法的缺点是不具备StretchBlt函数的图片自动适应对话框(目标矩形)大小的功能。

免责声明:文章转载自《在对话框中设置背景的三种方法 .》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇全面质量管理-质量管理水平(二)VMware虚拟机从U盘启动安装操作系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

DD-wrt+Wiwiz搭建私人免费(收费)WiFi认证页面+详细的操作教程

因此,请选择正确的DD-WRT版本将无线路由器连接到Internet。执行以下命令:#cd;wgethttp://dl.wiwiz.com/hsbuilder-util-latest-DD-WRT.tar.gz#cd/jffs ; tar zxf/tmp/root/hsbuilder-util-lalatest-DD-WRT.tar。gz#/jffs/usr...

Windows Server 2008 R2 备份与恢复详细实例

Windows ftp服务可以在百度内置,非常简单。)1.首先安装windows server 2008R2的备份功能。查找Windows的“服务器管理器”。下图显示了我的服务器的情况。双击它。备份完成后,我们卸载qq并删除磁盘F的数据。Linux服务器在没有密码的情况下构建Samba登录,并使用yum进行安装。...

Idea常用插件整合

官方网站:https://plugins.jetbrains.com/plugin/228-sql-query-plugin6.IdeaVim基于IntelliJ的Vim仿真插件。注意:如果打开WebInspector,那么CSS/JavaScript同步和元素高亮显示不起作用“pluginisdebuggingthistab”信息栏的可用性问题官方网站:h...

基于 WebRTC 的 RTSP 视频实时预览

该方案采用基于WebRTC的视频即时消息,其原生支持RTP协议的解码,因此延迟可以非常低,约为0.2-0.4秒。其他方案的延迟大于1秒。WebRTC需要浏览器。您可以在以下地址查看支持的浏览器。WebRTC实现基于web的视频会议。标准是WHATWG协议。其目的是通过浏览器提供简单的javascript来实现实时通信功能。Github中有很多WebRTC的实...

Linux系统glibc库版本信息查看

有时我们经常需要检查当前系统的glibc版本。您可以按如下方式进行检查:/lib/libc。所以。6有时:/lib/x86-64-linux/libc。因此6.将文件作为命令执行。为什么库可以直接运行?Glibc是gnu发布的libc库,即c运行时。glibc是linux系统中最低级别的api,几乎任何其他运行时都将依赖glibc。Gcc和libc是相互依赖...

jenkins之部署、启动、关闭

jenkins可以通过内置的应用服务器或者借助其他应用服务器启动目录1、启动jenkins2、关闭jenkins3、重启jenkins4、重新加载jenkins配置信息前言:部署jenkins应用,是要安装java的,最新版本的jenkins是需要按照1.8版本的jdk,不然启动不了。...