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

从资源中加载显示位图,通过双缓冲的方法显示。
如何使用下面的代码。
1. 把位图导入资源。局域网即时通讯
资源->入->选bmp类型->导入->从硬盘中选择导入的bmp图即可。导入后,自动生成ID为IDB_BITMAP1的资源Bitmap.
2. 把下面代码复制到视图的OnDraw(CDC* pDC)函数

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


       
        // Select the bitmap into the in-memory DC
        CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
       
        // Find a centerpoint for the bitmap in the client area
        CRect rect;
        GetClientRect(&rect);
        int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
        int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;

        POINT ptstart, ptend;
        ptstart.x = ptstart.y = 0;
        ptend.x = ptend.y = 500;
       
       
        dcMemory.MoveTo(ptstart);
        dcMemory.LineTo(ptend);
       

       
        // Copy the bits from the in-memory DC into the on-
        // screen DC to actually do the painting. Use the centerpoint
        // we computed for the target offset.
        pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
            0, 0, SRCCOPY);
       
        dcMemory.SelectObject(pOldBitmap);

        SIZE si;
        si.cx = bmpInfo.bmWidth;
        si.cy = bmpInfo.bmHeight;
        SetScrollSizes(MM_TEXT, si);
    }
    else
        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、付费专栏及课程。

余额充值