




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在在 VC 对话框中加入属性页对话框中加入属性页 当一个基于对话框的程序中有相当多的控件时 你一定会想到使用属性页来将 这些控件分类放置 本文针对这种方法来讨论几种可能实现的方案 方案一 本方案的例子请见源代码打包文件中的 Property1 部分 在对话框上放置一个 Tab Control 的控件 再在对话框上放置所需的控件 本例放置了 2 个按钮 试图在每个标签中显示一个 然后利用 Class Wizard 来为 Tab Control 控件创建一个控件变量 该变量是 CTabCtrl 类的 再为其他 控件也创建相应的控件类 在主对话框的初始函数中 CProperty1Dlg OnInitDialog 加入如下代码 本例插入两个标签 实际运用中可通过循环插入所需个数的标签 运行后默 认第一个标签被选中 m tab InsertItem 0 T Tab1 m tab InsertItem 1 T Tab2 将不是第一个标签的控件隐藏掉 只留下你要的控件 m button2 ShowWindow SW HIDE 再利用 ClassWizard 处理 Tab Control 的 TCN SELCHANGE 的消息 在 消息处理函数中 利用 CWnd ShowWindow 来使相应的控件显示和隐藏 void CProperty1Dlg OnSelchangeTab1 NMHDR pNMHDR LRESULT pResult GetCurSel 返回当前被选中的标签的索引号 以 0 为基础算起 int sel m tab GetCurSel switch sel case 0 m button1 ShowWindow SW SHOW m button2 ShowWindow SW HIDE break case 1 m button2 ShowWindow SW SHOW m button1 ShowWindow SW HIDE break pResult 0 这样做以后就可以使界面上的控件在不同的标签中显示了 但是这个方案也有 很多弊病 所有的控件仍然在一个对话框内 在使用对话框编辑器进行编辑时 操作很不 方便 为了能分类显示控件 必须用 ClassWizard 为每一个控件创建一个控件变量 以便利用各控件变量的 CWnd 基类的 ShowWindow 函数来显示和隐藏 有时为 了使用 DDX 和 DDV 机制来进行数据交换 还要创建一些存放值的变量 这样就 使得整个对话框类变得相当庞大难以操作 当然你也可以使用数组来存放那些控件变量或值变量 但是这样并不是最好 有时一些不相关的控件变量放入一个数组中 通过没有实际意义的数组索引号来访 问控件 对程序的编写会造成麻烦 最好能将所有控件进行分类 放入不通对话 框类中 这些对话框作为子对话框出现在主对话框中 可以 现在看看方案二 方案二 本方案的例子请见源代码打包文件中的 Property2 部分 这个方案中 我将使用 MFC 中现成的 CPropertySheet 和 CPropertyPage 类来完成将控件分散到各个对话框类中 首先加入两个 或数个 对话框资源 修改各对话框资源的属性 将对话框的 Caption 属性改为你要在标签上所显示的文字 将对话框的 Style 属性改为 Child Border 属性改为 Thin 只选中 Title Bar 复选框 去掉其他复选框 然后你可以在这些对话框中加入要分开显示的各个控件 为上述对话框资源分别制作一个对话框类 该对话框类是从 CPropertyPage 继承 这样一来各子对话框类就好了 主对话框类可以直接使用 CPropertySheet 类 使用如下代码即可 CPropertySheet sheet 属性页对话框 CPage1 page1 CPage2 page2 加入子对话框作为一个属性页 sheet AddPage sheet AddPage 产生一个模态对话框 也可以使用 Create 方法来产生一个非模态对话框 具体参见 MSDN sheet DoModal 这样这个对话框效果如下 但是会有人问 如何在主对话框中放置其他控件呢 如果直接使用 CPropertySheet 的话 是不可以的 但是别忘了我们可以从 CPropertySheet 类继承自己的类啊 下面来看看方案三的做法 方案三 本方案的例子请见源代码打包文件中的 Property3 部分 首先还是要创建那些要在属性页中的显示的子对话框类 创建步骤和方案二一 样 都是从 CPropertyPage 继承 这次我们将从 CPropertySheet 类继承自己的类 假设类名为 CMySheet 我们要在这里放上一个 button 控件 那么现在先在 CMySheet 中加入一个 CButton 类的成员变量 m button 在 CMySheet 类中的 OnInitDialog 函数里 这样写 BOOL bResult CPropertySheet OnInitDialog 取得属性页的大小 CRect rectWnd GetWindowRect rectWnd 调整对话框的宽度 SetWindowPos NULL 0 0 rectWnd Width 100 rectWnd Height SWP NOMOVE SWP NOZORDER SWP NOACTIVATE CRect rectButton rectWnd Width 25 25 rectWnd Width 75 75 用程序创建一个按钮 m button Create Button BS PUSHBUTTON CRect rectWnd Width 25 rectWnd Width 75 50 this 1 显示这个按钮 m button ShowWindow SW SHOW CenterWindow return bResult 效果如下 使用方案三虽然能在主对话框中加入控件 但是也比较麻烦 首先所加的控件 只能在属性页的右边或下边 并且用程序来产生控件比较烦琐 位置与大小不易控 制 那么还有其他方法 既能在对话框中加入属性页 又能在主对话框随意添加控 件 还是有的 看看方案四 方案四 本方案的例子请见源代码打包文件中的 Property4 部分 这次我们不从 CPropertySheet 继承自己的类 还是直接使用它 各属性页 的子对话框类还是需要的 创建方法和上述两个方案相同 首先我们新建一个基于对话框的工程 在编辑已有的一个主对话框中可以自由 加一些所需的控件 但是得留出一定的空间用于放置属性页 在主对话框类里加入一个 CPropertySheet 类的一个成员变量 m sheet 代表整个属性页 再加入一些各子对话框类的实例作为成员变量 m page1 m page2 在主对话框类的 OnInitDialog 函数中加入 加入标签 标签名由各个子对话框的标题栏决定 m sheet AddPage m sheet AddPage 用 Create 来创建一个属性页 m sheet Create this WS CHILD WS VISIBLE WS EX CONTROLPARENT RECT rect m sheet GetWindowRect int width rect right rect left int height rect bottom rect top 调整属性页的大小和位置 m sheet SetWindowPos NULL 20 50 0 0 SWP NOSIZE SWP NOZORDER SWP NOACTIVATE 效果如下 这个方案可以自由在主对话框中加一些必要的控件 而且属性页中的控件也都 分散在了各个子对话框类中 使用非常方便 但是这样也有一些缺陷 主对话框不能处理属性页上标签的消息 即点击标签 时无法通知主对话框 可能笔者水平有限 理论上应该可以 但笔者尚未解决这 个问题 方案五 本方案的例子请见源代码打包文件中的 Property5 部分 这次我们仍然要使用 Tab Control 并且从 CTabCtrl 控件类继承自己的类 CTabSheet 来处理 此方法来自 CodeGuru 的一篇文章 本人稍做修改使 其使用更简便 首先我先介绍一下如何使用 CTabSheet 先要制作子对话框类 这次的子对话框类不要从 CPropertyPage 继承 而是 直接从 CDialog 继承 并且各个子对话框资源的属性应设置为 Style 为 Child Border 为 None 在主对话框资源中 加入一个 Tab Control 并且适当调整位置和大小 利 用 ClassWizard 来为这个 Tab Control 创建一个 CTabSheet 的控件变量 在主对话框的 OnInitDialog 加入 m sheet AddPage tab1 m sheet AddPage tab2 m sheet Show 就这样就可以在对话框上制作出一个完美的属性页了 效果和上图完全一样 下面我就来讲讲 CTabSheet 类的细节内容 CTabSheet 是从 CTabCtrl 继承来的 用于 Tab Control 的控件类 在类中 有一个成员变量用来记录各子对话框的指针 CDialog m pPages MAXPAGE MAXPAGE 是该类所能加载的标签的最大值 类中有一个 AddPage 方法 用于记录子对话框的指针和所使用对话框资源的 ID 号 BOOL CTabSheet AddPage LPCTSTR title CDialog pDialog UINT ID if MAXPAGE m nNumOfPages return FALSE 保存目前总的子对话框数 m nNumOfPages 记录子对话框的指针 资源 ID 要在标签上显示的文字 m pPages m nNumOfPages 1 pDialog m IDD m nNumOfPages 1 ID m Title m nNumOfPages 1 title return TRUE 在使用 AddPage 加入了若干子对话框后 必须调用 CTabSheet 的 Show 方法来真正生成标签和子对话框 void CTabSheet Show 利用 CDialog Create 来创建子对话框 并且使用 CTabCtrl InsertItem 来加上相应的标签 for int i 0 i Create m IDD i this InsertItem i m Title i 由于对话框显示时默认的是第一个标签被选中 所以应该让第一个子对话框 显示 其他子对话框隐藏 m pPages 0 ShowWindow SW SHOW for i 1 i ShowWindow SW HIDE SetRect 生成好标签和子对话框后 调用 CTabSheet SetRect 来计算并调整属性页 的大小 void CTabSheet SetRect CRect tabRect itemRect int nX nY nXc nYc 得到 Tab Control 的大小 GetClientRect GetItemRect 0 计算出各子对话框的相对于 Tab Control 的位置和大小 nX itemRect left nY itemRect bottom 1 nXc tabRect right itemRect left 2 nYc tabRect bottom nY 2 利用计算出的数据对各子对话框进行调整 m pPages 0 SetWindowPos for int nCount 1 nCount SetWindowPos 在单击标签栏后 应该是相应的子对话框显示 正在显示的子对话框应该隐藏 因此利用 ClassWizard 来处理 WM LBUTTONDOWN 消息 void CTabSheet OnLButtonDown UINT nFlags CPoint point CTabCtrl OnLButtonDown nFlags point 判断是否单击了其他标签 if m nCurrentPage GetCurFocus 将原先的子对话框隐藏 m pPages m nCurrentPage ShowWindow SW HIDE m nCurrentPage GetCurFocus 显示当前标签所对应的子对话框
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 配电网设备运维员入职考核试卷及答案
- 稀土冶炼工操作考核试卷及答案
- 偏光镜户外运动适应性研究报告
- 办公隔音效果测试规范报告
- 水利项目标准化管理现状分析报告
- 工艺画制作工三级安全教育(班组级)考核试卷及答案
- 醋酸乙烯装置操作工基础知识考核试卷及答案
- 油气输送工操作考核试卷及答案
- 宠物健康护理员综合考核试卷及答案
- 果树营养改善措施分析报告
- MT-T 1199-2023 煤矿用防爆柴油机无轨胶轮运输车辆通用安全技术条件
- Linux系统基础操作培训文档
- 酿造车间绩效考核制度
- 石油化工工艺装置蒸汽管道配管的设计
- 人教版五年级道德与法治上册第7课《中华民族一家亲》优秀课件
- 肝癌的中西医治疗
- 芳华电影介绍模板课件
- 四川省高中信息技术会考试题
- 应急管理行业解决方案及应用
- DBJ50∕T-352-2020 工程建设工法编制标准
- 行政审批中介服务规范治理自查自纠表
评论
0/150
提交评论