BOOL CMainFrame::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default
CBrush pbrh;
CBitmap pBmp;
CRect rect; pBmp.LoadBitmap(IDB_BMPBAK);
pbrh.CreatePatternBrush(&pBmp);                                           
                                                                                  
// 保存以前的Brush
CBrush* pOldBrush = pDC->SelectObject(&pbrh);

// 获取重绘区域
CRect rectClip;
pDC->GetWindow()->GetClientRect(&rectClip);

// 重绘
pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY); // 恢复以前的Brush
pDC->SelectObject(pOldBrush); 

return TRUE;

// return CMDIFrameWnd::OnEraseBkgnd(pDC);
}

解决方案 »

  1.   

    可能是在CMainFrame的前面还有一个view...所以你要改的是view而不是mainframe
      

  2.   

    这个问题使用窗口子类化就可以解决了
    具体这么办,从CWnd派生一个子类(例如CSubwnd),然后重载它的OnEraseBkgnd函数,在其中添加改变背景的代码,然后在mainframe中添加一个private变量
    CSubwnd m_wndSub;
    在mainframe的oncreate中添加m_wndSub.SubclassWindow(this->m_hWnd);即可
      

  3.   

    楼主是在MDI中还是在SDI中???
      

  4.   

    http://www.codetools.com/中有一个最新的cimage的例子,其中的主窗口就是自己画背景的,你可以看一下
      

  5.   

    产生画刷以后,不要用PatBlt,而要用:
    pDC->FillSoldRect();
      

  6.   

    to :: kingcom(猪眼看人生SP1|不当帮主了) 
    MDI
      

  7.   

    在mainframe之前还有一个MDIClient的窗口...
    不过怎么对这个窗口进行消息处理我就不知了...
      

  8.   

    在mainframe之前还有一个MDIClient的窗口...
    不过怎么对这个窗口进行消息处理我就不知了...
      

  9.   

    to:ukyoking(乐易) 
    我试过了,但是在
    m_wndSub.SubclassWindow(this->m_hWnd);
    处出错了,具体在下面的函数中出错
    BOOL CWnd::Attach(HWND hWndNew)
    {
    ASSERT(m_hWnd == NULL);     
    ASSERT(FromHandlePermanent(hWndNew) == NULL);//!!!出错处
      

  10.   

    是不是需要ScreenToClient(&rectClip);
    你可以利用CreateDIBitmap()后调用BitBlt()或StretchBlt()
      

  11.   

    sorry匆忙中忘记了,把参数改成m_hWndMDIClient吧,这样绝对就不会再有问题了
      

  12.   

    To 其他回答的人:
    你们回答问题时有没有深入的想过啊,不要想当然的回答,这不是draw的表面问题,是一个MFC内部机制的问题,SubclassWindow其实是利用了hook技术把原来类函数的入口钩到了子类来处理,我这样说可能不太准确,但是大概意思就是这样的
      

  13.   

    在CMainFrame::CreateClient(LPCREATESTRUCT lpCreateStruct, CMenu* pWindowMenu)里做
      

  14.   

    应该在视图中更改背景图像!!1
    但是值得注意地是要屏蔽掉主窗体地CMainFrame::OnEraseBkgnd(CDC* pDC)

      return false;

      

  15.   

    问 ukyoking(乐易) :
    我用上方法作了一个,编译没问题,可是执行不行,有错误。
    单文档,
    CMainFrame::OnCreate中调用
    m_wndSub.SubclassWindow(this->m_hWnd);
    怎么回事儿?