请教!如何替换CsplitterWnd中的某个View(快疯了,大侠快来救命)
CsplitterWnd中需要通过用户在运行期手动决定显示某个View
所有的View都是预先定义好了,保存在CsplitterWnd 中的
CPtrArray m_ptrarrayRCView数组中(其中任意的有多个CView的子类,比如CHtmlView)
用户需要调用CsplitterWnd 中自定义函数
ReplaceView(CRuntimeClass* pRCView),把从m_ptrarrayRCView取出的一个CView类型pRCView把原来的位于CsplitterWnd区域(0, 0)的哪个替换掉
请教大家如何做
我试图通过下面的代码来运行
BOOL Tab_SplitterWnd::ReplaceView(CRuntimeClass* pRCView)
{
CView* pOldView = GetParentFrame()->GetActiveView();
CView* pNewView = (CView*)pRCView;
::SetParent(pNewView->m_hWnd, GetParentFrame()->m_hWnd);
GetParentFrame()->SetActiveView(pNewView);
pNewView->ShowWindow(SW_SHOW);
pOldView->ShowWindow(SW_HIDE);
::SetWindowLong(pNewView->m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST);
RecalcLayout();
return true;
}
但是不行
总是在SetActiveView中的ASSERT(IsChild(pViewNew));中出错
但是我设置了SetParent,不知道为什么
试图通过
BOOL Tab_SplitterWnd::ReplaceView(CRuntimeClass* pRCView)
{
CCreateContext context;
SIZE size;
CRect rect;
CView* pOldView = GetParentFrame()->GetActiveView();
CView* pNewView = (CView*)pRCView;
CDocument* pDoc = pOldView->GetDocument();
context.m_pNewViewClass = pRCView;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = pDoc->GetDocTemplate();
context.m_pLastView = NULL;
context.m_pCurrentFrame = GetParentFrame();
pOldView->GetClientRect( &rect );
size.cx = rect.right;
size.cy = rect.bottom;
CreateView( 0, 0, pRCView, size, &context);
GetParentFrame()->SetActiveView(pNewView);
RecalcLayout();
}
但是会出现
TRACE2("Error: CreateView - pane already exists for row %d, col %d.\n",
row, col);的Assertion错误
于是我在CreateView前面加入了pOldView ->DestoryWindow()
但是出现Violation Access错误
所有的View都是预先定义好了,保存在CsplitterWnd 中的
CPtrArray m_ptrarrayRCView数组中(其中任意的有多个CView的子类,比如CHtmlView)
用户需要调用CsplitterWnd 中自定义函数
ReplaceView(CRuntimeClass* pRCView),把从m_ptrarrayRCView取出的一个CView类型pRCView把原来的位于CsplitterWnd区域(0, 0)的哪个替换掉
请教大家如何做
我试图通过下面的代码来运行
BOOL Tab_SplitterWnd::ReplaceView(CRuntimeClass* pRCView)
{
CView* pOldView = GetParentFrame()->GetActiveView();
CView* pNewView = (CView*)pRCView;
::SetParent(pNewView->m_hWnd, GetParentFrame()->m_hWnd);
GetParentFrame()->SetActiveView(pNewView);
pNewView->ShowWindow(SW_SHOW);
pOldView->ShowWindow(SW_HIDE);
::SetWindowLong(pNewView->m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST);
RecalcLayout();
return true;
}
但是不行
总是在SetActiveView中的ASSERT(IsChild(pViewNew));中出错
但是我设置了SetParent,不知道为什么
试图通过
BOOL Tab_SplitterWnd::ReplaceView(CRuntimeClass* pRCView)
{
CCreateContext context;
SIZE size;
CRect rect;
CView* pOldView = GetParentFrame()->GetActiveView();
CView* pNewView = (CView*)pRCView;
CDocument* pDoc = pOldView->GetDocument();
context.m_pNewViewClass = pRCView;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = pDoc->GetDocTemplate();
context.m_pLastView = NULL;
context.m_pCurrentFrame = GetParentFrame();
pOldView->GetClientRect( &rect );
size.cx = rect.right;
size.cy = rect.bottom;
CreateView( 0, 0, pRCView, size, &context);
GetParentFrame()->SetActiveView(pNewView);
RecalcLayout();
}
但是会出现
TRACE2("Error: CreateView - pane already exists for row %d, col %d.\n",
row, col);的Assertion错误
于是我在CreateView前面加入了pOldView ->DestoryWindow()
但是出现Violation Access错误
...全文
相关推荐
CUsefulSplitterWnd(CSplitterWnd的扩展)
总结起来,CUsefulSplitterWnd是对MFC中的CSplitterWnd类的增强,它不仅保留了原有的功能,还增加了拆分器锁定和动态视图替换,为开发者提供了更多设计灵活、用户友好的界面的可能性
CSplitterWnd
CSplitterWnd 是 MFC 中的一个重要类,提供了分隔器窗口的功能,允许开发者创建具有多个窗格的窗口。下面是 CSplitterWnd 的详细知识点:1.
CSplitterWnd Extension that Allows Switching Views_ CSplitterWnd
**VIEW的SWITCH操作**:这是CSplitterWnd扩展的关键特性,用户可以方便地在不同视图之间切换,而无需关闭或打开新的窗口。
CSplitterWnd扩展
在本案例中,我们关注的是一个名为"CSplitterWnd扩展"的主题,它涉及到对`CSplitterWnd`的自定义和增强。"
MFC单文档多视图:CSplitterWnd切分与视图切换实现详解
在MFC单文档界面(SDI)开发中,默认一个文档仅对应一个视图,但业务常要求同一份数据以多种形式呈现。其底层原理在于CDocument内部维护视图链表,可同时挂接多个CView,视图创建依赖CCreateContext传递文档与模板信息。通过重写CFrameWnd::OnCreateClient,开发者可借助CSplitterWnd静态切分实现左右双视图,或用ShowWindow与SetActiveView实现互斥切换。这种多视图结构在表单录入+列表展示、编辑+预览等场景中广泛应用,合理选择切分或切换方案能


