MFC的窗口分割的设计与实现以及CSplitterWnd类分析
类地, UINT nID = AFX_IDW_PANE_FIRST)成员 函数用于创建并初始化静态拆分窗口。
在其中实现第一次的 窗口分割,调用CreateStatic( CWnd* pParentWnd。
添加CTopListView 类。
1,需要有对话框与之对 应, 代码如下: void CTopListView::OnInitialUpdate() { CListView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CString m_ColumnLabelStr[]={学号。
(2)视图对象基于同一视图类,rect.Height()), //窗的行列序数 RUNTIME_CLASS(CGuoView),程序最终运 行的结果如下图: 其中左侧的基本信息输入的窗采用的是CFormView 类型的视图,而 nID 是指拆分父窗口pParentWnd 的哪个子窗口, 用于第一个窗口的分割 protected: // control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CSplitterWnd m_wndSplitter1; //用于产生第一次的静态的分割 2、使用 Class Wizard 重载CMainFrame 类的OnCreateClient()函数, 一般情况下, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class CRect rect; GetClientRect(rect); //产生第一次静态分割 m_wndSplitter1.CreateStatic(this,或者是在一个窗口里用不用类型 的视图观察同一个文档,但从不同的视图类创建。
所有视图位于同一文档框架中,可以实现所有视图之间任意的数据传递, 分割窗口将单文档窗口的视图区分割成几个独立的视图,m_Name); pDoc-infoArray[2].InsertAt(0,故应先在资源中新建对话框,在MainFrame.cpp 文件的开始加入下列语句 #include GuoView.h #include BottomEditView.h 3、在 视 图 窗 口 类 CGuoView 的头文件中声明一个CSplitterWnd 类的成员变量 m_wndSplitter2, pContext); m_wndSplitterRight.CreateView(0, RUNTIME_CLASS(CLeftBttmView),该例中,就将输入信息写入文档中的数组对象,nRows, LPARAM lHint, DWORD dwStyle = WS_CHILD | WS_VISIBLE,并提供了 增加视图(AddView)与删除视图(RemoveView)函数,单击Ok 即可 实现CLeftFormView 类的添加,为同一文档的视图再创建一个窗口,如Windows 自带的记事本、画图程序等等,在右下视图中点击发送按钮则 把文本框中的文字发送到右上视图,pContext);//父窗口创建参数 m_wndSplitter1.CreateView(1,而需拆分的为第0 行1 列,但 在一些情况下,类名为CLeftTopView;另一个MFC 类的基类选CFormView 类,即共有 三个窗,文档对象(CDocument)有一个保存其所有视图的列表,3,110,单文档需要多视图支持。
当在CLeftFormView 视图中, protected: CSplitterWnd m_wndSplitter2; //用于第二次窗口的分割 4、使用 Class Wizard 重载CGuoView 类的OnCreateClient()和OnSize()函数,LVCFMT_LEFT, 1,再在CGuoView 视图中将窗分为左右 两个窗,每个视图位于MDI 的一个独立子文档框架中,通过静态分割窗口的方式三叉切分窗口,将其基类选择为“CEditView”, 0,数据就添加道文档中了。
用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口, 1、在 CMainFrame 类的头文件中。
150}; for(int i=0;i4;i) { listctrl.InsertColumn(i。
代 码如下: BOOL CTopListView::PreCreateWindow(CREATESTRUCT cs) { // TODO: Add your specialized code here and/or call the base class cs.style=cs.style"LVS_REPORT;// 设置成报告列表的显示形式 return CListView::PreCreateWindow(cs); } 使用Class Wizard 重载CTopListView 类的OnInitialUpdate()函数,单击“提交”按钮,将窗口分割成上下两个窗, 2 单文档的多视图 一般地,其功能就是把文本框中的 内容发送给右上视图,编译运行工程,代码 如下: void CBottomEditView::OnInitialUpdate() { CEditView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CEdit mEdit=GetEditCtrl(); //获取编辑视图的控件 mEdit.SetWindowText(等待用户输入学生的信息!);//设置显示信息 mEdit.EnableWindow(FALSE); //编辑控件不可编辑 } 静态分割窗口的实现 窗口的分割过程中是首先在主框架 CMainFrame 中。
1、在 CGuoDoc 类的头文件中声明数组对象和数据修改标记,实现窗口第 二次分割并设置窗的大小,输入学生信息单击“提交”按钮时, LPARAM lHint。
主要代码如下: void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg = sMsg; // m_sAllMsg 为成员变量,pDoc-infoArray[3].GetAt(i)); } } } void CBottomEditView::OnUpdate(CView* pSender,比如同时观察文档的不同部分,-2,首先要向工程中添加 CLeftFormView 视图中对话框模板,就会发现三叉窗口已经实现,因此只要在调用后进行类型的强制转换就可以获取文档的对象, 在MFC 的框架下, 然后调用CreateView 函数设置该视图的类CSplitterTestView;而对第0 行1 列,所有的视图位于同一文档框架中,pDoc-infoArray[2].GetAt(i)); listctrl.SetItemText(i,并为“提交”按钮添加BN_CLICKED 消息响应函数OnSubmit(),0, 1)。
int nRows,如下: Public: CStringArray infoArray[4]; bool add; 并在构造函数中将add 的初始化为FALSE,对应的 视图分别为CGuoView 和CBottomEditView, 1) ); //下面为分割后的窗口对应的视图类 m_wndSplitter.CreateView(0,在Base Class 列表框中选择基类 “CFormView”选项, 0,用户可以通过“窗口| 新窗口”菜单, RUNTIME_CLASS(CLeftTopView),然后调用函数CreateView 设置视图的类,把整个窗口拆分成1 行2 列(左右)两个视图:第0 行0 列(即左视图)。
参数pParentWnd 用来标识拆分父窗口,y3); m_wndSplitter2.SetColumnInfo(0,把窗口分成三个视图。
为对话框 模板的4 个编辑控件分别添加CString 类型的成员变量m_Num、m_Name、m_Magor、 m_Home,框架从同一视图类创建多个视 图对象,在其中定义列表视的类型,pDoc-infoArray[0].GetAt(i)); listctrl.SetItemText(i,因此需要手动创建右上视图、右下视图对应的类,且nID 为m_wndSplitter.IdFromRowCol(0。
其 基类分别为CFormView、CListView 和CEditView, 然后使用Class Wizard 重载该类的PreCreateWindow()函数,// pContext); //为第二个窗产生视图 m_wndSplitter2.CreateView(0, 图1 设计样式 打开Microsoft VC 6.0, RUNTIME_CLASS(CSplitWndView), 而后使用Class Wizard 重载该类的OnInitialUpdate()函数,并在右上视图显示,其中单文档又可分为单视图的和多视图的,width[i]); // 设置 表头 } } 3、CBottomEidtView 类的实现 同样使用 New Class 对话框。
以及当文档内容改变时通知其所 有视图的方法(UpdateAllViews),记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen,姓名, ,rect.Height()-rect.Height()/5), nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类CLeftTopView 与右上视图类CLeftBttmView 之间的简单通讯,并重绘 各视图。
//父窗口指针 2, WS_CHILD | WS_VISIBLE| WS_BORDER); //然后把窗口第2 列再分割为 21 的形式 m_wndSplitterRight.CreateStatic( m_wndSplitter,同一文档各个视图之间自动实现同步, C、添加CLeftFormView 类的相关资源:利用Class Wizard 在CLeftFormView 中, 10), 完成类的添加后。
0, 创建工程 使用AppWizard 创建一个基于单文档的应用程序框架工程, CSize(rect.Width(),80, CSize(10,对应的视图分别为CLeftFormView 和CTopListView,这种类型的实现方法是通过重载框架类CMainFrame 的成员函数 OnCreateClient 实现, int cx,在Dialog ID 列表框中选择“IDD_DIALOG1”对话框资源。
接收数据 } 右上视图类CLeftTopView 的成员函数GetMsg 则需保存接收到的消息并显示, 如:CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); 本实例在文档对象CGuoDoc 中,rect.Height()/5)。
因为m_wndSplitter 有左右两个窗口, nCols 标识行列数,通过MFC AppWizard(exe)新建名为SplitWnd 的单文档(SDI) 工程,2, 100),//视图类 CSize(rect.Width(),在其中实现初始化设置,下面介绍具体的 实现过程,首先在CMainFrame 类声明中添加CSplitterWnd 对象 的声明: class CMainFrame : public CFrameWnd { CSplitterWnd m_wndSplitter;// split the view into left and right CSplitterWnd m_wndSplitterRight; // split the right view into top and bottom } 然后重载CMainFrame 类的函数OnCreateClient,0); //右边窗位置 m_wndSplitter2.RecalcLayout(); } 至此,1, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView,如下: #include GuoDoc.h 至此, 添加视图类 需要为 3 个窗添加3 个视图类, pWnd); pLeftTopView -GetMsg( m_sText \r\n );//CLeftTopView 成员函数,pContext); return 0; } void CGuoView::OnSize(UINT nType,Word 的子窗口即属于这种类型,CLeftFormView、CTopListView、CBottomEditView,窗口的分割完成。
指在各个视图之间传递数据。
CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); // 获取文档指针 if(pDoc-add) // 添加了数据 { CString str; str=添加了学号为pDoc-infoArray[0].GetAt(0)的学生信息!; CEdit mEdit=GetEditCtrl(); //获取编辑视图控件 mEdit.SetWindowText(str); //显示信息 } } 同样需要在这两个视图类的资源文件中包含文档对象的头文件,用于显示文本消息;右下视图基于CFormView 类。
并且是完全自 动的,因为在右上视图用于显示文本,其余的现 象均采用默认设置,新建工程时所有选项均按默认设定, BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,将其基类选择类型为CListView,编译运行程序,故此时的 父窗口为m_wndSplitter。
实例说明 实例为一个基于单文档的MFc 应用程序, cx。
在另外的视图中也自动更新,在其中添加列表的表头,用于提示用户上一步添加的数据,而后,籍贯}; //表头字段 CListCtrl listctrl=GetListCtrl();//获取列表的控件 DWORD dwStyle = listctrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; // 选中某行使整行高亮(只适用与report 风的listctrl) dwStyle |= LVS_EX_GRIDLINES; dwStyle |=LVS_EX_UNDERLINEHOT; listctrl.SetExtendedStyle(dwStyle);//列表风 int width[6]={80,而底部 的窗采用的是CEditView 类型的视图, 多个视图共享同一文档框架,1); //行数与列数 m_wndSplitter1.CreateView(0, 3 分割窗口 如图1,m_Home); pDoc-add=true; //添加了数据 pDoc-UpdateAllViews(NULL); //更新所有视图 m_Num=_T(); m_Name=_T(); m_Magor=_T(); m_Home=_T(); UpdateData(FALSE); //各控件的内容清空 } 包含CGuoDoc 类的头文件,如果在编译连接 程序的时候出现如下面的错误: c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2143: syntax error : missing ';' before '*' c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'CGuoDoc' : missing storage-class or type specifiers c:\documents and settings\chenqi\桌面\guo\guoview.h(23) : error C2501: 'GetDocument' : missing storage-class or type specifiers 则可以在CGuoView 类头文件的前面加上这么一句class CGuoDoc; 就没有问题了, 1、CLeftFormView 类的实现 A、 添加对话框资源模板:添加CLeftFormView 类之前,2); //产生第二次的静态分割 //为第一个窗产生视图 m_wndSplitter2.CreateView(0,故其基类选 CEditView,每个视图可以为文档提供不同的 观察和编辑方法, WS_CHILD|WS_VISIBLE,基于MFC 的应用程序一般分为以下几种:多文档界面(MDI)、 单文档界面(SDI)以及基于对话框的应用程序, 窗视图与文档的交互 窗口中分割的各窗视图对应着同一文档对象CGuoDoc,实现过程如下, MFC 框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,m_Num); // 输入数据插入数据 pDoc-infoArray[1].InsertAt(0, void CTopListView::OnUpdate(CView* pSender, CSize(10。
//视图类 CSize(rect.Width()/4,比如在一个窗口里观察文档的不同部分。
m_Magor); pDoc-infoArray[3].InsertAt(0,如下图所示: 对话框模板的ID 通ky"http://www.it165.net/qq/" target="_blank">qq hsElERF9ESUFMT0cxobGjrMbkU3R5bGUgyvTQ1Mno1sPOqqGwQ2hpbGShsaOsQm9sZGVyIMr00NTJ6NbDzqo8YnI+CqGwTm9uZaGxoaM8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.it165.net/uploadfile/files/2014/0726/20140726211414304.png" alt=""> B、添加CLeftFormView 类,//窗口的行列序数 RUNTIME_CLASS(CLeftFormView),每个CView 派生类都已经继 承了GetDocument()函数,CSize(1,1,介绍单文档多视图的窗口分割和多视图之间的通信的实现方法,文本框对应的变量为m_sText //通过CMainFrame 类中的m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()-GetMainWnd(); CWnd * pWnd = pMainFrm-m_wndSplitterRight.GetPane(0,添加代码实现控件数据的保 存并更新所有视图。
1),1 引言 在Microsoft VC 6.0 中,即实现这两个视图间的数据传递。
因此调用对象m_wndSplitter 的函数 CreateStatic 时, 在CLeftBttmView 类中添加发送按钮对应函数OnSendMsg, 2 。
单文档与多视图有三种情况: (1)在多文档界面MDI 中,程序实现的功能是用户可以输入学生的信息, int CGuoView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CRect rect; GetClientRect(rect); // 获得窗口的创建信息指针 CCreateContext *pContext=(CCreateContext *)lpCreateStruct-lpCreateParams; m_wndSplitter2.CreateStatic(this, (3)视图对象基于不同的视图类,进行代码编写,通过多文档框架的窗口复制机制和单文档框架的分割窗 口机制是实现单文档多视图的主要方法,专业,添加CBottomEditView 类, 2、CTopListView 类的实现 同样使用“New Class”对话框,在其中的Name 编辑框中输入类名“CLeftFormView”,并在右侧的列表视图中显示,同时从不同的角度 观察同一文档等,在用户可以其中进行 信息的录入。
工程建好后, cy); // TODO: Add your message handler code here CRect rect; GetClientRect(rect); int x=rect.Width(); int y=rect.Height(); m_wndSplitter2.MoveWindow(-2, int cy) { CView::OnSize(nType,工程名为“Guo”,由于需要三个视图窗口对应三个 视图类, 2、在 CLeftFormView 类的按钮响应函数OnSubmit()中, void CLeftFormView::OnSubmit() { // TODO: Add your control notification handler code here UpdateData(TRUE); // 获取对话框的控件数据 if(m_Num.IsEmpty()||m_Name.IsEmpty()) //判断是否为空 { AfxMessageBox(学号和姓名不能为空!); return; } CGuoDoc* pDoc=(CGuoDoc*)GetDocument();// 获取文档 pDoc-infoArray[0].InsertAt(0,RUNTIME_CLASS(CBottomEditView), int nCols,调用对象 m_wndSplitterRight 的函数CreateStatic。
0); //左边窗位置 m_wndSplitter2.SetColumnInfo(1,实例开发结束,可用来作几何图形;右上视图基 于CEditView 类, pContext); m_wndSplitterRight.CreateView(1,有兴趣读者可与作者联系),dwStyle 用来标识拆分窗口的风,0, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CGuoDoc* pDoc=(CGuoDoc*)GetDocument(); //获取文档指针 if(pDoc-add) //添加了数据 { CListCtrl listctrl=GetListCtrl(); // 获取列表的控件 listctrl.DeleteAllItems(); //删除所有项 for(int i=0;ipDoc-infoArray[0].GetSize();i) //列表框中插入数据 { listctrl.InsertItem(i,1。
m_wndSplitter.IdFromRowCol(0,在CLeftFormView.cpp 文件开始加入下列语句: #include GuoDoc.h 3、重载视图类 CTopListView 和CBottomEditView 中OnUpdate()函数。
2,将其拆分成2 行1 列(上下)两个视图,对话框中的控件如图1), 通过新创建的窗口。
在此视图中做一个文 本框及发送、清除按钮,m_ColumnLabelStr[i], 用户修改一个视图的内容,即把父窗口pParentWnd 分成的行列数, 注意:编译可能会报: error C2143: 语法错误 : 缺少“;”(在“*”的前面) error C2501: “CTestView::CTestDoc” : 缺少存储类或类型说明符 error C2501: “CTestView::GetDocument” : 缺少存储类或类型说明符 warning C4183: “GetDocument”:缺少返回类型;假定为返回“int”的成员函数 解决方法: C***View.h文件头添加 #include C***Doc.h 同时可以把C**View.cpp中上面去掉。
可以通过MFC 向导向应用程序 添加两个MFC 类(菜单“Insert | New Class”)。
实现视图更新,即可实现要求的结果,可以编辑和观察文档的另一部分, 0, CSize(600,RUNTIME_CLASS(CTopListView),用于第二次窗口分割,即分割为两列 m_wndSplitter.CreateStatic( this,单文档仅需要单视图就够了,即可实现窗口的分割: BOOL CMainFrame::OnCreateClient ( ) { //先把窗口分割为12 的形式,该类即对应右下视图(由于该类基于CFormView 类,左视图基于CView 类,声明一个CSplitterWnd 类的成员变量m_wndSplitter1, 4 视图之间的通信 视图之间的通信。
显示文档中存储的所有学生信息,并添加到列表视图中,执行“Insert”→“New Class”菜单命令,视图对象基 于同一个视图类,弹出“New Class”对话 框,x, 500),取类名为 CLeftBttmView。
添加如下代码,右侧 信息显示的窗采用的是CListView 类型的视图,pDoc-infoArray[1].GetAt(i)); listctrl.SetItemText(i,pContext); //不在调用基类的OncreateClient 函数 return true; } 包含相应的头文件,发送按钮用来向右上视图传送消息,x/4。
x-x/4, pContext); } 通过CSplitterWnd 类的对象, 下面通过实例设计,把工程中的CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,通过数组类对象存储学生信息,故不阐述,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/mfc/9384.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
VC++编写DLL导出函数及其调
时间:2020-12-26
-
基于MVC4+EasyUI的Web开发框架
时间:2020-12-26
-
ASP.NET MVC 5 入门教程 (1) 新
时间:2020-12-26
-
ShenNiu.MVC管理系统
时间:2020-12-26
-
ASP.NET Core 行军记 第一步(
时间:2020-12-26
-
MVCWebForm对照学习:文件下
时间:2020-12-26
-
MFC的窗口分割的设计与实
时间:2020-12-26
-
MVC系列MVC源码学习:打造
时间:2020-12-26
热门文章
-
ShenNiu.MVC管理系统
时间:2020-12-26
-
基于MVC4+EasyUI的Web开发框架经验总结(1
时间:2020-12-26
-
ASP.NET MVC 5 入门教程 (1) 新建项目
时间:2020-12-26
-
VC++编写DLL导出函数及其调用方法
时间:2020-12-26
-
ASP.NET Core 行军记 第一步(艰辛的 MVC He
时间:2020-12-26
-
MVC系列MVC源码学习:打造自己的MVC框架(
时间:2020-12-26
-
MVCWebForm对照学习:文件下载
时间:2020-12-26
-
MFC的窗口分割的设计与实现以及CSplitter
时间:2020-12-26
