我创建了个基于对话框的工程,我的意思是要用一副位图替换原来的灰色对话框背景的,我通过在对话框的OnEraseBkgnd函数中增加类似如下的代码来实现
BOOL CTestBackgroundDlg::OnEraseBkgnd(CDC* pDC) 
{
CRect objRect; GetClientRect(&objRect);
pDC->FillSolidRect(&objRect, RGB(0, 255, 0)); return TRUE; //CDialog::OnEraseBkgnd(pDC);
}
  在一般情况下,对话框的背景的确显示成绿色了,达到了我的目的,但是如果有另外一个对话框在上面移动(稍微快点),结果就成了绿色/原来的灰色间隔的背景底图出现了,很奇怪.

解决方案 »

  1.   

    OnEraseBkgnd直接返回true
    然后重载OnPaint在其中进行背景绘制
      

  2.   

    如果是在VS2008 sp1上
    CDialogEx::SetBackgroundImage
    Sets the background image of the dialog box. 
    void SetBackgroundImage(
      HBITMAP hBitmap,
      BackgroundLocation location=BACKGR_TILE,
      BOOL bAutoDestroy=TRUE,
      BOOL bRepaint=TRUE
    );
    BOOL SetBackgroundImage(
      UINT uiBmpResId,
      BackgroundLocation location=BACKGR_TILE,
      BOOL bRepaint=TRUE
    ); 
    SetBackgroundColor 和SetBackgroundImage ,分别是设置背景颜色和背景图片。一个函数就可以搞定。例如,背景颜色,只要在对话框初始化函数OnInitDialog() 中添加以下代码就行了:
    SetBackgroundColor(RGB(255,0,255));
      

  3.   


    没理由啊
    我都是这么做的
    你代码怎么写的
    OnPaint里要用CPaintDC
      

  4.   


    如果你打算给对话框背景添加导入的位图,那么应该这样做:CTestBackgroundDlg::CTestBackgroundDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTestBackgroundDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CTestBackgroundDlg)
    //}}AFX_DATA_INIT

    m_cBitmap.LoadBitmap(IDB_SKY);//IDB_SKY is your picture's ID 
                                          //CBitmap m_cBitmap is one member
    }
    // ADD the picture as dialog's background
    BOOL CTestBackgroundDlg::OnEraseBkgnd(CDC* pDC) 
    {
    CRect  rectbk;// 客户区的大小 
    CDC memDC;// 内存设备描述表 
    CBitmap*  pOldMemBmp = NULL; 
    BITMAP stBitmap;
    GetClientRect(&rectbk); // 得到窗口区域 
    //1.构造内存设备环境,并将位图装入 
    memDC.CreateCompatibleDC(pDC);
    pOldMemBmp = memDC.SelectObject(&m_cBitmap);
    //read the cBitmap's size
    m_cBitmap.GetBitmap(&stBitmap);
    int stBMPwidth  = stBitmap.bmWidth;
    int stBMPHeigth = stBitmap.bmHeight;

    // 将背景位图复制到窗口客户区
    pDC->StretchBlt(0, 0, rectbk.Width(), rectbk.Height(), &memDC, 0, 0,
    stBMPwidth, stBMPHeigth, SRCCOPY);

    // 绘图完成后的清理 
    memDC.SelectObject(pOldMemBmp); return TRUE;
    }
      

  5.   

    谢谢楼上几位,我找到问题所在了,但还没办法解决,我发现加上对话框的Title Bar就有这个问题,如果去掉Title Bar属性,就没这个问题了,真是奇怪啊.
      

  6.   

    App类的InitInstance()函数里直接SetDialogBkColor(RGB(0, 255, 0));不行吗
      

  7.   


      你自己可以试试,用VC6.0创建一个基于对话框的程序,然后加上我上面说的代码,然后启动这个对话框程序,这时候对话框背景是绿色的是正确的,这时候如果你用另外一个程序(比如Notepad等等)在你的对话框上面移动移动,就会出现我给出图片的那个效果了,如果去掉Title Bar属性,就没这个问题.  建议你自己试试!
      

  8.   

    [Quote=引用 12 楼 panghuang 的回复:]
    引用 10 楼 visualeleven 的回复:
    App类的InitInstance()函数里直接SetDialogBkColor(RGB(0, 255, 0));不行吗  这样设置不满足我的要求,我本意是要把对话框背景用位图填充的,现在只是为了简化问题而已.
    [/Quote
    那就在OnPaint()里处理吧,贴图干什么都成,OnEraseBkgnd直接返回TRUE;
      

  9.   

    可以在任何时候任意改变对话框背景任意区域的颜色。   
      BOOL   CCpDlg::OnEraseBkgnd(CDC   *pDC)   
      {   
                pDC   dc(this);   
      dc.SetBkMode(TRANSPARENT);   
      CRect   rt;   
      GetClientRect(&rt);   
      CBrush   cbSel;   
      cbSel.CreateSolidBrush(RGB(223,   233,   243));   
      dc.FillRect(&rt,   &cbSel);   
                          return   TRUE;   
      }   
      

  10.   

    我在OnCtlColor里面改变背景色,楼主可以试下;
    HBRUSH Initvolum::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    HBRUSH hbr=::CreateSolidBrush(RGB(38,123,165));
    return hbr;
    }
      

  11.   

    OnEraseBkgnd直接返回true
    然后重载OnPaint在其中进行背景绘制
      

  12.   

    估计是楼主代码写的有问题吧
    特别是在OnPaint里面的实现
    下面是我的实现
    void CTestDialogPaintDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (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
    {
    CPaintDC dc(this);
    CDC memDC;
    CBitmap bitmap, *pOldBitmap;
    CRect rcClient;
    GetClientRect(rcClient);
    memDC.CreateCompatibleDC(&dc);
    bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
    pOldBitmap = memDC.SelectObject(&bitmap);
    memDC.FillRect(rcClient, &CBrush(RGB(0, 255, 0)));
    dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOldBitmap);
    }
    }BOOL CTestDialogPaintDlg::OnEraseBkgnd(CDC* pDC) 
    {
    return TRUE;
    }
      

  13.   

    楼上的,我试了你的代码,结果还是一样啊,但是效果比我的要好点,但问题还是有的
    我把代码上传了,在下面:
    http://download.csdn.net/source/2343861
      

  14.   

    这个问题有点奇怪,根据多次测试,发现在有些PC上没问题,在有些PC上有问题,同一个exe文件的,OS也是一样的,真是怪了.
      

  15.   


    可以和系统配置有关……
    我遇到的问题是GDI+的
    http://topic.csdn.net/u/20100510/09/a483f7a8-039f-4ac3-9b23-1603f36be7db.html
      

  16.   

    在xp和2003上的效果和win7下不同的.
      

  17.   

    楼主联系我,播放器,[email protected]