5.3.3 使用BitBlt()函数动态显示图像(2)
(4)上面实现了图片加载,并调整对话框中的图像控件大小以适应图像。现在就差绘制图像的过程。在这里需要打开类向导,重载WM_PAINT消息。重载得到对应函数OnPaint(),修改其实现如代码5.6所示。
代码5.6 OnPaint()函数的实现
- 01 void CDynamicPicDemoDlg::OnPaint()
- 02 {
- 03 if (IsIconic())
- 04 {
- 05 CPaintDC dc(this); //得到设置DC
- 06
- 07 SendMessage(WM_ICONERASEBKGND, (WPARAM)
dc.GetSafeHdc(), 0); - 08
- 09 int cxIcon = GetSystemMetrics(SM_CXICON);
//得到图标的x坐标 - 10 int cyIcon = GetSystemMetrics(SM_CYICON);
//得到图标的y坐标 - 11 CRect rect; //定义矩形区域对象
- 12 GetClientRect(&rect);//得到客户区域
- 13 int x = (rect.Width() - cxIcon + 1) / 2;
- 14 int y = (rect.Height() - cyIcon + 1) / 2;
- 15 dc.DrawIcon(x, y, m_hIcon); //画图标
- 16 }
- 17 else
- 18 { //得到picture控件的DC,图像将被绘制在控件上
- 19 CPaintDC dc(GetDlgItem(IDC_PIC));
- 20
- 21 CRect rcclient; //得到客户区域
- 22 //通过控件句柄得到控件区域
- 23 GetDlgItem(IDC_PIC)->GetClientRect(&rcclient);
- 24
- 25 CDC memdc; //内存DC
- 26
- 27 memdc.CreateCompatibleDC(&dc);
//从控件DC生成内存DC - 28 CBitmap bitmap; //定义图像对象
- 29 /从内存DC创建bitmap
- 30 bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(),
- rcclient.Height());
- 31
- 32 memdc.SelectObject( &bitmap ); //设置对象
- 33 //调用默认OnPaint
- 34 CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
- 35 CDC maskdc;
- 36 maskdc.CreateCompatibleDC(&dc);
- 37 CBitmap maskbitmap;//定义图像对象
- 38 //创建bitmap
- 39 maskbitmap.CreateBitmap(rcclient.Width(),
rcclient.Height(), - 1, 1, NULL);
- 40
- 41 maskdc.SelectObject( &maskbitmap ); //设置对象
- 42 maskdc.BitBlt( 0, 0, rcclient.Width(),
rcclient.Height(), - &memdc, //绘制图像到控件区域
- 43 rcclient.left, rcclient.top, SRCCOPY);
- 44
- 45 CBrush brush; //定义笔刷变量
- 46
- 47 brush.CreatePatternBrush(&m_bmp); //创建笔刷
- 48 dc.FillRect(rcclient, &brush); //填充客户区域
- 49 //开始绘制真实的图像
- 50 dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(),
- rcclient.Height(),
- &memdc, rcclient.left, rcclient.top,SRCPAINT);
- 51 brush.DeleteObject(); //删除笔刷对象
- 52 }
- 53 }
(5)程序编译并运行,其效果如图5.11所示。
|
| (点击查看大图)图5.11 DynamicPicDemo运行效果 |
从最后的执行效果上看,和图5.6相似。不过读者在这里需要注意,使用BitBIt()函数时,图片资源是从文件中得到的,而不是作为程序资源,在生成程序时已经存在。这样做的好处是使程序变得小巧、灵活,图片也可以随时替换。
技巧:BitBlt函数可以在对话框的任何位置画图,但要记住显示屏的X坐标是从左到右增加,Y坐标是从上向下增加。