用挂钩自绘了另存为窗口的边框,四个边框都用PNG图贴上,结果点一下另存为对话框的ToolBar整个桌面就闪一下,
是整个桌面都闪一下,切换一次ToolBar就闪一次,求原因:         Gdiplus::Bitmap bmp(rc.Width(), rc.Height());
Graphics g_Mem(&bmp);

// Left draw.
CRect rcDestLeft(rc.left, rc.top, rc.left+m_rcMargin.left, rc.bottom);
m_rgnDraw.DeleteObject();
m_rgnDraw.CreateRectRgnIndirect(&rcDestLeft);
pdc->SelectClipRgn(&m_rgnDraw); Gdiplus::Rect rtMemLeft(rcDestLeft.left, rcDestLeft.top, 
rcDestLeft.Width(), rcDestLeft.Height()); g_Mem.DrawImage(pStateBmp, rtMemLeft,
rcState.left, rcState.top, m_rcMargin.left, rcState.Height(),
UnitPixel); // Right draw.
CRect rcDestRight(rc.right-m_rcMargin.right, rc.top,
rc.right, rc.bottom);
m_rgnDraw.DeleteObject();
m_rgnDraw.CreateRectRgnIndirect(&rcDestRight);
pdc->SelectClipRgn(&m_rgnDraw, RGN_OR);    Gdiplus::Rect rtMemRight(rcDestRight.left, rcDestRight.top,
rcDestRight.Width(), rcDestRight.Height()); g_Mem.DrawImage(pStateBmp, rtMemRight,
rcState.right-m_rcMargin.right, rcState.top,
m_rcMargin.right, rcState.Height(), 
UnitPixel); // Top draw.
CRect rcDestTop(rc.left+m_rcMargin.left, rc.top,
rc.right-m_rcMargin.right, m_rcMargin.top);
m_rgnDraw.DeleteObject();
m_rgnDraw.CreateRectRgnIndirect(&rcDestTop);
pdc->SelectClipRgn(&m_rgnDraw, RGN_OR);    Gdiplus::Rect  rtMemTop(rcDestTop.left, rcDestTop.top, 
rcDestTop.Width(), rcDestTop.Height()); g_Mem.DrawImage(pStateBmp, rtMemTop,
rcState.left+m_rcMargin.left, rcState.top,
rcState.Width()-m_rcMargin.left-m_rcMargin.right,
m_rcMargin.top,
UnitPixel); // Bottom draw.
CRect rcDestBtm(rc.left+m_rcMargin.left, rc.bottom-m_rcMargin.bottom,
rc.right-m_rcMargin.right, rc.bottom);
m_rgnDraw.DeleteObject();
m_rgnDraw.CreateRectRgnIndirect(&rcDestBtm);
pdc->SelectClipRgn(&m_rgnDraw, RGN_OR); Gdiplus::Rect  rtMemBtm(rcDestBtm.left, rcDestBtm.top, 
rcDestBtm.Width(), rcDestBtm.Height()); g_Mem.DrawImage(pStateBmp, rtMemBtm,
rcState.left+m_rcMargin.left, rcState.bottom-m_rcMargin.bottom,
rcState.Width()-m_rcMargin.left-m_rcMargin.right,
m_rcMargin.bottom,
UnitPixel); Graphics g(pdc->GetSafeHdc());    Gdiplus::Rect rtDest(rc.left, rc.top, rc.Width(), rc.Height());
g.DrawImage(&bmp, rtDest, 0, 0, bmp.GetWidth(), bmp.GetHeight(), UnitPixel);上面代码是绘制边框用到的,pdc为windowdc,rc为窗口坐标,1.如果把最后一句g.DrawImage(&bmp, rtDest, 0, 0, bmp.GetWidth(), bmp.GetHeight(), UnitPixel);
屏蔽或改成其他如FillPath之类的函数,桌面不会闪,
pStateBmp图片较大,不知道是否这个原因引起的,求高手指点, 在线等。

解决方案 »

  1.   

    我也遇到类似的问题,代码如下:
    if (rc.IsRectNull()) 
    {
    CSize sz = GetImageSize();
    rc.right = sz.cx;
    rc.bottom = sz.cy;
    }
    if (rcCut.IsRectNull())
    {
    CSize sz = GetImageSize();
    rcCut.right = sz.cx;
    rcCut.bottom = sz.cy;
    }
    Rect rect(rc.left, rc.top, rc.Width(), rc.Height());
    Graphics graphics(pDC->m_hDC);
    graphics.SetInterpolationMode(m_npMode);
    graphics.DrawImage(m_pBitmap, rect, rcCut.left, rcCut.top, rcCut.Width(), rcCut.Height(), UnitPixel);这段代码是每隔一段时间,就执行一次,这样如果所刷新的界面不在当前界面,在执行完
    graphics.DrawImage(m_pBitmap, rect, rcCut.left, rcCut.top, rcCut.Width(), rcCut.Height(), UnitPixel)后,就会出现所刷新的图片覆盖到当前界面的情况,当这种情况在我老机器上不产生,当时
    到我新买的机器上就出现了。
    同样求解,谢谢。