CSplitterWnd多次切分窗口的问题,请教大侠。。

ruibipiglet 2011-04-14 05:13:52
CMainFrame::OnCreateClient中使用两个CSplitterWnd变量完成窗口切分。

m_wndSplitter先将客户区切分为两列,左右各占一半。

然后再用m_wndSplitter_new将左边的一半切分为两行。

至此,有1(左上),2(左下),3(右边)。

遇到的问题是程序启动后,3号窗口没有占据一半区域 貌似占据了整个客户区,需要将m_wndSplitter控件向右拖动,左边的连个1,2号窗口才能显示出来。

我的目的是程序启动后,就按照我设置的大小,1和2号各种四分之一,合起来占据客户区一半(左边),3号窗口占据客户区一半(右边)。


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
if(!m_wndSplitter.CreateStatic(this, 1, 2))
{
return FALSE;
}

CRect rect;
GetClientRect(&rect);


if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CStudentView),
CSize(rect.Width() / 2, rect.Height()), pContext))
{
return FALSE;
}

if (!(m_wndSplitter_new.CreateStatic(&m_wndSplitter,
2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 0))))
{
return FALSE;
}

if(!m_wndSplitter_new.CreateView(0, 0, RUNTIME_CLASS(CTeacherView),
CSize(rect.Width() / 2, rect.Height() / 2), pContext)
|| !m_wndSplitter_new.CreateView(1, 0, RUNTIME_CLASS(CContentView),
CSize(rect.Width() / 2 , rect.Height() / 2), pContext))
{
return FALSE;
}

return TRUE;
}

...全文
90 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin152 2011-04-14
  • 打赏
  • 举报
回复

CSplitterWnd::SetColumnInfo
CSplitterWnd::RecalcLayout

panasonic0804 2011-04-14
  • 打赏
  • 举报
回复
因为你没有显示设置列的信息,而系统采用了autosize,所以你的1、2几乎看不到,3占据了大部分区域。

可以使用SetColumnInfo来调整你的列的宽度。
例如

m_wndSplitter.SetColumnInfo(0,330,10)
Eleven 2011-04-14
  • 打赏
  • 举报
回复
响应主框架窗口WM_SIZE消息,在OnSize消息里利用CSplitterWnd::SetColumnInfo/SetRowInfo()来设置区域的大小,然后调用CSplitterWnd::RecalcLayout()来刷新,当然你在SetColumnInfo/SetRowInfo之前需要判断一下CSplitterWnd是否拆分完成。可以在CMainFrame类中定义个BOOL标记,初始值为FALSE,在OnCreateClient()函数中最后return TRUE;之前设置该标记值为TRUE。OnSize中判断该标记值,然后再调用上面提到的函数。

15,980

社区成员

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

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