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类的声明
- 01 #if _MSC_VER > 1000
- 02 #pragma once
- 03 #endif
- 04
- 05 ////////////////////////////////////////////////////////////////////
- 06 //CBackPicDemoDlg 对话框代码开始
- 07
- 08 class CBackPicDemoDlg : public CDialog //类声明
- 09 {
- 10 //各种声明及定义
- 11 public:
- 12 CBackPicDemoDlg(CWnd* pParent = NULL); //构造函数
- 13 CBrush m_brBk; //笔刷类变量
- 14 //对话框数据
- 15 //{{AFX_DATA(CBackPicDemoDlg)
- 16 enum { IDD = IDD_BACKPICDEMO_DIALOG }; //对话框资源
- 17 //}}AFX_DATA
- 18
- 19 //虚函数声明
- 20 //{{AFX_VIRTUAL(CBackPicDemoDlg)
- 21 protected:
- 22 virtual void DoDataExchange(CDataExchange* pDX);//资源加载
- 23 //}}AFX_VIRTUAL
- 24
- 25 //各种类的成员
- 26 protected:
- 27 HICON m_hIcon; //图标变量
- 28
- 29 //消息映射表
- 30 //{{AFX_MSG(CBackPicDemoDlg)
- 31 virtual BOOL OnInitDialog(); //初始化函数
- 32 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
- 33 afx_msg void OnPaint();//绘图函数
- 34 afx_msg HCURSOR OnQueryDragIcon();
- //重载的显示函数
- 35 afx_msg HBRUSH OnCtlColor(CDC* pDC,
CWnd* pWnd, UINT nCtlColor); - 36 //}}AFX_MSG
- 37 DECLARE_MESSAGE_MAP()
- 38 };
- 39
- 40 //{{AFX_INSERT_LOCATION}}
- 41 #endif
(4)在BackPicDemo类的实现源文件的初始化函数OnInitDialog()中加入代码,如代码5.2所示。
代码5.2 OnInitDialog()函数实现
- 01 ///////////////////////////////////////
//////////////////////////// - 02 //CBackPicDemoDlg 消息函数的实现
- 03
- 04 BOOL CBackPicDemoDlg::OnInitDialog()
- 05 { //初始化函数实现
- 06 CDialog::OnInitDialog();
- 07
- 08//比较关于对话框在资源号
- 09 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- 10 ASSERT(IDM_ABOUTBOX < 0xF000);
- 11//加载系统菜单
- 12 CMenu* pSysMenu = GetSystemMenu(FALSE);
- 13 if (pSysMenu != NULL)
- 14 {
- 15 CString strAboutMenu;
- 16 strAboutMenu.LoadString(IDS_ABOUTBOX);
- 17 if (!strAboutMenu.IsEmpty())
//关于菜单是否为空 - 18 {
- 19 pSysMenu->AppendMenu(MF_SEPARATOR);
- 20 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,
- strAboutMenu);
- 21 }
- 22 }
- 23
- 24 SetIcon(m_hIcon, TRUE);
//设置大图标 - 25 SetIcon(m_hIcon, FALSE); //设置小图标
- 26
- 27 CBitmap bmp; //图片类对象
- 28 bmp.LoadBitmap(IDB_BITMAP1);
//对象加载图片 - 29 m_brBk.CreatePatternBrush(&bmp);
//创建图片笔刷 - 30 bmp.DeleteObject(); //删除对象
- 31 return TRUE;
- 32 }
(5)再打开类向导(使用快捷键Ctrl+W),找到WM_CTLCOLOR消息,单击Add Function按钮,如图5.8所示。
|
| (点击查看大图)图5.8 类向导对话框 |
(6)在BackPicDemo.cpp中重载得到对应函数OnCtlColor(),修改其实现如代码5.3所示。
代码5.3 OnCtlColor ()函数的实现
- 01 HBRUSH CBackPicDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT
- nCtlColor)
- 02 {
- 03 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
- 04
- 05 if (pWnd == this) //判断是否是本窗口
- 06 {
- 07 return m_brBk; //返回笔刷对象的句柄
- 08 }
- 09
- 10 return hbr;//返回默认句柄
- 11 }
(7)程序编译并运行,效果如图5.9所示。
从程序最后的效果图中可以看出,使用背景方式显示图片时,当图片面积比对话框面积小时,其会自动把图片平铺到背景上。