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
  • 相关阅读:
    [译]rabbitmq 2.1 Consumers and producers (not an economics lesson)
    mysql存储过程执行权限问题
    修改linux端口范围 ip_local_port_range
    centos6 自启动任务
    randomize_va_space
    linux 捕获信号处理中遇到的死锁
    squid基础配置
    [转]你应该了解的 一些web缓存相关的概念
    libevent简介 构成
    Libevent windows/linux下编译
  • 原文地址:https://www.cnblogs.com/zfluo/p/5131850.html
Copyright © 2011-2022 走看看