友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
深入浅出MFC第2版(PDF格式)-第113部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
#0001 // PenDlg。h : header file
#0002 //
#0003
#0004 /////////////////////////////////////////////////////////////////
#0005 // CPenWidthsDlg dialog
#0006
#0007 class CPenWidthsDlg : public CDialog
#0008 {
#0009 // Construction
#0010 public:
#0011 CPenWidthsDlg(CWnd* pParent = NULL); // standard constructor
#0012
#0013 // Dialog Data
#0014 //{{AFX_DATA(CPenWidthsDlg)
#0015 enum { IDD = IDD_PEN_WIDTHS };
#0016 // NOTE: the ClassWizard will add data members here
#0017 //}}AFX_DATA
#0018
#0019
#0020 // Overrides
#0021 // ClassWizard generated virtual function overrides
#0022 //{{AFX_VIRTUAL(CPenWidthsDlg)
#0023 protected:
#0024 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV suppo
#0025 //}}AFX_VIRTUAL
#0026
#0027 // Implementation
#0028 protected:
#0029
#0030 // Generated message map functions
#0031 //{{AFX_MSG(CPenWidthsDlg)
#0032 afx_msg void OnDefaultPenWidths();
#0033 //}}AFX_MSG
#0034 DECLARE_MESSAGE_MAP()
#0035 };
PENDLG。CPP
#0001 // PenDlg。cpp : implementation file
#0002 //
#0003
#0004 #include 〃stdafx。h〃
#0005 #include 〃Scribble。h〃
610
…………………………………………………………Page 673……………………………………………………………
10 MFC
第 章 與對話盒
#0006 #include 〃PenDlg。h〃
#0007
#0008 #ifdef _DEBUG
#0009 #define new DEBUG_NEW
#0010 #undef THIS_FILE
#0011 static char THIS_FILE'' = __FILE__;
#0012 #endif
#0013
#0014 /////////////////////////////////////////////////////////////
#0015 // CPenWidthsDlg dialog
#0016
#0017
#0018 CPenWidthsDlg::CPenWidthsDlg(CWnd* pParent /*=NULL*/)
#0019 : CDialog(CPenWidthsDlg::IDD; pParent)
#0020 {
#0021 //{{AFX_DATA_INIT(CPenWidthsDlg)
#0022 // NOTE: the ClassWizard will add member initialization here
#0023 //}}AFX_DATA_INIT
#0024 }
#0025
#0026
#0027 void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX)
#0028 {
#0029 CDialog::DoDataExchange(pDX);
#0030 //{{AFX_DATA_MAP(CPenWidthsDlg)
#0031 // NOTE: the ClassWizard will add DDX and DDV calls here
#0032 //}}AFX_DATA_MAP
#0033 }
#0034
#0035
#0036 BEGIN_MESSAGE_MAP(CPenWidthsDlg; CDialog)
#0037 //{{AFX_MSG_MAP(CPenWidthsDlg)
#0038 ON_BN_CLICKED(IDC_DEFAULT_PEN_WIDTHS; OnDefaultPenWidths)
#0039 //}}AFX_MSG_MAP
#0040 END_MESSAGE_MAP()
#0041
#0042 ///////////////////////////////////////////////////////////////
#0043 // CPenWidthsDlg message handlers
#0044
#0045 void CPenWidthsDlg::OnDefaultPenWidths()
#0046 {
#0047 // TODO: Add your control notification handler code here
#0048
#0049 }
611
…………………………………………………………Page 674……………………………………………………………
第篇 深入 MFC 程式設計
稍早我曾提过,ClassWizard 会为我们做出一个Data Map 。此一Data Map 将放在
DoDataExchange 函数中。目前Data Map 还没有什么内容,CPenWidthsDlg 的Message
Map 也是空的,因为我们还未透过ClassWizard 加料呢。
请注意,CPenWidthsDlg 构造式会先引发基础类别CDialog 的构造式,后者会产生一
个modal 对话框。CDialog 构造式的两个参数分别是对话框ID 以及父窗口指针:
#0018 CPenWidthsDlg::CPenWidthsDlg(CWnd* pParent /*=NULL*/)
#0019 : CDialog(CPenWidthsDlg::IDD; pParent)
#0020 {
#0021 //{{AFX_DATA_INIT(CPenWidthsDlg)
#0022 // NOTE: the ClassWizard will add member initialization here
#0023 //}}AFX_DATA_INIT
#0024 }
ClassWizard 帮我们把CPenWidthsDlg::IDD 塞给第一个参数, 这个值定义于
PENDLG。H 的AFX_DATA 区中,其值为IDD_PEN_ WIDTHS:
#0013 // Dialog Data
#0014 //{{AFX_DATA(CPenWidthsDlg)
#0015 enum { IDD = IDD_PEN_WIDTHS };
#0016 // NOTE: the ClassWizard will add data members here
#0017 //}}AFX_DATA
也就是【Pen Widths 】对话框资源的ID :
// in SCRIBBLE。RC
IDD_PEN_WIDTHS DIALOG DISCARDABLE 0; 0; 203; 65
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION 〃Pen Widths〃
FONT 8; 〃MS Sans Serif〃
BEGIN
DEFPUSHBUTTON 〃OK〃;IDOK;148;7;50;14
PUSHBUTTON 〃Cancel〃;IDCANCEL;148;24;50;14
PUSHBUTTON 〃Default〃;IDC_DEFAULT_PEN_WIDTHS;148;41;50;14
LTEXT 〃Thin Pen Width:〃;IDC_STATIC;10;12;70;10
LTEXT 〃Thick Pen Width:〃;IDC_STATIC;10;33;70;10
EDITTEXT IDC_THIN_PEN_WIDTH;86;12;40;13;ES_AUTOHSCROLL
EDITTEXT IDC_THICK_PEN_WIDTH;86;33;40;13;ES_AUTOHSCROLL
END
对话框类别CPenWidthsDlg 因此才有办法取得「RC 文件中的对话框资源」。
612
…………………………………………………………Page 675……………………………………………………………
10 MFC
第 章 與對話盒
对话框的消息处理函数
CDialog 本就定义有两个按钮【OK 】和【Cancel】,【Pen Widths 】对话框又新增一个
【Default 】钮,当使用者按下此钮时,粗笔与细笔都必须回复为预设宽度(分别是5个
图素和2个图素)。那么,我们显然有两件工作要完成:
1。 在CPenWidthsDlg 中增加两个变量,分别代表粗笔与细笔的宽度。
2。 在CPenWidthsDlg 中增加一个函数,负责【Default 】钮被按下后的动作。
以下是ClassWizard 的操作步骤(增加一个函数):
■进入ClassWizard,选择【Message Maps】附页,再选择【Class name 】清单中
的CPenWidthsDlg 。
■左侧的【Object IDs 】清单列出对话框中各个控制组件的ID 。请选择其中的
ID C_DEFAULT_PEN_ WIDTHS (代表【Default 】钮)。
■在右侧的【Messages 】中选择BN_CLICKED 。这和我们在前两章的经验不同,
如今我们处理的是控制组件,它所产生的消息是特别的一类,称为Notification
消息,这种消息是控制组件用来通知其父窗口(通常是个对话框)某些状况发
生了,例如BN_CLICKED 表示按钮被按下。至于不同的Notification 所代表的
意义,画面最下方的〃Description〃 会显示出来。
■按下【Add Function 】钮,接受预设的OnDefaultPenWidths 函数(也可以改名):
■现在,【Member Functions 】清单中出现了新函数,以及它所对映之控制组件
与Notification 消息。
613
…………………………………………………………Page 676……………………………………………………………
第篇 深入 MFC 程式設計
按下【Edit Code 】钮,光标落在OnDefaultPenWidths 函数身上,我们看到以
下内容:
614
…………………………………………………………Page 677……………………………………………………………
10 MFC
第 章 與對話盒
上述动作对源代码造成的影响是:
// in PENDLG。H
class CPenWidthsDlg : public CDialog
{
protected:
afx_msg void OnDefaultPenWidths();
。。。
};
// in PENDLG。CPP
BEGIN_MESSAGE_MAP(CPenWidthsDlg; CDialog)
ON_BN_CLICKED(IDC_DEFAULT_PEN_WIDTHS; OnDefaultPenWidths)
END_MESSAGE_MAP()
void CPenWidthsDlg::OnDefaultPenWidths()
{
// TODO : Add your control notification handler here
}
MFC 中各式各样的MAP
如果你以为MFC 中只有Message Map 和Data Map ,那你就错了。另外还有一个
Dispatch Map ,使用于OLE Automation,下面是其形式:
DECLARE_DISPATCH_MAP() // 。H文件中的宏,声明 Dispatch Map 。
BEGIN_DISPATCH_MAP(CClikDoc; CDocument) // 。CPP 档中的 Dispatch Map
//{{AFX_DISPATCH_MAP(CClikDoc)
DISP_PROPERTY(CClikDoc; 〃text〃; m_str; VT_BSTR)
DISP_PROPERTY_EX(CClikDoc; 〃x〃; GetX; SetX; VT_I2)
DISP_PROPERTY_EX(CClikDoc; 〃y〃; GetY; SetY; VT_I2)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
此外还有Event Map ,使用于OLE Custom Control (也就是OCX ),下面是其形式:
615
…………………………………………………………Page 678……………………………………………………………
第篇 深入 MFC 程式設計
档中的宏,声明 Event Map。
DECLARE_EVENT_MAP() // 。H
BEGIN_EVENT_MAP(CSmileCtrl; COleControl) // 。CPP 档中的 Event Map
//{{AFX_EVENT_MAP(CSmileCtrl)
EVENT_CUSTOM(〃Inside〃; FireInside; VTS_I2 VTS_I2)
EVENT_STOCK_CLICK()
//}}AFX_EVENT_MAP
END_EVENT_MAP()
至于Message Map ,我想你一定已经很熟悉了:
DECLARE_MESSAGE_MAP()// 。H文件中的宏,声明 Message Map
BEGIN_MESSAGE_MAP(CScribDoc; CDocument) // 。CPP 档中的Message Map
//{{AFX_MSG_MAP(CScribDoc)
ON_MAND(ID_EDIT_CLEAR_ALL; OnEditClearAll)
ON_MAND(ID_PEN_THICK_OR_THIN; OnPenThickOrThin)
ON_MAND(ID_PEN_WIDTHS; OnPenWidths)
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!