设为首页 加入收藏

TOP

5.3.2 通过对话框背景显示图像
2013-10-07 13:02:28 来源: 作者: 【 】 浏览:64
Tags:5.3.2 通过 对话 背景 显示 图像

5.3.2  通过对话框背景显示图像

其实在Visual C++(www.cppentry.com)中,还可以直接通过重载对话框的消息函数OnCtlColor()来实现背景显示图片。方法如下。

(1)创建一个基于对话框模式的应用程序--BackPicDemo,如图5.7所示。

 
(点击查看大图)图5.7  BackPicDemo程序主界面

(2)给当前应用程序添加一个图片资源。ID为IDB_BITMAP1(同前面的示例类似)。

(3)在CBackPicDemoDlg类的声明中,给该类增加一个成员变量m_bkPic,如代码5.1所示。

代码5.1  CBackPicDemoDlg类的声明

  1. 01  #if _MSC_VER > 1000  
  2. 02  #pragma once  
  3. 03  #endif  
  4. 04  
  5. 05  ////////////////////////////////////////////////////////////////////  
  6. 06  //CBackPicDemoDlg 对话框代码开始  
  7. 07  
  8. 08  class CBackPicDemoDlg : public CDialog          //类声明  
  9. 09  {  
  10. 10  //各种声明及定义  
  11. 11  public:  
  12. 12      CBackPicDemoDlg(CWnd* pParent = NULL);      //构造函数  
  13. 13      CBrush m_brBk;      //笔刷类变量  
  14. 14  //对话框数据  
  15. 15      //{{AFX_DATA(CBackPicDemoDlg)  
  16. 16      enum { IDD = IDD_BACKPICDEMO_DIALOG };      //对话框资源  
  17. 17      //}}AFX_DATA  
  18. 18  
  19. 19  //虚函数声明  
  20. 20      //{{AFX_VIRTUAL(CBackPicDemoDlg)  
  21. 21      protected:  
  22. 22      virtual void DoDataExchange(CDataExchange* pDX);//资源加载  
  23. 23      //}}AFX_VIRTUAL  
  24. 24  
  25. 25  //各种类的成员  
  26. 26  protected:  
  27. 27      HICON m_hIcon;      //图标变量  
  28. 28  
  29. 29  //消息映射表  
  30. 30      //{{AFX_MSG(CBackPicDemoDlg)  
  31. 31      virtual BOOL OnInitDialog();                //初始化函数  
  32. 32      afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  33. 33      afx_msg void OnPaint();//绘图函数  
  34. 34      afx_msg HCURSOR OnQueryDragIcon();  
  35.     //重载的显示函数  
  36. 35      afx_msg HBRUSH OnCtlColor(CDC* pDC,
    CWnd* pWnd, UINT nCtlColor);  
  37. 36      //}}AFX_MSG  
  38. 37      DECLARE_MESSAGE_MAP()  
  39. 38  };  
  40. 39  
  41. 40  //{{AFX_INSERT_LOCATION}}  
  42. 41  #endif 

(4)在BackPicDemo类的实现源文件的初始化函数OnInitDialog()中加入代码,如代码5.2所示。

代码5.2  OnInitDialog()函数实现

  1. 01  ///////////////////////////////////////
    ////////////////////////////  
  2. 02  //CBackPicDemoDlg 消息函数的实现  
  3. 03  
  4. 04  BOOL CBackPicDemoDlg::OnInitDialog()  
  5. 05  {                   //初始化函数实现  
  6. 06      CDialog::OnInitDialog();  
  7. 07  
  8. 08//比较关于对话框在资源号  
  9. 09      ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
  10. 10      ASSERT(IDM_ABOUTBOX < 0xF000);  
  11. 11//加载系统菜单  
  12. 12      CMenu* pSysMenu = GetSystemMenu(FALSE);  
  13. 13      if (pSysMenu != NULL)  
  14. 14      {  
  15. 15          CString strAboutMenu;  
  16. 16          strAboutMenu.LoadString(IDS_ABOUTBOX);  
  17. 17          if (!strAboutMenu.IsEmpty())        
    //关于菜单是否为空  
  18. 18          {  
  19. 19              pSysMenu->AppendMenu(MF_SEPARATOR);  
  20. 20              pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,  
  21.                 strAboutMenu);  
  22. 21          }  
  23. 22      }  
  24. 23  
  25. 24      SetIcon(m_hIcon, TRUE);                
    //设置大图标  
  26. 25      SetIcon(m_hIcon, FALSE);                //设置小图标  
  27. 26  
  28. 27      CBitmap bmp;        //图片类对象  
  29. 28      bmp.LoadBitmap(IDB_BITMAP1);           
    //对象加载图片  
  30. 29      m_brBk.CreatePatternBrush(&bmp);      
    //创建图片笔刷  
  31. 30      bmp.DeleteObject(); //删除对象  
  32. 31      return TRUE;  
  33. 32  } 

(5)再打开类向导(使用快捷键Ctrl+W),找到WM_CTLCOLOR消息,单击Add Function按钮,如图5.8所示。

 
(点击查看大图)图5.8  类向导对话框

(6)在BackPicDemo.cpp中重载得到对应函数OnCtlColor(),修改其实现如代码5.3所示。

代码5.3  OnCtlColor ()函数的实现

  1. 01  HBRUSH CBackPicDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT  
  2.     nCtlColor)  
  3. 02  {  
  4. 03      HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  5. 04  
  6. 05      if (pWnd == this)               //判断是否是本窗口  
  7. 06      {  
  8. 07          return m_brBk;              //返回笔刷对象的句柄  
  9. 08      }  
  10. 09  
  11. 10      return hbr;//返回默认句柄  
  12. 11  } 

(7)程序编译并运行,效果如图5.9所示。

从程序最后的效果图中可以看出,使用背景方式显示图片时,当图片面积比对话框面积小时,其会自动把图片平铺到背景上。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.3.3 使用BitBlt()函数动态显示.. 下一篇5.1.3 多媒体能做什么

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: