Dialog的背景图,窗口中有图标,当窗口最小化后,恢复窗口,图标等被背景图覆盖? 本人接触VC++时间短,诚请高手帮忙!显示背景图在:
BOOL CW05Dlg::OnEraseBkgnd(CDC* pDC) 
{
CDialog::OnEraseBkgnd(pDC); m_pic2.SubclassWindow( m_hWnd );
m_pic2.m_nMessageHandler = CPictureWindow::BackGroundPaint;
m_pic1.Load("dlg_bk.bmp"); return CDialog::OnEraseBkgnd(pDC);
}另一方案:用dialog中picture控件也覆盖图标等.
请讲明原理最好有代码我每次验证后都给分了,从不背信!谢谢!

解决方案 »

  1.   

    画完后通知显示ICON的控件刷新就可.
      

  2.   

    通知显示ICON的控件如何刷新,请具体些!
      

  3.   

    我想你的图标是自己在OnButton中画上去的吧,如果是就把它放在OnPaint里面
      

  4.   

    OnPaint触发较早,所以在这儿画背景最好
      

  5.   

    OnPaint画背景 图标等被背景图覆盖void CW05Dlg::OnPaint() 
    {
    if (IsIconic())
    {
        CPaintDC dc(this); 
    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
    {
    m_pic1.SubclassWindow( m_hWnd );
    m_pic1.m_nMessageHandler = CPictureWindow::BackGroundPaint;
    m_pic1.Load("dlg_bk.bmp");
    CDialog::OnPaint();
    }
    }
      

  6.   

    Dialog的背景图,窗口中有图标,当窗口最小化后,恢复窗口,图标等被背景图覆盖? 本人接触VC++时间短,诚请高手帮忙!显示背景图在:
    BOOL CW05Dlg::OnEraseBkgnd(CDC* pDC) 
    {
    CDialog::OnEraseBkgnd(pDC); m_pic2.SubclassWindow( m_hWnd );
    m_pic2.m_nMessageHandler = CPictureWindow::BackGroundPaint;
    m_pic1.Load("dlg_bk.bmp");既然自己画背景了,还要系统的OnEraseBkgnd干吗?直接return OK;就可以了。保证背景不会被擦掉
    return CDialog::OnEraseBkgnd(pDC);
    }
      

  7.   

    另外OnPaint也太频繁了,系统效率会降低的。
      

  8.   

    试一试  kevin_wang(kevin神) 说的在CWnd::OnEraseBkGround中直接返回return TRUE
      

  9.   

    在CWnd::OnEraseBkGround中直接返回return TRUE, 也覆盖图标等.why ?
      

  10.   

    我这么写没有问题阿,不会覆盖BOOL CDlgDlg::OnEraseBkgnd(CDC* pDC) 
    {
    HBITMAP hBmp = (HBITMAP)LoadBitmap(::AfxGetInstanceHandle()
    ,MAKEINTRESOURCE(IDB_BITMAP1));
    CStatic *pPic = (CStatic*)GetDlgItem(IDC_PIC1);
    pPic->SetBitmap(hBmp);
    pPic->Invalidate(FALSE);
    return TRUE;
    }
      

  11.   

    what does "DC_PIC1" mean ?
      

  12.   

    这样写背景图,肯定没问题建立一个CBitmap 对象 bmp;
    和一个CBrush m_brBk;
    响应WM_CTLCOLOR消息,
    然后在BOOL CW05Dlg::OnInitDialog()
    {
     bmp.LoadBitmap(IDB_BITMAP);
     m_brBk.CreatePatternBrush(&bmp);
      bmp.DeleteObject();    //OnInitDialog里加入这几行
    }然后在在HBRUSH CDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(pWnd==this)
    {
    return m_brBk;
    }
    }
    就没问题了,,
      

  13.   

    我试过谢谢awnucel的方法ok, 
    谢谢awnucel,学到新知识啦
      

  14.   

    谢谢awnucel的方法,解决一多半,我的问题是gif,jpg图不是bitmap图如就解决马上结帖!先谢谢了!
      

  15.   

    kevin_wang(kevin神) 的e-mail ?
      

  16.   

    http://www.gupin.com/SoftView.Asp?SoftID=181
      

  17.   

    已经搞定,请注意收EMAIL,你应该知道SubClassWindow后,所有的消息都被接管了,你的OnPaint当然不能被调用,也就不能画你的ICON了。结账吧