我要在一个DIB图上画一个十字线,当鼠标左键按下并移动时,这个十字线跟着移动,DIB图不移动,问题是:鼠标移动时不停的刷新屏幕,图像闪烁的很厉害!!
我直接在OnEraseBkgnd中返回TRUE,但这样的话在程序运行时,背景就不会刷新(比如:在程序运行前,桌面是蓝色的,当程序运行后,视图区就是刚才的那个蓝色),这个问题我实在不知道怎么解决!
 请大家指点,谢谢!!!

解决方案 »

  1.   

    在OnEraseBkgnd中只画位图并返回TRUE,在onpaint或ondraw中画十字线如果画十字线采用异或模式,那么就不用频繁的重画背景位图了,在原位置画线,在画一次就清除了
      

  2.   

    双缓冲,响应WM_PAINT时也需要绘制背景。
      

  3.   

    双缓冲绘图例子:
    void CMemDCView::OnDraw(CDC* pDC)
    {
    CMemDCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); // TODO: add draw code for native data here
    CDC MemDC;
    MemDC.CreateCompatibleDC( pDC);
    CRect rect;
    this->GetClientRect(rect); 
    CBitmap bmpFace;
    bmpFace.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
    CBitmap* pOldBmp = NULL;
    pOldBmp = MemDC.SelectObject(&bmpFace);
    CBrush brush(RGB(255,255,255));
    MemDC.FillRect(rect,&brush);
    for(int i=0;i<500;i++)
    {
    MemDC.MoveTo(22+i,22);
    MemDC.LineTo(22+i,277);
    }
    pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,rect.left,rect.top,SRCCOPY);
    MemDC.SelectObject(pOldBmp);
    bmpFace.DeleteObject();}
      

  4.   

    双缓冲
    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.MoveTo(……);
    MemDC.LineTo(……);//将内存中的图拷贝到屏幕上进行显示
    pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
      

  5.   

    TO: orbit(走了走了)
      什么是异或模式啊,请你说详细一些,我不大懂哦!