5.3.3 使用BitBlt()函数动态显示图像(1)
除了前面的两种方法外,还可以使用BitBlt()函数来实现图像的显示。使用BitBlt()函数显示图像,是一种动态加载图片的方法。即在程序运行时,指定图片的路径,实现图片的显示。不用在程序生成时,把图片当作资源加载进程序。其方法如下所示。
技巧:使用BitBlt()函数时,可以不用把图片作为资源加载到对话框中,而且效率更高。
(1)创建一个基于对话框模式的应用程序--DynamicPicDemo,并在对话框中加入一个Picture控件,设置名称为IDC_PIC,如图5.10所示。
|
| (点击查看大图)图5.10 DynamicPicDemo主界面 |
(2)在CDynamicPicDemoDlg类的声明中,声明一个CBitmap类的对象m_bmp,如代码5.4所示。
代码5.4 CDynamicPicDemoDlg类的声明
- 01 ///////////////////////////////////////////////////////////////////
- 02 //CDynamicPicDemoDlg 对话框类的声明
- 03
- 04 class CDynamicPicDemoDlg : public CDialog
- 05 {
- 06 //各种声明及定义
- 07 public:
- 08 CDynamicPicDemoDlg(CWnd* pParent = NULL); //构造函数
- 09
- 10 //{{AFX_DATA(CDynamicPicDemoDlg)
- 11 enum { IDD = IDD_DYNAMICPICDEMO_DIALOG };
- 12 //资源加载
- 13 //}}AFX_DATA
- 14
- 15 //{{AFX_VIRTUAL(CDynamicPicDemoDlg) //虚函数声明
- 16 protected:
- 17 virtual void DoDataExchange(CDataExchange* pDX);
- 18 //}}AFX_VIRTUAL
- 19 private:
- 20 CBitmap m_bmp;
//声明CBitmap类的对象m_bmp- 21 protected:
- 22 HICON m_hIcon; //声明图标对象
- 23 //{{AFX_MSG(CDynamicPicDemoDlg)
- 24 virtual BOOL OnInitDialog(); //声明初始化函数
- 25 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
- 26 afx_msg void OnPaint();//声明显示函数
- 27 afx_msg HCURSOR OnQueryDragIcon();
- 28 //}}AFX_MSG
- 29 DECLARE_MESSAGE_MAP()
- 30 };
(3)在对话框的初始化函数(OnInitDialog)中,实现图片文件的加载。添加内容如代码5.5所示。
代码5.5 OnInitDialog()函数的实现
- 01 BOOL CDynamicPicDemoDlg::OnInitDialog()
- 02 {
- 03 CDialog::OnInitDialog();
//初始化对话框函数- 04
- 05 CMenu* pSysMenu = GetSystemMenu(FALSE);
- 06 if (pSysMenu != NULL)//判断是否为空
- 07 {
- 08 CString strAboutMenu;
- 09 strAboutMenu.LoadString(IDS_ABOUTBOX);
- 10 if (!strAboutMenu.IsEmpty())
- 11 { //不为空
- 12 pSysMenu->AppendMenu(MF_SEPARATOR);
- 13 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,
- strAboutMenu);
- 14 }
- 15 }
- 16
- 17 SetIcon(m_hIcon, TRUE);//设置大图标
- 18 SetIcon(m_hIcon, FALSE);
//设置小图标- 19
- 20 if( m_bmp.m_hObject != NULL )
//判断是否已经有对象- 21 {
- 22 m_bmp.DeleteObject();
- 23 }
- 24 //载入图片文件
- 25 HBITMAP hbmp = (HBITMAP)::LoadImage
(AfxGetInstanceHandle(),- ".\\demo.bmp",
- IMAGE_BITMAP,
- 0,0,
- LR_CREATEDIBSECTION|LR_LOADFROMFILE);
- 26 if( hbmp == NULL )
- 27 { //判断是否加载成功
- 28 return FALSE;
- 29 }
- 30 //下面的程序用来取得加载的BMP图片的信息
- 31 m_bmp.Attach( hbmp );
- 32
- 33 DIBSECTION ds;
- 34
- 35 BITMAPINFOHEADER &bminfo = ds.dsBmih;
- 36
- 37 m_bmp.GetObject( sizeof(ds), &ds );
- 38
- 39 int cx=bminfo.biWidth;//得到图像宽度
- 40
- 41 int cy=bminfo.biHeight;//得到图像高度
- 42
- 43 //得到图像的宽度和高度,对图像进行适应,
调整控件的大小,让其正好显示一张图片- 44
- 45 CRect rect;
- 46
- 47 GetDlgItem(IDC_PIC)->GetWindowRect(&rect);
//得到图像控件的区域- 48
- 49 ScreenToClient(&rect);//转换坐标
- 50 //调整大小
- 51 GetDlgItem(IDC_PIC)->MoveWindow(rect.
left,rect.top,cx,cy,true);- 52
- 53 return TRUE;
- 54 }
