
CPropertySheet ProSheet("设置")
C***Page1 page1
C***Page2 page2
C***Page3 page3
ProSheet.AddPage(&page1)
ProSheet.AddPage(&page2)
ProSheet.AddPage(&page3)
if( ProSheet.DoModal()== IDOK)
{
}
VC6.0不是那样的,可以贴出来看看你的VC6.0的源代码
在你的CPropSheet构造函数AddPage进去就行了
低于4.0的VisualC版本,MFC必须自己实现。
CPropertySheet .在资源编辑器中为您的CPropertySheet设置第一个CPropertyPage。
对话框资源的字体可以设置字体。在运行时,该表将使用字体设置,一切都取决于字体大小。VisualC 4.0之初,MFC使用
Windows 95 PropertySheet控件。该控件将始终使用系统字体来显示表格。这是设计的结果。MFC还将强制页面使用与表格相同的字体。
以这种方式调用BuildPropPageArray()函数。因为这是一个没有出处的函数,所以在将来的MFC版本中可能会被更改或删除。
CMySheet将使用第一个活动的CPropertyPage字体来设置字体和CPropertySheet及其子窗口的大小。资源编辑器中指定的CPropertyPages和字体显示。
具体步骤:
创建一个从CPropertySheet继承的新类CMySheet。
2.中大致实现如下。cpp文件。
3.修改。h文件。
4.使用此CMySheet更改资源中的属性页,设置的字体将在程序运行后生效。
#定义WM_RESIZEPAGE WM_APP 1
enum { CDF_CENTER,CDF_TOPLEFT,CDF_NONE }。
//为窗口及其所有子窗口设置字体的helper函数
//并根据新字体调整所有内容的大小
void ChangeDialogFont(CWnd* pWnd,CFont* pFont,int nFlag)
{
CRect windowRect
//获取旧的和新的文本度量
TEXTMETRIC tmOld,tmNew
CDC * pDC = pWnd->GetDC();
CFont * pSavedFont = pDC->select object(pWnd->get font());
pDC->GetTextMetrics(
1. 创建属性页1) 用对话框编辑器创建一个或多个对话框模板 (见例 38),这些模板应该包含应用程序支 持的所有优先选项。每个模板的风格应该是 Thin边框、 Child和没有系统菜单,不管为该模板 选择什么标题都将成为该优先选项标签上看到的名字。尽管使得属性页有相同的大小,但是, 整个属性表的大小将根据添加到它的最大对话框模板的大小来确定。
2) 用ClassWizard为每个对话框模板创建一个类,从 CPropertyPage派生它们。为对话框中 的每个控件创建一个成员变量 (见例 39),也为每个控件添加消息处理函数,指示控件被修改。 在那个处理函数中,调用 SetModified (TRUE),这将通知属性表启用 Apply按钮。
void CFirstPage::OnChange()
{
SetModified(TRUE)
}
3) 在第一个属性页的类中,用 ClassWizard重载 OnOK( ) ,同时在该类中,把用户定义的 称为 W M _ A P P LY 的窗口消息发送到 C M a i n F r a m e 类。还要在那个类中调用 S e t M o d i f i e d (FALSE)关闭 Apply按钮;每当 OK 或Apply按钮被击中时,每页上的 OnOK( ) 函数就被调用, 但是只需在一页中处理它。我们将在以后分析 WM_APPLY消息的效应。
#define WM_APPLY WM_USER+1
:::
void CFirstPage::OnOK()
{
AfxGetMainWnd()->SendMessage(WM_APPLY)SetModified(FALSE)
CPropertyPage::OnOK()
}
4) 有关属性页类的详细清单参见本节的“清单—属性页类”。
2. 创建属性表
1) 用菜单编辑器创建一个新的主菜单项 — O p t i o n s ,它只有一个唯一的子菜单项 —Preferences。
2) 在CMainFrame类中,用 ClassWizard处理Preferences子菜单项。
3) 首先用 C P r o p e r t y S h e e t 类创建的一个属性表,以处理该 P r e f e r e n c e s 命令;然后用 AddPage( )将前面创建的类作为属性值添加到属性表中;用任何当前设置值,初始化该页的成 员变量,然后用 DoModal显示属性表。
void CMainFrame::OnOptionsPreferences()
{
CPropertySheet sheet(_T( "Preferences"),this)m_pFirstPage=new CFirstPagem_pSecondPage=new CSecondPage
sheet.AddPage(m_pFirstPage)
sheet.AddPage(m_pSecondPage)
m_pFirstPage->m_bOption1 = m_bFirstOption1m_pFirstPage->m_sOption2 = m_sFirstOption2m_pSecondPage->m_nOption1 = m_nSecondOption1m_pSecondPage->m_sOption2 = m_sSecondOption2
sheet.DoModal()delete m_pFirstPagedelete m_pSecondPage
}
在最后一步中,来自属性页的值从不存储在产生它们的应用程序中,那是 WM_APPLY消 息进来的地方。
4) 通过把下面的项目添加到 MainFrm.cpp的消息映像中,为 WM_APPLY窗口消息手工添 加一个消息处理程序。注意把它放到 //}}AFX_MSG_MAP符号下面,否则 ClassWizard 可能删 除它。
ON_MESSAGE_VOID(WM_APPLY_OnApply)在MainFrm.h中定义 OnApply( )如下: afx_msg void OnApply()
5) 现在执行 CMainFrame中的OnApply( ),以便它把来自属性页的变量存回到应用程序中。 前面已提过,每当属性表上的 Apply或OK按钮被单击时,该消息将被发送。
void CMainFrame::OnApply()
{
m_bFirstOption1 = m_pFirstPage->m_bOption1m_sFirstOption2 = m_pFirstPage->m_sOption2m_nSecondOption1 = m_pSecondPage->m_nOption1m_sSecondOption2 = m_pSecondPage->m_sOption2
}
说明
■ 习惯上,应用程序优先选项在 CMainFrame类中被处理,尽管真正的选项存储的地方依
据它使用的地方而不同。
■ 如果想把用户自己的按钮添加到属性表,从 CPropertySheet派生类,并在前面的例子中
使用该派生类;要添加用户自己的按钮,首先,必须使属性页大得足以处理它们;用 C l a s s Wi z a r d 把一个处理 W M _ C R E AT E 的消息处理函数添加到新类中,用那里的 MoveWindow( )使表成为需要的大小。要创建自己的按钮,则使用例 46所示的方法。
■ 在对话框编辑器中看见标签控制工具时,首要假定它具有与属性表相同的功能。事实上,它没有任何功能,标签控件与列表控件更相似,因为它只跟踪所在的页,并且由 你负责用一个对话框填充一属性页;如果完全可能的话,尽量避免单独使用一个标签 控件。
CD说明
在CD上执行该工程时,单击 Options/Preferences菜单命令以打开一个属性表。
清单—属性页类
#if !defined AFX_FIRSTPAGE_H
#define AFX_FIRSTPAGE_H
// FirstPage.h : header file
//
///////////////////////////////////////////////////////////////
// CFirstPage dialog
class CFirstPage : public CPropertyPage
{
DECLARE_DYNCREATE(CFirstPage)
// Construction public:
CFirstPage()
~CFirstPage()
// Dialog Data
//{{AFX_DATA(CFirstPage)
enum {IDD = IDD_FIRST_PAGE}BOOL m_bOption1
CString m_sOption2
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CFirstPage)
public:
virtual void OnOK()
protected:
virtual void DoDataExchange(CDataExchange* pDX) // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CFirstPage)
afx_msg void OnChange()
//}}AFX_MSG DECLARE_MESSAGE_MAP()
}
///////////////////////////////////////////////////////////////
// FirstPage.cpp : implementation file
//
#include "stdafx.h"
#include "wzd.h"
#include "FirstPage.h"
#include "WzdProject.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__
#endif
///////////////////////////////////////////////////////////////
// CFirstPage property page
IMPLEMENT_DYNCREATE(CFirstPage, CPropertyPage) CFirstPage::CFirstPage() : CPropertyPage(CFirstPage::IDD)
{
//{{AFX_DATA_INIT(CFirstPage) m_bOption1 = FALSEm_sOption2 = _T( "")
//}}AFX_DATA_INIT
}
CFirstPage::~CFirstPage()
{
}
void CFirstPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX)
//{{AFX_DATA_MAP(CFirstPage) DDX_Check(pDX, IDC_CHECK, m_bOption1)DDX_Text(pDX, IDC_EDIT, m_sOption2)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFirstPage, CPropertyPage)
//{{AFX_MSG_MAP(CFirstPage) ON_BN_CLICKED(IDC_CHECK, OnChange) ON_EN_CHANGE(IDC_EDIT, OnChange)
//}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////
// CFirstPage message handlers
void CFirstPage::OnChange()
{
SetModified(TRUE)
}
// only needed on one page!
void CFirstPage::OnOK()
{
AfxGetMainWnd()->SendMessage(WM_APPLY)SetModified(FALSE)
CPropertyPage::OnOK()
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)