按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
序移动鼠标,看看lCount 会不会重设为0 。
我如何改写Hello 呢?下面是几个步骤:
1。 在CMyWinApp 中增加OnIdle 函数的声明:
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance(); // 每一个应用程序都应该改写此函数
virtual BOOL OnIdle(LONG lCount); // OnIdle 用来处理空闲时间(idle time)
};
2。 在CMyFrameWnd 中增加一个IdleTimeHandler 函数声明。这么做是因为我希
望在窗口中显示lCount 值, 所以最好的作法就是在OnIdle 中调用
CMyFrameWnd 成员函数,这样才容易获得绘图所需的DC 。
class CMyFrameWnd : public CFrameWnd
{
public:
CMyFrameWnd(); // constructor
afx_msg void OnPaint(); // for WM_PAINT
afx_msg void OnAbout(); // for WM_MAND (IDM_ABOUT)
void IdleTimeHandler(LONG lCount); // we want it call by CMyWinApp::OnIdle
。。。
};
3。 在HELLO。CPP 中定义CMyWinApp::OnIdle 函数如下:
404
…………………………………………………………Page 467……………………………………………………………
第6章 MFC 程式的生死因果
BOOL CMyWinApp::OnIdle(LONG lCount)
{
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;
pWnd…》IdleTimeHandler(lCount);
return TRUE;
}
4。 在HELLO。CPP 中定义CMyFrameWnd::IdleTimeHandler 函数如下:
void CMyFrameWnd::IdleTimeHandler(LONG lCount)
{
CString str;
CRect rect(10;10;200;30);
CDC* pDC = new CClientDC(this);
str。Format(〃%010d〃; lCount);
pDC…》DrawText(str; ▭ DT_LEFT | DT_TOP);
}
为了输出lCount,我又动用了三个MFC 类别:CString、CRect 和CDC。前两者非常
简单,只是字符串与四方形结构的一层C++ 包装而且,后者是在Windows 系统中绘图所
必须的DC (Device Context )的一个包装。
新版Hello 执行结果如下。左上角的lCount 以飞快的速度更迭。移动鼠标看看,看
lCount 会不会重置为0 。
405
…………………………………………………………Page 468……………………………………………………………
第篇 湷觥 FC 程式設計
Dialog 与 Control
回忆SDK 程序中的对话框作法:RC 文件中要准备一个对话框的Template,C 程序中要
设计一个对话框函数。MFC 提供的CDialog 已经把对话框的窗口函数设计好了,因此
在MFC 程序中使用对话框非常地简单:
WM_MAND
(IDM_ABOUT)
HELLO。CPP
void CMyFrameWnd::OnAbout()
{
CDialog about(〃AboutBox〃; this);
about。DoModal();
}
HELLO。RC
AboutBox DIALOG DISCARDABLE 34; 22; 147; 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION 〃About Hello〃
{
ICON 〃JJHouRIcon〃;IDC_STATIC;11;17;18;20
LTEXT 〃Hello MFC 4。0〃;IDC_STATIC;40;10;52;8
LTEXT 〃Copyright 1996 Top Studio〃;IDC_STATIC;40;25;100;8
LTEXT 〃J。J。Hou〃;IDC_STATIC;40;40;100;8
DEFPUSHBUTTON 〃OK〃;IDOK;105;7;32;14;WS_GROUP
}
当使用者按下【File/About 】菜单, 根据Message Map 的设定,WM_MAND
(IDM_ABOUT )被送到OnAbout 函数去。我们首先在OnAbout 中产生一个CDialog 物
件,名为about 。CDialog 构造式容许两个参数,第一个参数是对话框的模板资源,第二
个参数是about 对象的主人。由于我们的〃About〃 对话框是如此地简单,不需要改写
CDialog 中的对话框函数,所以接下来直接调用CDialog::DoModal ,对话框就开始运作
了。
406
…………………………………………………………Page 469……………………………………………………………
第6章 MFC 程式的生死因果
通用对话框(mon Dialogs)
有些对话框,例如【File Open 】或【Save As】对话框,出现在每一个程序中的频率是如
此之高,使微软公司不得不面对此一事实。于是,自从Windows 3。1 之后,Windows API
多了一组通用对话框( mon Dialogs ) API 函数, 系统也多了一个对应的
MDLG。DLL (32 位版则为DLG32。DLL )。
MFC 也支持通用对话框,下面是其类别与其类型:
类别 类型
CmonDialog 以下各类别的父类别
CFileDialog File 对话框(Open 或Save As )
CPrintDialog Print 对话框
CFindReplaceDialog Find and Replace 对话框
CColorDialog Color 对话框
CFontDialog Font 对话框
CPageSetupDialog Page Setup 对话框(MFC 4。0 新增)
COleDialog Ole 相关对话框
CObject
CObject
CCmdTarget
CCmdTarget
CWnd
CWnd
CDialog
CDialog
CmonDialog
CmonDialog
CColorDialog
CColorDialog
CFileDialog
CFindReplaceDialog
CFindReplaceDialog
CFontDialog
CFontDialog
COleDialog
COleDialog
CPageSetupDialog
CPageSetupDialog
CPrintDialog
CPrintDialog
407
…………………………………………………………Page 470……………………………………………………………
第篇 湷觥 FC 程式設計
在C/SDK 程序中, 使用通用对话框的方式是, 首先填充一块特定的结构如
OPENFILENAME,然后调用API 函数如GetOpenFileName。当函数回返,结构中的某
些字段便持有了使用者输入的值。
MFC 通用对话框类别,使用之简易性亦不输Windows API 。下面这段码可以激活【Open 】