我在OnInitDialog()中用下列语句来加载一个指定的位图并把它作为对话框的背景,但是总是显示不出来,高手帮忙看看阿
char szPath[200];
memset(szPath,0,sizeof(szPath));
GetCurrentDirectory(sizeof(szPath),szPath);
CString strPath;
strPath = szPath;
strPath = strPath + "\\首页背景.bmp";
RECT DlgRect;
GetClientRect(&DlgRect);
int cx = DlgRect.right- DlgRect.left;
int cy = DlgRect.bottom- DlgRect.top; CDC dcMem;
CDC *pDC = GetDC();
// CClientDC m_dc(this);
CBitmap bitmap;
HBITMAP hbmpOld;
hbmpOld=(HBITMAP)LoadImage(0,strPath,IMAGE_BITMAP,cx,cy,LR_LOADFROMFILE);
// 设定位图的高和宽(cx,cy)
    bitmap.Attach(hbmpOld);
    BITMAP bmp;
bitmap.GetBitmap(&bmp);
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

pDC->BitBlt(0,0,cx,cy,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
DeleteObject(bitmap.Detach());

解决方案 »

  1.   

    不能放在OnInitDialog里,因为OnInitDialog在OnPaint之前执行,你即使在OnInitDialog里把位图画上去了,OnPaint函数也给你擦掉了。   把这段代码放到OnEraseBkGND()函数里去(把class wizard翻到最后一页,把message filter改成window,然后处理WM_ERASEBKGND消息)。
      

  2.   

    webber84(***闭关修炼中***) ,我在OnEraseBkGND()中处理后界面反复闪烁,最后还是没有啊
      

  3.   

    看看你的bitmap有没有正确地加载。另外OnEraseBkGND里要直接返回true,不要调用基类的函数。
      

  4.   

    重载的 OnEraseBkgnd 应该返回 TRUE, 而不是 FALSE 或 0
      

  5.   

    你放在OnInitDialog()中,就是绘制位图的代码没有问题,肯定不能显示出来的,因为对话框在显示出来后,会重新刷新显示。所以你应该在OnPanit(...)中,调用显示位图的代码
      

  6.   

    webber84(***闭关修炼中***) 
      说的对,但是我看了他的代码,我觉得这辆句代码:
    BITMAP bmp;
    bitmap.GetBitmap(&bmp);
    好像在这里没有什么用阿,另外好像CDC *pDC = GetDC();
    也纯粹是多余的。不知对否?