照着msdn的说明用win api写了一个MDI程序,只要一拖动最外面的Frame窗口,里面的子窗口就狂闪不已,而MFC生成的MDI就一点也不闪。还有masm32v7自带的mdi例子也根本觉察不到闪动。而我用spy++看了消息循环和窗口的style,跟masm32的例子的一模一样,并且所有的窗口过程我都仿造masm例子重写了,结果还着不行。这有可能是什么原因啊?

解决方案 »

  1.   

    >如果真是一模一样,那还有什么问题
    我说的是“消息循环和窗口的style”,所以我才迷惑不解啊。代码太长了,不好贴,愿意帮忙看看的可以ftp来取:
    61.132.49.121
    user: csdn
    pass: visio
      

  2.   

    当使视窗的某一区域无效时,系统将发送WM_UPDATE消息,引发视类OnDrawH绻皇窃贠nDraw()函数中简单地将所有的图形对象重画,将引起明显的闪烁。因此,需要做相应的处理。本系统采用了先在内存中绘制图形,然后再把绘好的图形以位图方式从内存拷贝到窗口客户?
    void CDrawView::OnDraw(CDC* pDC) 

    CDrawDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc); CDC dc; 
    CBitmap bitmap; CBitmap* pOldBitmap; 
    CRect client; 
    CRect rect; 
    pDC->GetClipBox(client);//检取无效区 
    GetClientRect(rect);//检取整个客户区 
    if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境 

    if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), 
    rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区 

    OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系 
    pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境 
    dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区 
    dc.IntersectClipRect(client);//再“与上”检取的无效区,使 
    //内存环境与pDC检取的无效区相等 


    CBrush brush; 
    if(!brush.CreateSolidBrush(RGB(255,255,255))) 
    return  
    brush.UnrealizeObject(); 
    dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 if(m_drawObjs.GetCount()!=0) 
    Draw(&dc);//将所有的画图对象在内存裁减区内重画 
    pDC->BitBlt(client.left,client.top,client.Width(),client.Height(), 
    &dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图 
    //拷贝到窗口裁减区 
    dc.SelectObject(pOldBitmap); } 当视图重画时,会引起屏幕的闪烁,解决的一个方法是先在内存中画好图形,然后用 
    位图的方法将内存中画好的图象拷贝到屏幕上。
    ________供参考
      

  3.   

    如果你没有重载OnDraw,而只有OnPaint(),那么你看看在OnPaint()最后你是否加上了CWnd::OnPaint(),如果没有这个默认调用,就会闪烁的
      

  4.   

    谢谢各位回答
    可能我没说清楚,我的mdi程序是用纯Win32 API写的,没使用mfc. mfc的mdi程序是没有这个问题的,我比较过了
      

  5.   

    而且即使窗口是空的,没有任何控件和子窗口,当拖动总窗口(Frame)或改变总窗口大小时也一样的闪烁