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);
}
{
// 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);
}
具体这么办,从CWnd派生一个子类(例如CSubwnd),然后重载它的OnEraseBkgnd函数,在其中添加改变背景的代码,然后在mainframe中添加一个private变量
CSubwnd m_wndSub;
在mainframe的oncreate中添加m_wndSub.SubclassWindow(this->m_hWnd);即可
pDC->FillSoldRect();
MDI
不过怎么对这个窗口进行消息处理我就不知了...
不过怎么对这个窗口进行消息处理我就不知了...
我试过了,但是在
m_wndSub.SubclassWindow(this->m_hWnd);
处出错了,具体在下面的函数中出错
BOOL CWnd::Attach(HWND hWndNew)
{
ASSERT(m_hWnd == NULL);
ASSERT(FromHandlePermanent(hWndNew) == NULL);//!!!出错处
你可以利用CreateDIBitmap()后调用BitBlt()或StretchBlt()
你们回答问题时有没有深入的想过啊,不要想当然的回答,这不是draw的表面问题,是一个MFC内部机制的问题,SubclassWindow其实是利用了hook技术把原来类函数的入口钩到了子类来处理,我这样说可能不太准确,但是大概意思就是这样的
但是值得注意地是要屏蔽掉主窗体地CMainFrame::OnEraseBkgnd(CDC* pDC)
『
return false;
。
』
我用上方法作了一个,编译没问题,可是执行不行,有错误。
单文档,
CMainFrame::OnCreate中调用
m_wndSub.SubclassWindow(this->m_hWnd);
怎么回事儿?