求助拆分窗口的问题之2! 我希望拆分成,2行2列的,第一行:有2列第2行:合并成一列 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转:《 窗体的任意分割》 在VC中提供了一个类CSplitterWnd,它看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。 在主框架创建客户区是先调用CSplitterWnd类的CreateStatic设定分割的行数和列数,然后用该类的CreateView函数创建一个一个的子窗口。代码如下:1.通过AppWizard创建单文档应用程序SplitWndDemo。2.通过向导另外生成3个CView类:CView1,CView2,CView3。加上程序原来的是CsplitWndDemoView,总共有4个视,对应了分割窗口的4个部分。3.在CMainFrame的头文件中加如下代码: CSplitterWnd m_wndsSplitter1; CSplitterWnd m_wndsSplitter2;4.重载CMainFrame的OnCreateClient()函数,分割窗口:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { //创建一个静态分栏窗口,分为三行一列 if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) return FALSE; //将CSplitWndDemoView连接到0行0列窗格上 m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CSplitWndDemoView),CSize(100,100), pContext); m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); //将CView4连接到0行2列 if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0))==NULL) return FALSE; //将第1行0列再分开1行2列 //将CView2类连接到第二个分栏对象的0行0列 m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); //将CView3类连接到第二个分栏对象的0行1列 m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); return TRUE; // return CFrameWnd::OnCreateClient(lpcs, pContext);} 另有问题:上面的方法中,两个子窗口的大小是0,和设置的值不相符,请问CSplitterWnd的那个函数是设置子窗口大小的, 他的切分不符合你的要求:应该是这样的,BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class CRect rc; GetClientRect(&rc); CSize PaneSize1(rc.Width()/2,rc.Height()/2); CSize PaneSize2(rc.Width(),rc.Height()/2); if(m_wndSplitter1.CreateStatic(this,2,1)==NULL) return FALSE; if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 0))==NULL) return FALSE; m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),PaneSize1,pContext); m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),PaneSize1,pContext); m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CView1),PaneSize2,pContext); m_wndSplitter1.SetRowInfo(0,rc.Height()/2,10); m_wndSplitter1.SetRowInfo(1,rc.Height()/2,10); //m_wndSplitter2.SetColumnInfo(0, rc.Width()/2, 10); 默认就是一半,要不要无所谓! m_wndSplitter1.RecalcLayout(); m_wndSplitter2.RecalcLayout(); return TRUE; }代码已测试过。=========================三个视图:CView1 CView2 CView3还有m_wndSplitter1 m_wndSplitter2 套接字通信问题请教 VC++与数据库 一个线程可以接收 文件和 聊天内容嘛? 如何动态显示网络通信速率? 急啊,组播问题??? 大家有没有发现ListCtrl的LVN_ITEMCHANGED时间为什么连续响应3次,是不是vc的bug,急!!! 关于在线程间共享套接字的问题??? DrawItem about ListBox,help!!!求助 线程中使用postmessage 请教高手,高分相送。 用ShellExcute调用另外的可执行程序,请问如何知道那可执行程序已经退出? 网络编程的迷惘
在VC中提供了一个类CSplitterWnd,它看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。
在主框架创建客户区是先调用CSplitterWnd类的CreateStatic设定分割的行数和列数,然后用该类的CreateView函数创建一个一个的子窗口。代码如下:
1.通过AppWizard创建单文档应用程序SplitWndDemo。
2.通过向导另外生成3个CView类:CView1,CView2,CView3。加上程序原来的是CsplitWndDemoView,总共有4个视,对应了分割窗口的4个部分。
3.在CMainFrame的头文件中加如下代码:
CSplitterWnd m_wndsSplitter1;
CSplitterWnd m_wndsSplitter2;
4.重载CMainFrame的OnCreateClient()函数,分割窗口:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建一个静态分栏窗口,分为三行一列
if(m_wndSplitter1.CreateStatic(this,3,1)==NULL)
return FALSE;
//将CSplitWndDemoView连接到0行0列窗格上
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CSplitWndDemoView),CSize(100,100), pContext);
m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); //将CView4连接到0行2列
if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0))==NULL)
return FALSE; //将第1行0列再分开1行2列
//将CView2类连接到第二个分栏对象的0行0列
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); //将CView3类连接到第二个分栏对象的0行1列
m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext);
return TRUE;
// return CFrameWnd::OnCreateClient(lpcs, pContext);
}
上面的方法中,两个子窗口的大小是0,和设置的值不相符,
请问CSplitterWnd的那个函数是设置子窗口大小的,
应该是这样的,BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
CRect rc;
GetClientRect(&rc); CSize PaneSize1(rc.Width()/2,rc.Height()/2);
CSize PaneSize2(rc.Width(),rc.Height()/2); if(m_wndSplitter1.CreateStatic(this,2,1)==NULL)
return FALSE;
if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 0))==NULL)
return FALSE; m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),PaneSize1,pContext);
m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),PaneSize1,pContext);
m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CView1),PaneSize2,pContext);
m_wndSplitter1.SetRowInfo(0,rc.Height()/2,10);
m_wndSplitter1.SetRowInfo(1,rc.Height()/2,10);
//m_wndSplitter2.SetColumnInfo(0, rc.Width()/2, 10); 默认就是一半,要不要无所谓! m_wndSplitter1.RecalcLayout();
m_wndSplitter2.RecalcLayout(); return TRUE;
}代码已测试过。
=========================
三个视图:CView1 CView2 CView3
还有m_wndSplitter1 m_wndSplitter2