我在OnPaint时间中添加如下代码,来绘制窗口的背景图片.if (IsIconic()){
//...
}else {
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CBitmap bmpBG;
//背景贴图
//bmpBG.LoadBitmap(IDB_BG);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&bmpBG);
dc.StretchBlt(1,1,rect.Width(),rect.Height(),
&memDC,0,0,rect.Width(),rect.Height(),
SRCCOPY);
bmpBG.DeleteObject();
memDC.DeleteDC();
}
并在OnInitDialog中将窗口置顶。
//窗口置顶
SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 
但是我发现当我拖动其他窗口从我的窗口(比如QQd登录窗口)移动过去的时候,QQ登录窗口走过的地方背景图刷新有的时候会迟钝,依然刷成了灰白色。
实在搞不清楚原因,请教大侠。

解决方案 »

  1.   

    CBitmap bmpBG;//背景贴图
    //bmpBG.LoadBitmap(IDB_BG);CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    memDC.SelectObject(&bmpBG);dc.StretchBlt(1,1,rect.Width(),rect.Height(),
            &memDC,0,0,rect.Width(),rect.Height(),
            SRCCOPY);
    bmpBG.DeleteObject();
    memDC.DeleteDC();你最后应该memDC.SelectObject()先前的bmp(用CBitmap*保存你的mem.SelectObject(&bmpBG)
    你最后的bmpBG.DeletObject();应该是调用失败的
      

  2.   

    这个是现在的代码,前面的发错了if (IsIconic()){
    //...
    }else {
    CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);
    CBitmap bmpBG;
    //背景贴图
    bmpBG.LoadBitmap(IDB_BG);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    memDC.SelectObject(&bmpBG);
    dc.StretchBlt(1,1,rect.Width(),rect.Height(),
            &memDC,0,0,rect.Width(),rect.Height(),
            SRCCOPY);
    bmpBG.DeleteObject();
    memDC.DeleteDC();
    }
      

  3.   

    CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);
    CBitmap bmpBG;
    //背景贴图
    bmpBG.LoadBitmap(IDB_BG);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap* bmp = (CBitmap*)memDC.SelectObject(&bmpBG);dc.StretchBlt(1,1,rect.Width(),rect.Height(),
            &memDC,0,0,rect.Width(),rect.Height(),
            SRCCOPY);
    memDC.SelectObject(bmp);bmpBG.DeleteObject();
    memDC.DeleteDC();修改了一下你else语句部分的代码
      

  4.   

    主要是因为重复装载图片效率太低。解决方法,将CBitmap bmpBG定义为对话框的成员变量,在OnInitDialog中
    调用bmpBG.LoadBitmap(IDB_BG);OnPaint改为
    if (IsIconic()){
    //...
    }else {
    CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap* bmp = (CBitmap*)memDC.SelectObject(&bmpBG);
    dc.StretchBlt(1,1,rect.Width(),rect.Height(),
    &memDC,0,0,rect.Width(),rect.Height(),
    SRCCOPY);
    memDC.SelectObject(bmp);
    //bmpBG.DeleteObject();
    memDC.DeleteDC();
    CDialog::OnPaint();
    }
    }
      

  5.   

    发现把最后的CDialog::OnPaint()去掉,就没这个现象了CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);

    CBitmap bmpBG;
    //背景贴图
    bmpBG.LoadBitmap(IDB_BG); CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap * pBmp = (CBitmap *)memDC.SelectObject(&bmpBG);
    dc.StretchBlt(1,1,rect.Width(),rect.Height(),
    &memDC,0,0,rect.Width(),rect.Height(),
    SRCCOPY);
    memDC.SelectObject(pBmp);
                    bmpBG.DeleteObject();
    memDC.DeleteDC();

    ReleaseDC(&dc);
    //CDialog::OnPaint();
      

  6.   

    就是要去掉//CDialog::OnPaint();啊,你都自己绘图了,还让父类绘干嘛,和CXXWnd::OnPaint的时候一样,放心啦~