框架窗口创建成功之后切分窗口的实现

ClassDan 2011-08-05 11:51:19
有一个SDI程序,想实现如下效果:在普通单文档窗口完全显示之后,当单击选择某一菜单命令后,将视图区域分割为1行2列,请问如何实现?

网上关于切分窗口的教程或例程几乎都是在框架窗口未完全创建时重载OnCreateClient函数,使用CSplitterWnd实现的,但如何在框架窗口已经创建成功之后再切分窗口呢?
...全文
93 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-08-23
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
schlafenhamster 2011-08-10
  • 打赏
  • 举报
回复
void CMainFrame::ChangSplit(int views)
{// before delete all,save doc
CCreateContext Context;// I hate 'new'
ZeroMemory(&Context,sizeof(Context));
Context.m_pCurrentFrame=this;
// set doc
CDocument *pDoc=m_pMainView->GetDocument();
Context.m_pCurrentDoc=pDoc;
Context.m_pNewDocTemplate=pDoc->GetDocTemplate();
//
红的就是doc
m_wndSplitter.CreateView(jj, kk, RUNTIME_CLASS(CYaChangeSplitView), size, &Context);
可以是别的view,但doc已经连上。
ClassDan 2011-08-10
  • 打赏
  • 举报
回复
那我要是想要新建的视类(CMyView2)和文档关联起来以显示数据呢?
schlafenhamster 2011-08-10
  • 打赏
  • 举报
回复
CSplitterWnd::GetPane

CWnd* GetPane( int row, int col );

就是view
ClassDan 2011-08-10
  • 打赏
  • 举报
回复
现在又产生了一个问题:用CSplitterWnd切分窗口之后,其中的视图(如CMyView1、CMyView2...)没有和Document关联起来吧?如果没有关联那相互之间如何通信同时与文档通信呢?
schlafenhamster 2011-08-07
  • 打赏
  • 举报
回复
下载我的“YaChangeSplit.zip ”// Yet another
Eleven 2011-08-07
  • 打赏
  • 举报
回复

// View类中定义两个成员
CSplitterWnd m_wndSplitter;
BOOL m_bSplitter = FALSE;

void CXView::OnMenuitem32771() // 菜单项的响应函数
{
// TODO: Add your command handler code here
if(NULL == m_wndSplitter.GetSafeHwnd())
{
CCreateContext cc;
memset(&cc, 0, sizeof(CCreateContext));

CRect rc;
GetClientRect(&rc);

VERIFY(m_wndSplitter.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE));

cc.m_pNewViewClass = RUNTIME_CLASS(CXView);
VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CXView), CSize(300, rc.Height()), &cc));

cc.m_pNewViewClass = RUNTIME_CLASS(CXView);
VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CXView), CSize(0, rc.Height()), &cc));

m_wndSplitter.MoveWindow(0, 0, rc.Width(), rc.Height());
m_wndSplitter.RecalcLayout();

m_bSplitter = TRUE;
}
}

void CXView::OnDraw(CDC* pDC) // 将OnDraw中的两句代码给注释掉
{
// CXDoc* pDoc = GetDocument();
// ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
ClassDan 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]

C/C++ code

// View类中定义两个成员
CSplitterWnd m_wndSplitter;
BOOL m_bSplitter = FALSE;

void CXView::OnMenuitem32771() // 菜单项的响应函数
{
// TODO: Add your command handler code here
if(NULL == m……
[/Quote]
谢谢VisualEleven大牛,之前是我没看清楚,我按照你的方法先试一下...
ClassDan 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gz_qmc 的回复:]
算了,不逗你们了

方法:

第一步 从MFC扒拉一个CSplitterWnd来
就是参考他的CSplitterWnd类,不是用他,是参考,知道不
从CWnd类派生一个自己的类

第二步 融合CSplitterWnd类的东西到自己的类
简单说就是设置个BOOL的属性
属性为1时候就是CSplitterWnd功能
……
[/Quote]
谢谢你的帮助!不过我感觉你说话的水平可能比你的技术水平还要高...
gz_qmc 2011-08-06
  • 打赏
  • 举报
回复
算了,不逗你们了

方法:

第一步 从MFC扒拉一个CSplitterWnd来
就是参考他的CSplitterWnd类,不是用他,是参考,知道不
从CWnd类派生一个自己的类

第二步 融合CSplitterWnd类的东西到自己的类
简单说就是设置个BOOL的属性
属性为1时候就是CSplitterWnd功能
通过SetWin();(自定义的)分别动态加两窗口给他
属性为1的时候,就是普通窗口

第三步 堪套的窗口在用该类派生就可以再分

特点: 不能用View类,不能和DOC关联系,要滚动得自己加代码

注意: 属性为1的时候要靠RecalcLayout来调整个窗口尺寸
需要链表保存一系列窗口指针和RECT的内容
另外,激活的那个窗口的ID都要动态调整为:AFX_IDW_PANE_FIRST

好了,小朋友,功力不到就不要追求了
gz_qmc 2011-08-06
  • 打赏
  • 举报
回复
看清楚了
以前自己很无聊的时候就研究过
Eleven 2011-08-06
  • 打赏
  • 举报
回复
你看清楚一些啊~
ClassDan 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
http://blog.csdn.net/visualeleven/article/details/6460564
[/Quote]
谢谢,不过你的这种方法好像也不能实现我的要求啊?不也是在创建框架的时候就分割窗口,只是在改变窗体时会改变切分窗体的大小啊?
ClassDan 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
http://blog.csdn.net/visualeleven/article/details/6460564
[/Quote]
谢谢,不过你的这种方法好像也不能实现我的要求啊?不也是在创建框架的时候就分割窗口,只是在改变窗体时会改变切分窗体的大小啊?
Eleven 2011-08-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/visualeleven/article/details/6460564

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧