• 双缓冲绘图


    (1) GDI这样做

    CDC MemDC; //首先定义一个显示设备对象

    CBitmap MemBitmap;//定义一个位图对象

    //随后建立与屏幕显示兼容的内存显示设备

    MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画

    //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中

    //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上

    CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

    //先用背景色将位图清除干净,这里我用的是白色作为背景,你也可以用自己应该用的颜色

    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

    //绘图
    /***

    使用MemDC画图

    ****/

    //将内存中的图拷贝到屏幕上进行显示
    pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

    //绘图完成后的清理

    MemBitmap.DeleteObject();

    MemDC.DeleteDC();


    (2) GDI+这样做

    GDI+无闪烁绘图的原理就是不直接在OnDraw函数下绘图,而是先创建个Bitmap对象,然后用刚才的Bitmap对象创建一个Graphics的内存图像,然后所有的绘图操作都在
    内存图像中进行,最后用DrawImage方法把内存图像显示到屏幕。

    void CDataView::OnDraw(CDC* pDC)
    {
    CDocument* pDoc = GetDocument();
    // TODO: 在此添加绘制代码

    pDC->TextOut(100,100,L"数据视图");

    Graphics g(pDC->m_hDC);

    CRect rcClient;
    GetClientRect(&rcClient);
    Bitmap bmp(rcClient.Width(), rcClient.Height());
    Graphics * buffergraphics = Graphics::FromImage(&bmp);//关键部分,创建一个内存图像
    SolidBrush brush(Color(255, 0,0, 255));
    buffergraphics ->FillRectangle(&brush,0, 0, rcClient.Width(),rcClient.Height()); //在内存图像中画图

    g.DrawImage(&bmp,0, 0, rcClient.Width(), rcClient.Height());//将内存图像显示到屏幕
    delete buffergraphics ;
    g.ReleaseHDC(pDC->m_hDC);

    }

  • 相关阅读:
    C#编程(四十一)----------用户定义的数据类型转换
    C#编程(四十)----------运算符重载
    C#编程(三十九)----------比较对象的相等性
    下载mqtt.fx
    python3 mqtt 客户端以及服务端
    mac 下使用nasm
    shell equal
    python client.py
    常见面试题
    mysql 包含查找
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4636015.html
Copyright © 2020-2023  润新知