我想在CView派生类中创建一个CWnd派生类。我还使用了一个窗口分割器来创建左侧的树控制菜单和右侧的视图区域,如下面的草稿。
------------------------
| tree | View |
| menu | |
| | |
------------------------
问题在于,当第一次调用CWnd::OnEraseBkgnd
时,它会从窗口的最左上角而不是视图的客户区域中删除背景,从而导致临时损坏的区域。我尝试使用SetWindowPos
,但没有解决问题。
我像这样创建CWnd派生类
CRect rect;
m_MediaWindow->GetClientRect(&rect); //Get CSplitterView client area size
if (!m_videoChildWnd.Create(NULL, NULL, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE , rect, m_MediaWindow, ID_DSHOW_RENDER_WND)) {
// failed to create child
return TRUE;
}
::SetWindowPos(m_videoChildWnd,NULL, rect.left, rect.top, rect.Width(), rect.Height(),
SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
m_videoChildWnd.ShowWindow(SW_SHOW);
现在m_videoChildWnd内部存在OnEraseBkgnd
函数
BOOL CWndVideoChild::OnEraseBkgnd(CDC* pDC) {
// TODO: Add your message handler code here and/or call default
CBrush brush;
CRect rect;
GetClientRect(&rect);
brush.CreateStockObject(BLACK_BRUSH);
pDC->FillRect(rect,&brush);
return TRUE;
}
在从框架中进行了近3次调用后,重绘系统恢复了损坏的区域,一切正常。
任何想法如何解决这个问题?