请教!如何替换CsplitterWnd中的某个View(快疯了,大侠快来救命)

isis isis 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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错误

...全文

相关推荐

CUsefulSplitterWnd(CSplitterWnd的扩展)

总结起来,CUsefulSplitterWnd是对MFC中的CSplitterWnd类的增强,它不仅保留了原有的功能,还增加了拆分器锁定和动态视图替换,为开发者提供了更多设计灵活、用户友好的界面的可能性

weixin_38508549

CSplitterWnd

CSplitterWnd 是 MFC 中的一个重要类,提供了分隔器窗口的功能,允许开发者创建具有多个窗格的窗口。下面是 CSplitterWnd 的详细知识点:1.

Dark_Passion

CSplitterWnd Extension that Allows Switching Views_ CSplitterWnd

**VIEW的SWITCH操作**:这是CSplitterWnd扩展的关键特性,用户可以方便地在不同视图之间切换,而无需关闭或打开新的窗口。

Jon Sco

CSplitterWnd扩展

在本案例中,我们关注的是一个名为"CSplitterWnd扩展"的主题,它涉及到对`CSplitterWnd`的自定义和增强。"

liuyich123

MFC单文档多视图:CSplitterWnd切分与视图切换实现详解

在MFC单文档界面(SDI)开发中,默认一个文档仅对应一个视图,但业务常要求同一份数据以多种形式呈现。其底层原理在于CDocument内部维护视图链表,可同时挂接多个CView,视图创建依赖CCreateContext传递文档与模板信息。通过重写CFrameWnd::OnCreateClient,开发者可借助CSplitterWnd静态切分实现左右双视图,或用ShowWindow与SetActiveView实现互斥切换。这种多视图结构在表单录入+列表展示、编辑+预览等场景中广泛应用,合理选择切分或切换方案能

走路带风的何小璐
评论 6
收藏 已收藏
分享
返回顶部
isis
VC/MFC 16,550 成员 421,605 内容