博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态切割窗体+关联对话框
阅读量:6656 次
发布时间:2019-06-25

本文共 1820 字,大约阅读时间需要 6 分钟。

 静态切割窗体

       创建静态切割窗体的步骤为:

       1. 在父框架类中定义一个CSplitterWnd类型的成员对象。

       2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。

       3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,然后能够调用CSplitterWnd成员对象的CreateView成员函数为每一个窗格创建视图。 

       实例:在主框架窗体中的客户区创建一个两行一列的静态切割窗体:(首先创建一个名为“Example34”的MFC单文档project)

       1. 在MainFrm.h文件里为CMainFrame类加入成员对象:CSplitterWnd m_wndSplitter;。

       2. 在Class View类视图中找到CMainFrame类,右键点击。在右键菜单中选择Properties,就会显示属性页。然后在属性页的工具栏上点击Tip为Overrides的button,以下的列表中就列出了可以重载的函数,找到OnCreateClient生成重载函数。

       3. 在MainFrm.cpp文件里找到刚重载的OnCreateClient函数进行改动。由于鸡啄米没有新建其它视图类,所以上下两个窗格的视图都是CExample34View。为了能识别CExample34View类,还需在MainFrm.cpp文件里加入#include "Example34View.h",在Example34View.h文件里加入#include "Example34Doc.h"。终于OnCreateClient函数改动例如以下:

C++代码
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.     CRect rc;   
  5.   
  6.     // 获取框架窗体客户区的CRect对象   
  7.     GetClientRect(&rc);   
  8.   
  9.     // 创建静态切割窗体。两行一列   
  10.     if (!m_wndSplitter.CreateStatic(this, 2, 1))   
  11.         return FALSE;   
  12.   
  13.     // 创建上面窗格中的视图   
  14.     if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  15.         return FALSE;   
  16.   
  17.     // 创建以下窗格中的视图   
  18.     if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  19.         return FALSE;   
  20.   
  21.     return TRUE;   
  22.   
  23.     //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
  24. }  

       4. 执行程序,在结果界面中关掉其它面板后效果例如以下:

 静态切割窗体

       假设大家想创建在当中某个窗格中再嵌套切割窗体,那么就须要再定义一个CSplitterWnd对象,以父窗格所在的CSplitterWnd对象为父框架窗体创建切割窗体就可以。

怎样将子窗体和对话框关联起来?

Class View,右击project名,Class Wizard,Add Class下拉菜单选择MFC Class...,填写类名CInfoView并选择基类为CFormView。此时会自己主动生成InfoView.h和InfoView.cpp并自己主动生成了一个对话框。在MainFrm.cpp文件里包括头文件InfoView.h

最后,将上面代码改动为:

  1.   if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CInfoView), CSize(rc.Width(), rc.Height()/2), pContext))   
  2.         return FALSE;   

如此一来,上面的子窗体就和对话框关联起来了。也就是说,上面的子窗体显示的是该对话框。

转载地址:http://jkxto.baihongyu.com/

你可能感兴趣的文章
Laravel 5.2 教程 - 邮件
查看>>
Linux SSH批量分发管理
查看>>
指定域控制器登录
查看>>
10 alternative careers for burned-out IT workers
查看>>
我的友情链接
查看>>
AngularJS第四课:应用模块化
查看>>
《模式 工程化实现及扩展 (设计模式 C#版)》 - 书摘精要
查看>>
Spring Boot 配置文件 – 在坑中实践
查看>>
mysql二进制日志(bin-log)配置及相关操作
查看>>
LVM+Xen虚拟化应用
查看>>
证书服务器CA的搭建和管理
查看>>
存储过程调用遇到的坑
查看>>
月薪3千与3万文案的区别!一字千金就体现在细微之处
查看>>
***经验16.5.2总结
查看>>
thunar、nautilus右键添加 "压缩/解压"菜单
查看>>
基于jQuery的waterfall(瀑布流)布局
查看>>
heartheat+drbd高可用存储
查看>>
打包压缩
查看>>
将ip转为整数以及整数转为ip的java实现
查看>>
Ubuntu 12.04中文输入法的安装
查看>>