在对话框中加入属性页
|
在对话框中加入属性页 下载本文全部源代码 方案一 本方案的例子请见源代码打包文件中的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; } 这样做以后就可以使界面上的控件在不同的标签中显示了,但是这个方案也有很多弊病。 所有的控件仍然在一个对话框内,在使用对话框编辑器进行编辑时,操作很不方便。 方案二 本方案的例子请见源代码打包文件中的Property2部分这个方案中,我将使用MFC中现成的CPropertySheet和CPropertyPage类来完成将控件分散到各个对话框类中。 首先加入两个(或数个)对话框资源。修改各对话框资源的属性,将对话框的Caption属性改为你要在标签上所显示的文字。将对话框的Style属性改为:Child, Border属性改为:Thin, 只选中Title Bar复选框,去掉其他复选框。然后你可以在这些对话框中加入要分开显示的各个控件。 为上述对话框资源分别制作一个对话框类,该对话框类是从CPropertyPage继承。这样一来各子对话框类就好了,主对话框类可以直接使用CPropertySheet类。使用如下代码即可:
但是会有人问,如何在主对话框中放置其他控件呢?如果直接使用CPropertySheet的话,是不可以的,但是别忘了我们可以从CPropertySheet类继承自己的类啊!下面来看看方案三的做法。 方案三 本方案的例子请见源代码打包文件中的Property3部分首先还是要创建那些要在属性页中的显示的子对话框类,创建步骤和方案二一样,都是从CPropertyPage继承。 这次我们将从CPropertySheet类继承自己的类(假设类名为CMySheet)。我们要在这里放上一个button控件。那么现在先在CMySheet中加入一个CButton类的成员变量m_button。 在CMySheet类中的OnInitDialog()函数里,这样写: 使用方案三虽然能在主对话框中加入控件,但是也比较麻烦,首先所加的控件只能在属性页的右边或下边。并且用程序来产生控件比较烦琐,位置与大小不易控制。那么还有其他方法,既能在对话框中加入属性页,又能在主对话框随意添加控件?还是有的,看看方案四。 方案四 本方案的例子请见源代码打包文件中的Property4部分这次我们不从CPropertySheet继承自己的类,还是直接使用它。各属性页的子对话框类还是需要的,创建方法和上述两个方案相同。 首先我们新建一个基于对话框的工程。在编辑已有的一个主对话框中可以自由加一些所需的控件,但是得留出一定的空间用于放置属性页。 在主对话框类里加入一个CPropertySheet类的一个成员变量(m_sheet)代表整个属性页。再加入一些各子对话框类的实例作为成员变量(m_page1、m_page2……)。 在主对话框类的OnInitDialog()函数中加入://加入标签,标签名由各个子对话框的标题栏决定
m_sheet.AddPage(&m_page1);
m_sheet.AddPage(&m_page2);
//用Create来创建一个属性页
m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);
RECT rect;
m_sheet.GetWindowRect(&rect);
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_page1, IDD_DIALOG1); m_sheet.AddPage("tab2", &m_page2, IDD_DIALOG2); m_sheet.Show(); 就这样就可以在对话框上制作出一个完美的属性页了。效果和上图完全一样。下面我就来讲讲CTabSheet类的细节内容。 CTabSheet是从CTabCtrl继承来的,用于Tab Control的控件类。在类中有一个成员变量用来记录各子对话框的指针CDialog* m_pPages[MAXPAGE]; MAXPAGE是该类所能加载的标签的最大值。 类中有一个AddPage方法,用于记录子对话框的指针和所使用对话框资源的ID号。 本文共使用了5种方法在对话框中加属性页,当然应该还有其他方法,当本人水平有限,如果各位读者有更好的方法,可不要忘了告诉我。 作者信箱:hcl-hcl@21cn.com |
- · 黑客攻击手段之偷梁换柱
- · 完善 CPopupText 类
- · 让工具条显示256色图像
- · 使用测试优先方法开发用户界面
- · 一个简单的登录对话框的实现
- · 一个简单的日记本程序
- · 从资源中加载皮肤
- · 一个在RichEdit中添加表情图象的类
- · ActiveSkin 4.3 软件换肤在VC中的实现
- · 一种另类“关于(About)”对话框的动态显示方法
- · 对话框打印预览及打印
- · 关于如何换肤、子类化的解决方案
- · 制作 MSN、QQ 的消息提示窗口
- · 如何对 BCGControlBarPro 进行换肤
- · 定制个性化的对话框窗口类
- · 透明窗体的又一实现
- · 橡皮区矩形 CRectTracker C# 实现
- · 轻松实现类 MSDN 2002 界面(二)
- · 轻松实现类 MSDN 2002 界面
- · 数据库开发之窗体编程
- · 一个打印报表的简单的类
- · SDK 程序使用SkinMagic工具包换皮肤
- · Windows SDK笔记(七):创建MDI窗口
- · Windows SDK笔记(六):使用对话框资源建立窗口
- · Windows SDK笔记(五):非模式对话框
- · Windows SDK笔记(四):模式对话框
- · 也谈如何隐藏显示在任务栏中的对话框程序
- · 一个托盘程序演示 -闹钟 Alert
- · think window procedure
- · 再谈 CFileDialog 对话框的定制
- · 获得 Win32 窗口句柄的更好的方法
- · 个人考勤软件开发实例配套代码 2.1版(Update…
- · 介绍一个操作DHTML表格的C++对象
- · Windows资源管理器Web视图界面
- · 为你的程序换个皮肤
- · 程序启动画面
- · 实现标题条的显示与隐藏
- · 在EVC3.0中创建MDI程序
