优先选项。
答案:5 悬赏:10 手机版
解决时间 2021-01-18 00:11
- 提问者网友:萌卜娃娃
- 2021-01-17 13:28
优先选项。
最佳答案
- 五星知识达人网友:有你哪都是故乡
- 2021-01-17 14:24
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 CFirstPage; m_pSecondPage=new CSecondPage;
sheet.AddPage(m_pFirstPage);
sheet.AddPage(m_pSecondPage);
m_pFirstPage->m_bOption1 = m_bFirstOption1; m_pFirstPage->m_sOption2 = m_sFirstOption2; m_pSecondPage->m_nOption1 = m_nSecondOption1; m_pSecondPage->m_sOption2 = m_sSecondOption2;
sheet.DoModal(); delete m_pFirstPage; delete 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_bOption1; m_sFirstOption2 = m_pFirstPage->m_sOption2; m_nSecondOption1 = m_pSecondPage->m_nOption1; m_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 = FALSE; m_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();
}
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 CFirstPage; m_pSecondPage=new CSecondPage;
sheet.AddPage(m_pFirstPage);
sheet.AddPage(m_pSecondPage);
m_pFirstPage->m_bOption1 = m_bFirstOption1; m_pFirstPage->m_sOption2 = m_sFirstOption2; m_pSecondPage->m_nOption1 = m_nSecondOption1; m_pSecondPage->m_sOption2 = m_sSecondOption2;
sheet.DoModal(); delete m_pFirstPage; delete 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_bOption1; m_sFirstOption2 = m_pFirstPage->m_sOption2; m_nSecondOption1 = m_pSecondPage->m_nOption1; m_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 = FALSE; m_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();
}
全部回答
- 1楼网友:纵马山川剑自提
- 2021-01-17 17:19
B
- 2楼网友:七十二街
- 2021-01-17 16:11
你有什么问题啊?
- 3楼网友:行雁书
- 2021-01-17 14:55
出这么高的分,问题怎么这么简单明了呀
- 4楼网友:躲不过心动
- 2021-01-17 14:30
建议你去一些电视发烧友论坛看一下 百度知道里基本没有高手都是不知道从哪复制的乱七八糟的东西
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯