我在对话框上绘制的图画,刷新时闪烁怎么解决?
还有在内存中绘好图,到底可不可以用BitBlt贴到对话框上?

解决方案 »

  1.   

    响应WM_ERASEBKGND消息,直接返回TRUE。
    当然可以,不然“双缓冲”还有什么用。
      

  2.   

    使用双缓冲
    建立一个和当前DC 一栏的内存DC(保存住直到不用时在释放)
    然后在内存DC中画,刷新时直接帖上去
    拦截WM_ERASEBKGND不要让其擦除背景(什么也不做,直接返回就好了)
      

  3.   

    HDC hMemDC = CreateCompatibleDC(GetDC());
    HBITMAP = CreateCompatibleBitmap(GetDC());
    SelectObject(hMemDC, hMemBmp);
    ...
    画到hMemDC;
    ...
    OnPaint()
    {
    ...
    BitBlt(hdc, ..., hMemDC, ..., SRCCOPY);
    ...
    }
      

  4.   

    BOOL  CTestDlg::OnEraseBkgnd(CDC  *pDC) 
    {  CDCmemDC; 
    CBitmap MPlayer; 
    if(!MPlayer.LoadBitmap(IDB_BITMAPBACKGROUND)) //装载界面位图 
    return FALSE; 
    memDC.CreateCompatibleDC(pDC);//创建兼容的设备 
    CBitmap *pOldBmp=memDC.SelectObject(&MPlayer);//将位图选进设备 
    pDC->BitBlt(0,0,MPLAYERWIDTH,MPLAYEREXT,&memDC,1,1,SRCCOPY);//设备之间的拷贝 
    memDC.SelectObject(pOldBmp);//恢复设备 
    return  TRUE;  
    }  
    放在onpain中一样,小加修改就可以了
      

  5.   

    如果在OnDraw函数中重绘就会造成闪烁,如果在WM_ERASEBKGND消息中重绘应该会好点,如果还闪的厉害就不知道了。