zoukankan      html  css  js  c++  java
  • MFC消除视图闪烁

    1,加入类MemDC.h(我的文档ResourcesSkill_vcMemdc.h)
    2,OnDraw中
        CMemDC MemDC(pDC);
        并将绘制部分的pDC更换为MemDC
    3,OnEraseBkgnd中
        return TRUE;
        直接返回真值
    注:
      更改背景颜色重载 虚拟函数 OnPrepareDC,
      pDC ->SetBkColor(RGB(..,..,..));

    以下为MemDC.h的所有内容,只要复制到一个.h文件,然后包含到工程就可以用!
    #ifndef _MEMDC_H_
    #define _MEMDC_H_

    //////////////////////////////////////////////////
    // CMemDC - memory DC
    //
    // Author: Keith Rule
    // Email:  keithr@europa.com
    // Copyright 1996-1999, Keith Rule
    //
    // You may freely use or modify this code provided this
    // Copyright is included in all derived versions.
    //
    // History - 10/3/97 Fixed scrolling bug.
    //                   Added print support. - KR
    //
    //           11/3/99 Fixed most common complaint. Added
    //                   background color fill. - KR
    //
    //           11/3/99 Added support for mapping modes other than
    //                   MM_TEXT as suggested by Lee Sang Hun. - KR
    //
    // This class implements a memory Device Context which allows
    // flicker free drawing.

    class CMemDC : public CDC {
    private:
    CBitmap m_bitmap; // Offscreen bitmap
    CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
    CDC* m_pDC; // Saves CDC passed in constructor
    CRect m_rect; // Rectangle of drawing area.
    BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
    public:

    CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
    {
    ASSERT(pDC != NULL); 

    // Some initialization
    m_pDC = pDC;
    m_oldBitmap = NULL;
    m_bMemDC = !pDC->IsPrinting();

    // Get the rectangle to draw
    if (pRect == NULL) {
    pDC->GetClipBox(&m_rect);
    } else {
    m_rect = *pRect;
    }

    if (m_bMemDC) {
    // Create a Memory DC
    CreateCompatibleDC(pDC);
    pDC->LPtoDP(&m_rect);

    m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
    m_oldBitmap = SelectObject(&m_bitmap);

    SetMapMode(pDC->GetMapMode());
    pDC->DPtoLP(&m_rect);
    SetWindowOrg(m_rect.left, m_rect.top);
    } else {
    // Make a copy of the relevent parts of the current DC for printing
    m_bPrinting = pDC->m_bPrinting;
    m_hDC       = pDC->m_hDC;
    m_hAttribDC = pDC->m_hAttribDC;
    }

    // Fill background 
    FillSolidRect(m_rect, pDC->GetBkColor());
    }


    ~CMemDC()
    {
    if (m_bMemDC) {
    // Copy the offscreen bitmap onto the screen.
    m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
    this, m_rect.left, m_rect.top, SRCCOPY);

    //Swap back the original bitmap.
    SelectObject(m_oldBitmap);
    } else {
    // All we need to do is replace the DC with an illegal value,
    // this keeps us from accidently deleting the handles associated with
    // the CDC that was passed to the constructor.
    m_hDC = m_hAttribDC = NULL;
    }
    }

    // Allow usage as a pointer
    CMemDC* operator->() 
    {
    return this;
    }

    // Allow usage as a pointer
    operator CMemDC*() 
    {
    return this;
    }
    };

    #endif
  • 相关阅读:
    NOI2010 超级钢琴
    [linux][nginx] 常用2
    [linux][nginx] 常用
    [PHP]听说随机数mt_rand()比rand()速度快,闲的无聊测试了一下!
    [linux] 权限问题
    [Laravel] 自带分页实现以及links方法不存在错误
    [YII2] 去除自带js,加载自己的JS,然后ajax(json)传值接值!
    [PHP]PHP设计模式:单例模式
    [html]浏览器标签小图标LOGO简单设置
    [javascript]JS获取当前时间戳的方法
  • 原文地址:https://www.cnblogs.com/zfluo/p/5131850.html
Copyright © 2011-2022 走看看