5.3.3 使用BitBlt()函数动态显示图像(1)

2013-10-07 13:02:33 · 作者: · 浏览: 64

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类的声明

  1. 01  ///////////////////////////////////////////////////////////////////  
  2. 02  //CDynamicPicDemoDlg 对话框类的声明  
  3. 03  
  4. 04  class CDynamicPicDemoDlg : public CDialog  
  5. 05  {  
  6. 06  //各种声明及定义  
  7. 07  public:  
  8. 08      CDynamicPicDemoDlg(CWnd* pParent = NULL);   //构造函数  
  9. 09  
  10. 10      //{{AFX_DATA(CDynamicPicDemoDlg)  
  11. 11      enum { IDD = IDD_DYNAMICPICDEMO_DIALOG };  
  12. 12  //资源加载  
  13. 13      //}}AFX_DATA  
  14. 14  
  15. 15      //{{AFX_VIRTUAL(CDynamicPicDemoDlg)     //虚函数声明  
  16. 16      protected:  
  17. 17      virtual void DoDataExchange(CDataExchange* pDX);  
  18. 18      //}}AFX_VIRTUAL  
  19. 19  private:  
  20. 20      CBitmap   m_bmp;                   
    //声明CBitmap类的对象m_bmp  
  21. 21  protected:  
  22. 22      HICON m_hIcon;      //声明图标对象  
  23. 23      //{{AFX_MSG(CDynamicPicDemoDlg)  
  24. 24      virtual BOOL OnInitDialog();                //声明初始化函数  
  25. 25      afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  26. 26      afx_msg void OnPaint();//声明显示函数  
  27. 27      afx_msg HCURSOR OnQueryDragIcon();  
  28. 28      //}}AFX_MSG  
  29. 29      DECLARE_MESSAGE_MAP()  
  30. 30  }; 

(3)在对话框的初始化函数(OnInitDialog)中,实现图片文件的加载。添加内容如代码5.5所示。

代码5.5  OnInitDialog()函数的实现

  1. 01  BOOL CDynamicPicDemoDlg::OnInitDialog()  
  2. 02  {  
  3. 03      CDialog::OnInitDialog();           
    //初始化对话框函数  
  4. 04  
  5. 05      CMenu* pSysMenu = GetSystemMenu(FALSE);  
  6. 06      if (pSysMenu != NULL)//判断是否为空  
  7. 07      {  
  8. 08          CString strAboutMenu;  
  9. 09          strAboutMenu.LoadString(IDS_ABOUTBOX);  
  10. 10          if (!strAboutMenu.IsEmpty())  
  11. 11          {               //不为空  
  12. 12              pSysMenu->AppendMenu(MF_SEPARATOR);  
  13. 13              pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,  
  14.                 strAboutMenu);  
  15. 14          }  
  16. 15      }  
  17. 16  
  18. 17      SetIcon(m_hIcon, TRUE);//设置大图标  
  19. 18      SetIcon(m_hIcon, FALSE);                
    //设置小图标  
  20. 19  
  21. 20      if( m_bmp.m_hObject != NULL )          
    //判断是否已经有对象  
  22. 21      {  
  23. 22          m_bmp.DeleteObject();  
  24. 23      }  
  25. 24  //载入图片文件  
  26. 25      HBITMAP hbmp = (HBITMAP)::LoadImage
    (AfxGetInstanceHandle(),  
  27.      ".\\demo.bmp",  
  28.       IMAGE_BITMAP,  
  29.        0,0,  
  30.       LR_CREATEDIBSECTION|LR_LOADFROMFILE);  
  31. 26  if( hbmp == NULL )  
  32. 27  {                   //判断是否加载成功  
  33. 28      return FALSE;  
  34. 29      }  
  35. 30      //下面的程序用来取得加载的BMP图片的信息  
  36. 31      m_bmp.Attach( hbmp );  
  37. 32  
  38. 33      DIBSECTION ds;  
  39. 34  
  40. 35      BITMAPINFOHEADER &bminfo = ds.dsBmih;  
  41. 36  
  42. 37      m_bmp.GetObject( sizeof(ds), &ds );  
  43. 38  
  44. 39      int cx=bminfo.biWidth;//得到图像宽度  
  45. 40  
  46. 41      int cy=bminfo.biHeight;//得到图像高度  
  47. 42  
  48. 43      //得到图像的宽度和高度,对图像进行适应,
    调整控件的大小,让其正好显示一张图片  
  49. 44  
  50. 45      CRect rect;  
  51. 46  
  52. 47      GetDlgItem(IDC_PIC)->GetWindowRect(&rect); 
    //得到图像控件的区域  
  53. 48  
  54. 49      ScreenToClient(&rect);//转换坐标  
  55. 50  //调整大小  
  56. 51      GetDlgItem(IDC_PIC)->MoveWindow(rect.
    left,rect.top,cx,cy,true);  
  57. 52  
  58. 53      return TRUE;  
  59. 54  }