三零网 www.q3060.com -- 技术、分享、进步
当前位置:首页 > 软件编程 > C/C++ > vc++6.0 MFC 分割窗体示例

vc++6.0 MFC 分割窗体示例

投稿:mmko3211p  发布时间:2017-10-23  【手机版】  人气:

 制作对话框与视图结合的分割窗口

有时候我们需要如下图的分割式窗体,一边是视图,一边是对话框,中间的分隔条还可拖动


我们需要使用CSplitterWnd类达到此目的。
教程原创:  王颂元   www.php18.com 
1.新建一SDI工程
2.工程建立后,默认已经有了一个视图,我们现在需要增加左边的对话框到工程,
在资源窗口添加对话框,调整到适合大小后,按Ctrl+W,进入类向导,VC++会提示是否为这个新对话框添加类,选“确定”,进入添加类的界面。
3. 新类的类名输入LDLG,基类选CFormView, 注意,这里不能选CDialog,CFormView是专用于视图的对话框
4. 返回对话框,右键>属性,将Style设置为Child,Border设置为None
OK,至此左边对话框的工作已完,下面我们来把它放到视图中。使用CSplitterWnd的分割窗体功能
步骤如下:
1.MainFrm.h中添加一public 成员:
CSplitterWnd m_MySplitter;
2.加上头文件
#include "039View.h"    //这是视图的头文件
#include "LDLG.h"      //这是对话框类的头文件

3.在类向导为CMainFrame类添加OnCreateClient事件,代码如下:
m_MySplitter.CreateStatic(this,1,2); 
m_MySplitter.CreateView(0,0,RUNTIME_CLASS(LDLG), CSize(250, 150), pContext);   //LDLG是对话框类
m_MySplitter.CreateView(0,1,RUNTIME_CLASS(CMy039View), CSize(250, 0), pContext); //CMy039View是视图类
SetActiveView((CMy039View*)m_MySplitter.GetPane(0,1)); //指定类视图
return true;

4.编译运行,此时会发觉有错误,我们还需要为视图类的.h文件添加一个头文件引用
#include "039Doc.h"        //039Doc.h是我的文档类头文件,你可以改成你工程相应的名称

再次编译,OK,成功了。

搞好了这个之后,同理我们可以搞个两边都是对话框的,或者两边都是视图的, 只是在分割时指定对应的类即可。

在上面第三步中,如果想分割成两行一列的话,就换下如下代码:
m_MySplitter.CreateStatic(this,2,1); 
m_MySplitter.CreateView(0,0,RUNTIME_CLASS(LDLG), CSize(0,170), pContext); 
m_MySplitter.CreateView(1,0,RUNTIME_CLASS(CMy039View), CSize(0, 0), pContext);
SetActiveView((CMy039View*)m_MySplitter.GetPane(0,0)); 

如果需要再复杂点,如下图所示,第二行分拆分成两列,


要达到这种效果就要使用两个Splitter对象了
m_MySplitter.CreateStatic(this,2,1); 
m_MySplitter2.CreateStatic(&m_MySplitter,1,2,WS_CHILD|WS_VISIBLE,m_MySplitter.IdFromRowCol(1,0));
//上面的IdFromRowCol(1,0) 表示是拿m_MySplitter的第二行第一列来继续拆分

//分拆为拆开的各部份指定视图
m_MySplitter.CreateView(0,0,RUNTIME_CLASS(LDLG), CSize(0,170), pContext); 
m_MySplitter2.CreateView(0,0,RUNTIME_CLASS(CMy039View), CSize(120,0), pContext);
m_MySplitter2.CreateView(0,1,RUNTIME_CLASS(CMy039View), CSize(0,0), pContext);

 

以下是分割的视图确定大小的代码

void CMainFrame::RecalcLayoutC() //自己定义的函数
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect(&rect);
CSize size = rect.Size();
//重新设置大小
m_MySplitter.SetRowInfo(0,abs(size.cy-20)*2/3,10);//设置行信息
//设置大小后必须调用RecalcLayout调整
m_MySplitter.RecalcLayout();
//调整大小,需要减去标题栏高度*2,因为有两个标题栏
//而且需要注意,因为这里出现(size.cy-CAPTIONBAR_HEIGHT*2),而该项
//可能为负值,因此需要进行处理,只要保证大于0即可
m_MySplitter2.SetColumnInfo(0,size.cx*1/4,10);
// m_wndSplitter1.SetRowInfo(1,abs(size.cy-CAPTIONBAR_HEIGHT*2)/2,10);
m_MySplitter2.SetColumnInfo(1,size.cx*2/4,10);
m_MySplitter2.RecalcLayout();

}

void CMainFrame::OnSize(UINT nType, int cx, int cy) //消息响应
{
CFrameWnd::OnSize(nType, cx, cy);
if(nType!=SIZE_MINIMIZED&&m_MySplitter.GetSafeHwnd()&&
   m_MySplitter2.GetSafeHwnd()&&m_bRecalc)
RecalcLayoutC() ;

// TODO: Add your message handler code here
}

●【往下看,下一页更精彩】●
1  2  3  4  5  6  7  下一页 
延伸阅读:
·vc6.0 MFC Dialog界面跳转的操作方法
·VC++6.0 MFC 最简单的JSON类的操作方法
·vc6.0 GDI+ MFC 配置的心得
·VC6.0 MFC 单文档操作的操作方法
·win7 XP+vc6.0 安装后没有MFC 工程选项怎么办?
·VC6.0 MFC单文档的视图添加CScrollBar控件的实现方式
·VC6.0 MFC资源界面的心得
·VC6.0 MFC Dialog 对话框的实现方式
·浅析VC6.0 MFC建立对话框和简单跳转示例
·浅析VC6.0使用MFC制作简易计算器示例
  
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,请收藏本网站!
大家感兴趣的内容
最新的内容
热门搜索
三零网 | 网站地图| 最近更新 | 关于我们 | 联系方式 | |

Copyright © 2012-2020,Q3060.COM All Rights Reserved.