从资源中加载显示位图,通过双缓冲的方法显示。

从文件加载位图 看这篇 http://www.cppblog.com/alantop/archive/2008/03/14/44414.html

如何使用下面的代码。
1. 把位图导入资源。
资源->入->选bmp类型->导入->从硬盘中选择导入的bmp图即可。导入后,自动生成ID为IDB_BITMAP1的资源Bitmap.
2. 把下面代码复制到视图的OnDraw(CDC* pDC)函数

None.gif     CBitmap bmp;
None.gif    
if  (bmp . LoadBitmap(IDB_BITMAP1))
None.gif    {
None.gif        
//  Get the size of the bitmap
None.gif
        BITMAP bmpInfo;
None.gif        bmp
. GetBitmap( & bmpInfo);
None.gif        
None.gif        
//  Create an in-memory DC compatible with the
None.gif        // display DC we're using to paint

None.gif
        CDC dcMemory;
None.gif        dcMemory
. CreateCompatibleDC(pDC);
None.gif
None.gif
None.gif        
None.gif        
//  Select the bitmap into the in-memory DC
None.gif
        CBitmap *  pOldBitmap  =  dcMemory . SelectObject( & bmp);
None.gif        
None.gif        
//  Find a centerpoint for the bitmap in the client area
None.gif
        CRect rect;
None.gif        GetClientRect(
& rect);
None.gif        int nX 
=  rect . left  +  (rect . Width()  -  bmpInfo . bmWidth)  /   2 ;
None.gif        int nY 
=  rect . top  +  (rect . Height()  -  bmpInfo . bmHeight)  /   2 ;
None.gif
None.gif        POINT ptstart
,  ptend;
None.gif        ptstart
. =  ptstart . =   0 ;
None.gif        ptend
. =  ptend . =   500 ;
None.gif        
None.gif        
None.gif        dcMemory
. MoveTo(ptstart);
None.gif        dcMemory
. LineTo(ptend);
None.gif        
None.gif
None.gif        
None.gif        
//  Copy the bits from the in-memory DC into the on-
None.gif        // screen DC to actually do the painting. Use the centerpoint
None.gif        // we computed for the target offset.

None.gif
        pDC -> BitBlt( 0 ,   0 ,  bmpInfo . bmWidth ,  bmpInfo . bmHeight ,   & dcMemory ,  
None.gif            
0 ,   0 ,  SRCCOPY);
None.gif        
None.gif        dcMemory
. SelectObject(pOldBitmap);
None.gif
None.gif        SIZE si;
None.gif        si
. cx  =  bmpInfo . bmWidth;
None.gif        si
. cy  =  bmpInfo . bmHeight;
None.gif        SetScrollSizes(MM_TEXT
,  si);
None.gif    }
None.gif    
else
None.gif        TRACE0(
" ERROR: Where's IDB_BITMAP1?\n " );

3. 代码的操作思路.
   双缓冲,简单的说就是把画图的所有动作都在内存DC上完成,然后通过BitBlt拷贝到屏幕DC上。
   a. 首先建立一个CBitmap对象
   b. 然后,建立一个和显示设备兼容的内存DC
   c. 然后把CBitmap放在建立的内存DC中
   d. 然后,在内存DC上做一些画图的动作
   e. 将内存DC中的东西,显示在屏幕上
4. 代码中的一些其他操作
   a. 我们常用SelectObject把新的东西选入。把老的东西作为返回值,保存。再使用完毕后,在用SelectObject重新启用老的东西
   b. 在代码里面有设置滚动条的地方。 使用CScrollView类作为基类。给SIZE结构体赋值,然后调用SetScrollSizes做设置,滚动条就会自动计算响应的。
在 MFC ,使用双缓冲技术可以有效地减少屏幕闪烁和图像撕裂等现象,提高图像显示的质量。以下是使用双缓冲显示一幅图像以及鸟瞰图的步骤: 1. 创建一个 CBitmap 对象,并将其关联到要显示的图像文件。 2. 创建一个 CDC 对象,并将其关联到 CBitmap 对象。 3. 创建一个内存 DC,使用 CreateCompatibleDC() 函数创建一个与屏幕兼容的 DC 对象。 4. 创建一个内存位图,使用 CreateCompatibleBitmap() 函数创建一个与屏幕兼容的位图对象。 5. 将内存位图与内存 DC 关联起来,使用 SelectObject() 函数。 6. 在内存 DC 绘制图像,使用 BitBlt() 函数将图像绘制到内存位图。 7. 将内存位图绘制到屏幕上,使用 BitBlt() 函数将内存位图的图像绘制到屏幕 DC 。 8. 释放资源,删除内存 DC 和内存位图对象。 以下是示例代码: ```cpp CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); // 加载显示的图像文件 CDC dc; dc.CreateCompatibleDC(nullptr); dc.SelectObject(&bmp); // 将 CDC 对象关联到 CBitmap 对象 CRect rect; GetClientRect(&rect); // 获取客户区矩形 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap memBitmap; memBitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); memDC.SelectObject(&memBitmap); // 创建内存 DC 和内存位图,并将其关联起来 memDC.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY); // 在内存 DC 绘制图像 CPaintDC paintDC(this); paintDC.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); // 将内存位图绘制到屏幕上 memDC.SelectObject(nullptr); memBitmap.DeleteObject(); memDC.DeleteDC(); // 释放资源,删除内存 DC 和内存位图对象 ``` 以上代码演示了如何使用双缓冲显示一幅图像。如果要显示鸟瞰图,只需要在内存 DC 绘制鸟瞰图即可。具体实现方法可以参考上述代码,只需要将图像文件替换为鸟瞰图即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值