按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
//{{AFX_MSG_MAP(CScribbleDoc)
ON_MAND(ID_EDIT_CLEAR_ALL; OnEditClearAll)
ON_MAND(ID_PEN_THICK_OR_THIN; OnPenThickOrThin)
ON_UPDATE_MAND_UI(ID_EDIT_CLEAR_ALL; OnUpdateEditClearAll)
ON_UPDATE_MAND_UI(ID_PEN_THICK_OR_THIN; OnUpdatePenThickOrThin)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
不要去掉//{{ 和//}},否则下次ClassWizard 或WizardBar 不能正常工作。
2。 CSRIBBLEDOC。H
class CScribbleDoc : public CDocument
{
。。。
// Generated message map functions
protected:
//{{AFX_MSG(CScribbleDoc)
afx_msg void OnEditClearAll();
afx_msg void OnPenThickOrThin();
afx_msg void OnUpdateEditClearAll(CCmdUI* pCmdUI);
afx_msg void OnUpdatePenThickOrThin(CCmdUI* pCmdUI);
//}}AFX_MSG
。。。
};
3。 RESOURCE。H
#define ID_PEN_THICK_OR_THIN 32772
#define ID_PEN_WIDTHS 32773
(另一个项目ID_EDIT_CLEAR_ALL 已经在AFXRES。H 中定义了)
597
…………………………………………………………Page 660……………………………………………………………
第篇 深入 MFC 程式設計
4。 SCRIBBLEDOC。CPP
void CScribbleDoc::OnEditClearAll()
{
DeleteContents();
SetModifiedFlag(); // Mark the document as having been modified; for
// purposes of confirming File Close。
UpdateAllViews(NULL);
}
void CScribbleDoc::OnPenThickOrThin()
{
// Toggle the state of the pen between thin or thick。
m_bThickPen = !m_bThickPen;
// Change the current pen to reflect the new user…specified width。
ReplacePen();
}
void CScribbleDoc::ReplacePen()
{
m_nPenWidth = m_bThickPen? m_nThickWidth : m_nThinWidth;
// Change the current pen to reflect the new user…specified width。
m_penCur。DeleteObject();
m_penCur。CreatePen(PS_SOLID; m_nPenWidth; RGB(0;0;0)); // solid black
}
void CScribbleDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI)
{
// Enable the mand user interface object (menu item or tool bar
// button) if the document is non…empty; i。e。; has at least one stroke。
pCmdUI…》Enable(!m_strokeList。IsEmpty());
}
void CScribbleDoc::OnUpdatePenThickOrThin(CCmdUI* pCmdUI)
{
// Add check mark to Draw Thick Line menu item; if the current
// pen width is 〃thick〃。
pCmdUI…》SetCheck(m_bThickPen);
}
598
…………………………………………………………Page 661……………………………………………………………
第9章 訊息映射與命令繞行
本章回顾
这一章主要为Scribble Step2 增加新的菜单命令项。在这个过程中我们使用了工具栏编
辑器和ClassWizard (或Wizardbar )等工具。工具的使用很简单,但是把消息的处理常
式加在什么地方却是关键。因此本章一开始先带你深入探索MFC 源代码,了解消息的
递送以及所谓Message Map 背后的意义,并且也解释了命令消息(WM_MAND) 特
异的绕行路线及其原因。
我在本章中挖出了许多MFC 源代码,希望藉由源代码的自我说明能力,加深你对消息
映射与消息绕行路径的了解。这是对MFC 「知其所以然」的重要关键。这个知识基础不
会因为MFC 的源代码更动而更动,我要强调的,是其原理。
599
…………………………………………………………Page 662……………………………………………………………
第篇 深入 MFC 程式設計
600
…………………………………………………………Page 663……………………………………………………………
10 MFC
第 章 與對話盒
10
第 章
MFC 与对话框
上一章我们为Scribble 新增了一个【Pen 】菜单,其中第二个命令项【Pen Width。。。 】准
备用来提供一个对话框,让使用者设定笔的宽度。每一线条都可以拥有自己的笔宽。原
预设粗笔是5个图素宽,细笔是2个图素宽。
为了这样的目的,在对话框中放个Spin 控制组件是极佳的选择。Spin 就是那种有着上下
小三角形箭头、可搭配一个文字显示器的控制组件,有点像转轮,用来选择数字最合适:
601
…………………………………………………………Page 664……………………………………………………………
第篇 深入 MFC 程式設計
但是,Scribble Step3 只是想示范如何在MFC 程序中经由菜单命令项唤起一个对话框,
并示范所谓的资料交换与资料检验(DDX/DDV)。所以,笔宽对话框中只选用两个小小
的Edit 控制组件而已。
本章还可以学习到如何利用对话框编辑器设计对话框的模板,并利用ClassWizard 制作
一个对话框类别,定义消息处理函数,把它们与对话框「绑」在一块儿。
图10…1 【Pen Widths】对话框
对话框编辑器
把对话框函数在一旁,把所有程序烦恼在一旁,我们先享受一下Visual C++ 整合环
境中的对话框编辑器带来的对话框模板(Dialog Template)设计快感。
设计对话框模板,有两个重要的步骤,第一是从工具箱中选择控制组件(control,功能
各异的小小零组件)加到对话框中,第二是填写此一控制组件的标题、ID 、以及其它性
质。
以下就是利用对话框编辑器设计【Pen Widths 】对话框的过程。
在Visual C++ 整合环境中选按【Insert/Resource 】命令项,并在随后而来的【Insert
Resource 】对话框中,选择【resource types 】为Dialog。
或是直接在Visual C++ 整合环境中按下工具栏的【New Dialog】按钮。
602
…………………………………………………………Page 665……………………………………………………………
10 MFC
第 章 與對話盒
Scribble。rc 文件会被打开,对话框编辑器出现,自动给我们一个空白对话框,内
含两个按钮,分别是【OK 】和【Cancel】。控制组件工具箱出现在画面右侧,
内含许多控制组件。
为了设定控制组件的属性,必须用到【Dialog Properties 】对话框。如果它最初
没有出现,只要以右键选按对话框的任何地方,就会跑出一份菜单,再选择其
中的! § Properties! ¨,即会出现此对话框。按下对话框左上方的push…pin 钮(大
头针) 可以常保它浮现为最上层窗口。现在把对话框ID 改为
IDD_PEN_WIDTHS ,把标题改为〃Pen Widths〃。
603
…………………………………………………………Page 666……………………………………………………………
第篇 深入 MFC 程式設計
为对话框加入两个Edit 控制组件,两个Static 控制组件,以及一个按钮。
右键选按新增的按钮,在Property page 中把其标题改为〃Default〃,并把ID
改为IDC_DEFAULT_PEN_ WIDTHS。
右键选按第一个Edit 控制组件, 在Property page 中把ID 改为
IDC_THIN_PEN_ WIDTH。以同样的方式把第二个Edit 控制组件的ID 改为
IDC THICK PEN WIDTH 。
_ _ _
604
…………………………………………………………Page 667…………………………