CImage类绘图,放大镜看图的实现

       为了绘制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();                                        //删除位图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值