为了绘制jpg格式的图像数据在界面中,目前采用微软提供的CImage类实现,CImage增加型的图像绘制工具,
采用放大镜看图,并用滚轮滚动放大缩小放大镜,并移动鼠标看图,如果不使用双缓冲绘制,图像会出现闪烁的现象,
1: CImage绘图
SetStretchBltMode(pDC->m_hDC,HALFTONE);
m_disImage.StretchBlt(pDC->m_hDC,0,0,m_sizeDest.cx,m_sizeDest.cy,0,0,m_sizeSource.cx,m_sizeSource.cy,SRCCOPY);
2: 放大镜绘制
SetStretchBltMode(dcMem.m_hDC,HALFTONE);
m_disImage.StretchBlt(dcMem.m_hDC,ndRect.left,ndRect.top,ndRect.Width(),ndRect.Height(),nsRect.left*3.3,nsRect.top*3.3,nsRect.Width()*3.3,nsRect.Height()*3.3,SRCCOPY);
3: 双缓冲
就是要想绘制的图像先绘制到一个CDC的内存中,然后再一次性复制到界面中
CDC dcMem;
dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC
CBitmap bmp; //内存中承载临时图象的位图
bmp.CreateCompatibleBitmap(pDC,m_sizeDest.cx,m_sizeDest.cy);//创建兼容位图
dcMem.SelectObject(&bmp); //将位图选择进内存DC
在内存DC中进行图像绘制
SetStretchBltMode(dcMem.m_hDC,HALFTONE);
m_disImage.StretchBlt(dcMem.m_hDC,0,0,m_sizeDest.cx,m_sizeDest.cy,0,0,m_sizeSource.cx,m_sizeSource.cy,SRCCOPY);
把放大镜也绘制到内存DC中
SetStretchBltMode(dcMem.m_hDC,HALFTONE);
m_disImage.StretchBlt(dcMem.m_hDC,ndRect.left,ndRect.top,ndRect.Width(),ndRect.Height(),nsRect.left*3.3,nsRect.top*3.3,nsRect.Width()*3.3,nsRect.Height()*3.3,SRCCOPY);
一次性把结果复制到前台界面
pDC->BitBlt(0,0,m_sizeDest.cx,m_sizeDest.cy,&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
内存释放
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject(); //删除位图