MFC的类CPropertySheet问题

MFC的类CPropertySheet问题,第1张

你可以 在你需要d出属性对话框的地方这样使用:

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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11234964.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存