永发信息网

优先选项。

答案:5  悬赏:10  手机版
解决时间 2021-01-18 00:11
优先选项。
最佳答案
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();

}
全部回答
B
你有什么问题啊?
出这么高的分,问题怎么这么简单明了呀
建议你去一些电视发烧友论坛看一下 百度知道里基本没有高手都是不知道从哪复制的乱七八糟的东西
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
爸爸吃饭少了什么原因 m.120.net爸爸每天吃两
阿Q桶饭怎么去啊,有知道地址的么
贵州省贞丰县有哪些特产和名胜古迹
请说出下面选段出自哪部名著。(1)每当有重
锐龙1700x3.8hz够用吗
谜面:一时吃饱总不饥,二人相思我便知,听尽
每瓶矿泉水2元。买24瓶矿泉水多少钱?
我打算全款20万买个车,要7座的
我国乡镇门面前多少米可以吏用
求美国电影《我偏不》的英文名字?谢谢
耳机延长线是干嘛用的?
一个三角形的面积是十五分之三十四平方分米它
ugg牛皮混纺和羊毛一体哪种舒服,有什么区别
锰钢轧花网与锰钢筛网一样吗
提问:根据21+21=22,22+22=23……计算1+2+22
推荐资讯
西经123度北纬49度是什么地方?
心如玄铁,涅槃重生 这句话什么意思
想进墨大预科trinity college
新员工,猜三个数字
YY纵横豆包年度工会拉票放的背景音乐布卡布卡
为什么办居住证要6个月才能办下来
一五阳能当船员吗
中国象棋除了当头炮还有哪些比较好的开头
鹤壁包括哪几个乡镇?请写出淇滨区,山城区,
求个懂这个的大神帮打一下
王云帆这个名字怎么样
最好拔牙后多久去洗牙
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?