在网上看了很多材料,要将一张位图设置为对话框的背景,只需要重新编写OnPaint()函数即可。
    当一个工程中包含有多个对话框,在创建时,只有主对话框对应的cpp文件才会自动生成OnPaint()函数,在主对话框的这个函数中添加相应的代码,可以将位图设置为对话框的背景。但是创建其他对话框时,没自动生成OnPaint()函数,自己在相应的cpp文件中添加这函数,没有达到预想的效果——即背景还是原来的灰色,而不是我所需要的位图。
    请问要怎么将一张位图设置为各子对话框的背景。除了添加OnPaint()函数之外,还需要做些什么?    其中,OnPaint()函数如下,else中的代码是自己添加的,其他代码由VS2008自动生成:
    void MainMenuDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CDialog::OnPaint();
CPaintDC dc(this);
CRect rect;
GetClientRect( &rect );
CDC dcMem;
dcMem.CreateCompatibleDC( &dc );
CBitmap bmpBackground;
bmpBackground.LoadBitmap( IDB_BITMAP );
BITMAP bitmap;
bmpBackground.GetBitmap( &bitmap );
CBitmap *pbmpOld = dcMem.SelectObject( &bmpBackground );
dc.StretchBlt( 0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY );
}
}    

解决方案 »

  1.   


    1.
    CGdiObject::DeleteObject()
    删除你Load的位图
    2. 
    查看你其他对话框类的LoadBitmap()函数返回值 3.
    如果对话框全覆盖了 可以在OnEraseBackGround()函数中直接返回TRUE欢迎楼下补充...
      

  2.   

    自己派生出来一个对话框类,然后在OnPaint里搞你想搞的。
    新建的对话框从这个类派生。
      

  3.   


    按您这么做的话,能实现什么样的效果呢?
    LoadBitmap()函数不是系统API么,返回值不是都一样么?
    还有,我现在遇到的情况是,同样的代码,只有主对话框的背景被替换为位图(也就是我想要达到的效果),其他子对话框完全没有效果,还和没添加OnPaint()函数时一样,没有任何变化。
      

  4.   

    一个笨办法,在界面上拖一个pictrueControl控件,将Tab顺序设置为1, 然后再OnDraw()里绘制图片或者直接将图片放到资源里加载
      

  5.   

        搞定了,还是用我最早用的方法,即重载OnPaint()函数。
        原因出在,VS2008没有了Class Wizard,所以我自己在添加了OnPaint()函数后,没有将其与ON_WM_PAINT()消息做关联,因而达不都预想的效果!!
      

  6.   

    OnPaint()也是调用OnDraw()进行绘制
    在OnDraw()中绘制更好一些