VC 用BitBlt显示完BMP图像后,用什么函数能把图像清除,恢复到没有载入图像的情况?

[复制链接]
查看11 | 回复3 | 2011-5-19 02:01:36 | 显示全部楼层 |阅读模式
OnDraw(CDC*pDC)
{
        HBITMAPbitmap;
        HBITMAPoldbitmap;
        CDCmemdc;CRectrect;
        if(FileName==\"\")bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),NULL,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
        else
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        memdc.CreateCompatibleDC(pDC);
        GetClientRect(rect);
        oldbitmap=(HBITMAP)memdc.SelectObject(bitmap);
        pDC-BitBlt(0,0,rect.Width(),rect.Height(),
        memdc.SelectObject(oldbitmap);

       
        //显示等待光标
        BeginWaitCursor();
       
        //获取文档
        CCh1_1Doc*pDoc=GetDocument();
        ASSERT_VALID(pDoc);
       
        //获取DIB
        HDIBhDIB=pDoc-GetHDIB();
       
        //判断DIB是否为空
        if(hDIB!=NULL)
        {
                LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
               
                //获取DIB宽度
                intcxDIB=(int)::DIBWidth(lpDIB);
               
                //获取DIB高度
                intcyDIB=(int)::DIBHeight(lpDIB);

                ::GlobalUnlock((HGLOBAL)hDIB);
               
                CRectrcDIB;
                rcDIB.top=rcDIB.left=0;
                rcDIB.right=cxDIB;
                rcDIB.bottom=cyDIB;
               
                CRectrcDest;
               
                //判断是否是打印
                if(pDC-IsPrinting())
                {
                        //是打印,计算输出图像的位置和大小,以便符合页面
                       
                        //获取打印页面的水平宽度(象素)
                        intcxPage=pDC-GetDeviceCaps(HORZRES);
                       
                        //获取打印页面的垂直高度(象素)
                        intcyPage=pDC-GetDeviceCaps(VERTRES);
                       
                        //获取打印机每英寸象素数
                        intcxInch=pDC-GetDeviceCaps(LOGPIXELSX);
                        intcyInch=pDC-GetDeviceCaps(LOGPIXELSY);
                       
                        //计算打印图像大小(缩放,根据页面宽度调整图像大小)
                        rcDest.top=rcDest.left=0;
                        rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)
                                        /((double)cxDIB*cxInch));
                        rcDest.right=cxPage;
                       
                        //计算打印图像位置(垂直居中)
                        inttemp=cyPage-(rcDest.bottom-rcDest.top);
                        rcDest.bottom=temp/2;
                        rcDest.top=temp/2;

                }
                else
                //非打印
                {
                        //不必缩放图像
                        rcDest=rcDIB;
                }
               
                //输出DIB
                ::PaintDIB(pDC-m_hDC,GetHDIB(),
                        GetDocPalette());
        }
       
        //恢复正常光标
        EndWaitCursor();

       
}
回复

使用道具 举报

千问 | 2011-5-19 02:01:36 | 显示全部楼层
晕那里那么复杂。
你使用CBitmap的话,析构函数会自动删除对象句柄,不用调用。
使用HBITMAPbitmap;的话,在函数末尾加:DeleteObject(bitmap);
回复

使用道具 举报

千问 | 2011-5-19 02:01:36 | 显示全部楼层
有没有一个函数把把某一块矩形的颜色删除,就像橡皮擦似地?
回复

使用道具 举报

千问 | 2011-5-19 02:01:36 | 显示全部楼层
可以用FillRect把这一块矩形填充为白色,不就像当于橡皮擦吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行