17.9.2 新建相册模块的设计与实现(3)
【代码解析】
在本函数中主要是获取用户选择的新相片的路径,支持JPG、BMP等多种图像格式的相片。当用户选择完成后,第15~19行将新相片的路径插入列表框,并将其添加到相片的路径数组中。第25~29行载入新相片资源,将相片数加1后重绘窗体。
(6)重载窗体的OnPaint()函数,新相册中相片的预览功能就在这个函数中实现。
- 01 void CMyNewAlbumDlg::OnPaint()
- 02 {
- 03 CPaintDC dc(this);
- 04 CDC dcMemory; //创建兼容的内存设备
- 05 dcMemory.CreateCompatibleDC(NULL);
- 06 CRect bkRect;
- 07 GetClientRect(&bkRect); //获取窗体尺寸
- 08 CBitmap bitmap;
- 09 bitmap.CreateCompatibleBitmap(&dc, bkRect.Width(), bkRect
- .Height());
- 10 COLORREF color = GetSysColor(COLOR_3DFACE);
- 11 SelectObject(dcMemory.GetSafeHdc(), bitmap); //将位图选入内存设备
- 12 dcMemory.FillSolidRect(bkRect,color); //设置内存设备背景色
- 13 Graphics g(dcMemory.m_hDC);
- 14 Image bk_image(L"背景\\bg001.bmp"); //载入内存设备背景图像
- 15 g.DrawImage(&bk_image,bkRect.left,bkRect.top,bkRect.Width(),
- bkRect.Height());
- 16 //将相册中所有的相片绘制到内存设备上
- 17 for(int i = 0; i < m_totleNum; i++)
- 18 {
- 19 g.DrawImage(m_image[i],305 + ((i%5)*120),55 + (i / 5)*120,100,
- 100);
- 20 }
- 21 //将内存设备上的内容复制到屏幕上
- 22 dc.BitBlt(0,0,bkRect.Width(),bkRect.Height(),&dcMemory,0,0,
- SRCCOPY);
- 23 CDialog::OnPaint();
- 24 }
【代码解析】
本函数实现的主要功能就是将图像绘制到界面上,双缓冲技术见前几节的内容。第17~20行是实现图像绘制的主要部分,它将图像绘制在界面上以(305,55)为起点的区域内,每行绘制5个图像,每个图像绘制的区域大小为100×100个像素。图像上下左右间隔20个像素。