用SDI做了个简单界面. 
class CLightView : public CScrollView
{
public: // create from serialization only
CLightView();
DECLARE_DYNCREATE(CLightView)// Attributes
public:
CBrush brushBkColor; 
int maxX,maxY;
CDC* m_pMemDC;
CBitmap* m_pBitmap;
// Operations
....
}int CLightView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//得到屏幕尺寸
maxX=GetSystemMetrics(SM_CXSCREEN);
maxY=GetSystemMetrics(SM_CYSCREEN); maxX = 2000;
maxY = 2000;
//创建内存DC和位图
CDC* pDC= GetDC();
m_pMemDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,maxX,maxY);
m_pMemDC->SelectObject(m_pBitmap);
ReleaseDC(pDC); //初始化内存DC为全黑
CBrush brush;
brush.CreateStockObject(BLACK_BRUSH);
CBrush* poldbrush = m_pMemDC->SelectObject(&brush);
m_pMemDC->PatBlt(0,0,maxX,maxY,PATCOPY);
m_pMemDC->SelectObject(poldbrush);

return 0;
}void CLightView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate(); CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 2000;
SetScrollSizes(MM_TEXT, sizeTotal);
}void CLightView::OnDraw(CDC* pDC)
{
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
pDC->BitBlt(0,0,2000,2000,m_pMemDC,0,0,SRCCOPY);
}测试时候, 发现如果不停移动该窗口时候, 屏幕闪的很厉害. 我现在是用单缓冲将在view上画的图案保存在m_pMemDC中.
在OnDraw重绘中将m_pMemDC中的东西使用BitBlt拷贝到pDC上. 请问如何可以改善移动屏幕OnDraw导致屏闪问题?

解决方案 »

  1.   

    响应 刷新 屏幕的消息,屏蔽它, 消息好像是 WM_E... 啥的。很容易找到。
      

  2.   

    WM_ERASEBKGND直接return TRUE;
    或者双缓冲
      

  3.   

    把你绘图的操作放到OnDraw中去
      

  4.   

    把你的绘图的代码最好放到OnDraw中去做~
      

  5.   

    WM_ERASEBKGND直接return TRUE;
    搞定了. 谢谢各位.
    另外, 因为程序画的图比较多. 很多函数里都可以画. 因此放到OnDraw中不方便. 还是统一画到内存中.