从文件中加载位图,双缓冲显示

整个程序的流程是一样的,不明白的,可以看上一篇。局域网即时通讯
这里主要的 不同是怎样产生CBitmap对象。
从资源中加载是:
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP1)从文件中加载是:
    CBitmap bitmap;
    bitmap.m_hObject=(HBITMAP)::LoadImage(NULL,"test.bmp",IMAGE_BITMAP,500,400,LR_LOADFROMFILE);
这里需要注意的是从文件加载位图,并不是通过调用CBitmap的成员函数完成。
而是使用SDK函数LoadImage,通过将其返回值赋值给CBitmap的成员变量m_hObject而完成对CBitmap的对象的赋值过程。
此处的强制类型可以不使用,使用是强调的意思。

完全从文件加载位图,双缓冲代码如下,放在OnDraw(CDC* pDC)函数中即可。     CBitmap bitmap;
    bitmap.m_hObject=(HBITMAP)::LoadImage(NULL,"test.bmp",IMAGE_BITMAP,500,400,LR_LOADFROMFILE);
    if (bitmap.m_hObject)
    {
        // Get the size of the bitmap
        BITMAP bmpInfo;
        bitmap.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(&bitmap);
       
        // 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 * 2, bmpInfo.bmHeight * 2, &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"); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值