各位大哥,我是用的MDI的窗口模式,我在首先出现的FormView里面加载了背景图。
加载的方式如下,但是只要出现窗口切换或别的程序窗口覆盖,就闪动历害,应该怎么处理呢?
如果不用Invalidate();,就在窗口切换或别的程序窗口覆盖有破碎的界面在背景图上面。
各位大哥求救了。否则真的是下岗了喔,因为没有达到要求喔。老板不同意呀。BOOL CFormSee::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default Invalidate();
if(m_runFirst)
{
m_bitmap.LoadBitmap(IDB_MAIN);
if(!m_bitmap.m_hObject)
return false;
}
CRect rect;
GetClientRect(&rect);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap);
int bmw, bmh ;
BITMAP bmap;
m_bitmap.GetBitmap(&bmap);
bmw = bmap.bmWidth;
bmh = bmap.bmHeight;
int xo=0, yo=0;
pDC->GetClipBox(&rect);     // 擦除所需的区域
pDC->StretchBlt(xo, yo, rect.Width(),rect.Height(), &dc,0, 0,rect.Width(),rect.Height(), SRCCOPY);
dc.SelectObject(pOldBitmap);
m_runFirst=false; UpdateWindow();
return true;}

解决方案 »

  1.   

    这个消息本来就是在系统需要重画的时候才发给你的,可是你又调用Invalidate();强制让窗口刷新了一次,而且是默认清除的方式(Invalidate的默认参数为清除窗口内容),窗口怎么会不闪烁?
    而且你的背景画完了又调用UpdateWindows再次把窗口强行刷新了一次,所以......
      

  2.   

    去掉 Invalidate 和 UpdateWindows
      

  3.   

    把绘图放到 OnPaint 里去,在 OnEraseBkgnd 中直接 return TRUE;
    另外在绘图代码中不要 Invalidate 也不要 UpdateWindow
      

  4.   

    to:huwei001982(編程浪子) :如果去掉去掉 Invalidate 和 UpdateWindows
    就会出现拉动滚动条的时候出现重影背景,别的程序窗口在它上面时候再切换就有别的窗口一部分内容在里面,不能够完全刷新。应该怎么处理呢?
    to:qrlvls(空 气) 我试着在ONPAINT 里面处理,但是onpaint的函数原型没有CDC* pDC这个参数呀。
    我怎么样得到这个PDC呢?谢谢楼上几位大哥了呢。求救!
      

  5.   

    to:
    ShiGang(Sucess) 
    这个应该怎么处理呢?谢谢,能给详细点吗?谢谢。急。
      

  6.   

    如:
    CRect rcClient;
    CDC MemDC,MaskDC;BITMAP Bmp;
    CBitmap Bitmap;

    GetClientRect(&rcClient);
    MaskDC.CreateCompatibleDC(&dc);
    MaskDC.SelectObject(&m_BkImage);
    m_BkImage.GetObject(sizeof(Bmp),&Bmp); MemDC.CreateCompatibleDC(&dc);
    Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
    MemDC.SelectObject(&Bitmap);
    //..................
    //進行畫圖及設置底色.
    //..................
    MemDC.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MaskDC,0,0,Bmp.bmWidth,Bmp.bmHeight,SRCAND); dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
    MaskDC.DeleteDC();
    MemDC.DeleteDC();
    Bitmap.DeleteObject();
      

  7.   

    OnPaint 中通过CPaint dc(this);来获取窗口的 DC
      

  8.   

    to:ShiGang(Sucess) 
    1、m_BkImage 是怎么来的呢?是类中就已经定义的吗?
    2、这个整段程序代码是放在哪个函数里面呢?
    谢谢了。希望就在眼前了。谢谢帮助。
      

  9.   

    放在OnPaint中吧:CRect rcClient;
    CDC MemDC,MaskDC;BITMAP Bmp;
    CBitmap Bitmap;GetClientRect(&rcClient);
    MemDC.CreateCompatibleDC(&dc);
    Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
    MemDC.SelectObject(&Bitmap);
    //..................
    //進行畫圖及設置底色.
    //..................
    dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
    MemDC.DeleteDC();
    Bitmap.DeleteObject();
      

  10.   

    同意 qrlvls(空 气) 
    避免闪烁这算是标准解决方案
    另外可以在OnPaint() 里使用双缓冲,可以使更复杂的绘图避免闪烁
      

  11.   

    to:ShiGang(Sucess) 谢谢你了。我已经解决。不过还有一个问题,在拖动滚动条的时候就会出现背景图重影的情况,不知有兄弟是否知道。谢谢。我来把方法说一下,方便以后的兄弟们;
    1、重载 BOOL CFormSee::OnEraseBkgnd(CDC* pDC) ,去掉它的墨认返回值,直接返回true;
    2、重载 void CFormSee::OnPaint() ;
    添加如下代码:
    CPaintDC dc(this); // 这句话本来就存在。
    CDC MemDC;//创建内存DC;
    CRect rcClient;
    GetClientRect(&rcClient);//得到客户区域/
    MemDC.CreateCompatibleDC(&dc); /*创建内存DC*/
    MemDC.SelectObject(&m_bitmap); 
             /*m_bitmap是创建的一个图像类。m_bitmap.LoadBitmap(IDB_MAIN);*/
    dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);/*COPY内存DC*/
    MemDC.DeleteDC();
       //基本完成。
       //不过还有一个问题,在拖动滚动条的时候就会出现背景图重影的情况,不知有兄弟是否知道。谢谢。