CWinApp

CWinApp 应用程序类共63个成员

(由Cobject-CCmdTarget-CWinThread派生)

#include <afxwin.h>

CWinApp类是你派生Windows应用程序对象的基类。应用程序对象提供初始化你的应用程序
(及其每个实例)的成员函数,并运行该应用程序。

每个使用MFC类的应用程序只能包含一个CWinApp派生类对象。当Windows调用由MFC库提供
的WinMain函数时,其它C++全局对象被创建并生效,该对象(CWinApp派生类)被创建。你应
该在全局级声明它。

当你从CWinApp 派生一个应用程序类时,重载InitInstance成员函数来创建应用程序的主
窗口对象。在添加CWinApp成员函数时,MFC库提供下列全局函数来访问你的CWinApp对象和
其它全局信息:

AfxGetApp 获得CWinApp对象指针。

AfxGetInstanceHandle 获得当前应用程序实例的句柄。

AfxGetResourceHandle 获得应用程序资源句柄。

AfxGetAppName 获得一个字符串指针,该字符串包含应用程序名称。换个方式,如果你有
一个CWinApp对象指针,可用m_pszExeName来得到应用程序名称。

See CWinApp: The Application Class in Visual C++ Programmer's Guide for more o
n the CWinApp class, including an overview of the following:

CWinApp-derived code written by AppWizard.

CWinApp's role in the execution sequence of your application.

CWinApp's default member function implementations.

CWinApp's key overridables.

◆数据成员

1、m_pszAppName

指定程序名称。

程序名称可来自传送给CWinApp构造函数的参数,如果没有指定,就利用ID号为AFX_IDS_A
PP_TITLE的资源字符串,再没有的话就使用程序的EXE文件名称。

该数据成员是全局函数AfxGetAppName的返回值,它是const char*型的公共变量。

注意: 如果你要给m_pszAppName赋值,必须动态分配堆栈。CWinApp的析构函数以该指针
调用free( )。你可能想用_tcsdup( )运行时库函数来做内存分配,也要用还未赋新值的当
前指针释放内存。举例如下:

//在CWinApp启动时首先释放由MFC分配的字符串。

//该字符串在InitInstance被调用前被分配。

free((void*)m_pszAppName);

//改变程序文件名称。

//CWinApp的析构函数将释放内存。

m_pszAppName=_tcsdup(_T("d://somedir//myapp.exe"));

 

例子:

CWnd* pWnd;

// 设置pWnd到某些窗口已创建的CWnd对象。

// 下面调用CWnd::MessageBox使用了应用程序标题作为消息窗口名称。

pWnd->MessageBox("Some message", AfxGetApp()->m_pszAppName);

// 获得程序标题更直接的途径是调用AfxGetAppName:

pWnd->MessageBox("Some message", AfxGetAppName());

// 以应用程序标题作为消息框名称来显示消息框的更容易的方法

//是调用AfxMessageBox:

AfxMessageBox("Some message");

2、m_hInstance

识别当前应用程序实例。

与Windows传送给WinMain的参数hInstance一致。m_hInstance数据成员是Windows应用程序
当前实例的句柄,它是全局函数AfxGetInstanceHandle的返回值,是一个HINSTANCE型的公
共变量。

例子:

//通常你不必直接传送程序的hInstance给Windows APIs,因为这与MFC

//成员函数的作用等同等同,下面的例子不是通常作法:

HCURSOR hCursor;

hCursor = ::LoadCursor(AfxGetApp()->m_hInstance,

MAKEINTRESOURCE(IDC_MYCURSOR));

// 获得程序hInstance更直接的途径是调用AfxGetInstanceHandle:

hCursor = ::LoadCursor(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDC_MYCURSOR));

// 如果你需要用hInstance来加载一个资源,最好调用AfxGetResourceHandle

//而不是AfxGetInstanceHandle:

hCursor = ::LoadCursor(AfxGetResourceHandle(),

MAKEINTRESOURCE(IDC_MYCURSOR));

//加载光标资源的更好途径是调用CWinApp::LoadCursor

hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);

3、m_hPrevInstance

在32位程序中被设为NULL。

与Windows传送给WinMain的参数hPrevInstance一致。在32位程序中该数据成员总是NULL。
要查找应用程序前一个实例,可用CWnd::FindWindow。

4、m_lpCmdLine

指向以null结尾的字符串,该字符串指定应用程序的命令行。

与Windows传送给WinMain的参数lpCmdLine一致。用m_lpCmdLine来访问当应用程序开始时
用户输入的任何命令行参数。m_lpCmdLine是LPSTR型的公共变量。

例子:

BOOL CMyApp::InitInstance()

{

// ...

if (m_lpCmdLine[0] == '/0')

{

// Create a new (empty) document.

OnFileNew();

}

else

{

// Open a file passed as the first command line parameter.

OpenDocumentFile(m_lpCmdLine);

}

// ...

}

5、m_nCmdShow

指定窗口最初如何显示。

与Windows传送给WinMain的参数nCmdShow一致。当你为程序主窗口调用CWnd::ShowWindow
时应该将m_nCmdShow作为一个参数传送。m_nCmdShow 是整型公共变量。

例子:

BOOL CMyApp::InitInstance()

{

// ...

// Create main MDI Frame window.

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

// Save the pointer to the main frame window. This is the

// only way the framework will have knowledge of what the

// main frame window is.

m_pMainWnd = pMainFrame;

// Show the main window using the nCmdShow parameter

// passed to the application when it was first launched.

pMainFrame->ShowWindow(m_nCmdShow);

pMainFrame->UpdateWindow();

// ...

}

6、m_bHelpMode

指示用户是否在Help上下文模式 (典型地按SHIFT+F1呼唤)。

TRUE表明程序处于Help上下文模式;否则为FALSE。在Help上下文模式,光标变成问号并且
用户能在屏幕中移动它。如果你想在帮助模式实现指定操作,就检查该标志。m_bHelpMod
e是BOOL型公共变量。

7、m_pActiveWnd

这是一个当OLE服务器在位激活时指向容器程序的主窗口的指针。

如果该数据成员为NULL,则应用程序没有在位激活。

当框架窗口被OLE容器程序在位激活时,工作框架设置该成员变量。

8、m_pszExeName

应用程序的模块名称。

包含应用程序的不带扩展名的可执行文件名。不象m_pszAppName,该名称不能包含空格。
m_pszExeName是const char*型的公共变量。

注意:如果你要给m_pszExeName赋值,必须动态分配堆栈。CWinApp的析构函数以该指针调
用free( )。你可能想用_tcsdup( )运行时库函数来做内存分配,也要用还未赋新值的当前
指针释放内存。举例如下:

//在CWinApp启动时首先释放由MFC分配的字符串。

//该字符串在InitInstance被调用前被分配。

free((void*)m_pszExeName);

//改变.EXE文件名称。

//CWinApp的析构函数将释放内存。

m_pszExeName=_tcsdup(_T("d://somedir//myapp"));

9、m_pszHelpFilePath

指针,指向包含应用程序的帮助文件的路径的字符串。

缺省方式下,工作框架初始化m_pszHelpFilePath为附带".HLP"文件的应用程序名称。要改
变帮助文件的名称,将m_pszHelpFilePath指向包含帮助文件完整名称的字符串。这个步骤
适宜放在应用程序的初始化函数InitInstance中。m_pszHelpFilePath是const char*型的
公共变量。

注意:如果你要给m_pszHelpFilePath赋值,必须动态分配堆栈。CWinApp的析构函数以该
指针调用free( )。你可能想用_tcsdup( )运行时库函数来做内存分配,也要用还未赋新值
的当前指针释放内存。举例如下:

//在CWinApp启动时首先释放由MFC分配的字符串。

//该字符串在InitInstance被调用前被分配。

free((void*)m_pszHelpFilePath);

//改变.HLP文件名称。

//CWinApp的析构函数将释放内存。

m_pszHelpFilePath=_tcsdup(_T("d://somedir//myhelp.hlp"));

10、m_pszProfileName

const char*型的公共变量,应用程序的.INI文件名。

注意:如果你要给m_pszProfileName赋值,必须动态分配堆栈。CWinApp的析构函数以该指
针调用free( )。你可能想用_tcsdup( )运行时库函数来做内存分配,也要用还未赋新值的
当前指针释放内存。举例如下:

//在CWinApp启动时首先释放由MFC分配的字符串。

//该字符串在InitInstance被调用前被分配。

free((void*)m_pszProfileName);

//改变.INI文件名称。

//CWinApp的析构函数将释放内存。

m_pszProfileName=_tcsdup(_T("d://somedir//myini.ini"));

11、m_pszRegistryKey

用来检测储存应用程序描述设置的全部注册键。通常它是只读态的。

LPCTSTR m_pszRegistryKey;

注意:如果你要给m_pszRegistryKey赋值,必须动态分配堆栈。CWinApp的析构函数以该指
针调用free( )。你可能想用_tcsdup( )运行时库函数来做内存分配,也要用还未赋新值的
当前指针释放内存。举例如下:

//在CWinApp启动时首先释放由MFC分配的字符串。

//该字符串在InitInstance被调用前被分配。

free((void*)m_pszRegistryKey);

//改变registry键名称。

//CWinApp的析构函数将释放内存。

m_pszRegistryKey=_tcsdup(_T("HKEY_CURRENT_USER//Software//mycompany//myapp//th
issection//thisvalue"));

◆构造

12、CWinApp

创建一个CWinApp对象。

CWinApp( LPCTSTR lpszAppName = NULL );

参数:

lpszAppName 是一个null结尾的字符串,它包含供Windows使用的应用程序名称。如果该参
数未被提供或为NULL,CWinApp使用资源字符串AFX_IDS_APP_TITLE或可执行文件名。

备注:

创建一个CWinApp对象并传送lpszAppName以应用程序名称保存。你可以创建一个由CWinAp
p派生的全局对象。你只能有一个CWinApp对象在应用程序中。构造函数保存指向该CWinAp
p对象的指针,这样WinMain就能调用该对象的成员函数来做初始化并运行该应用程序。


◆操作

13、LoadCursor

加载光标资源。

HCURSOR LoadCursor( LPCTSTR lpszResourceName ) const;

HCURSOR LoadCursor( UINT nIDResource ) const;

返回值: 如果成功,为一个光标句柄;否则为NULL。

参数:

lpszResourceName 指向包含光标资源名称的以null结尾的字符串指针。你可以 为该参数
使用CString对象。

nIDResource 光标资源的ID号码。

备注:

加载以lpszResourceName为名或在当前可执行文件中指定的nIDResource光标资源。LoadC
ursor仅在该光标先前没有被加载过时才可将它调入内存;否则,它取得已存在(内存中)的
资源句柄。

LoadStandardCursor或LoadOEMCursor成员函数被用来访问预定义的Windows光标。

例子:

HCURSOR hCursor;

//加载一个光标资源,它最初由图形编辑器创建并分配了ID号IDC_MYCURSOR。

hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);

14、LoadStandardCursor

加载Windows预定义的光标,其IDC_常量在WINDOWS.H中指定。

HCURSOR LoadStandardCursor( LPCTSTR lpszCursorName ) const;

返回值: 如果成功,为一个光标句柄;否则为NULL。

参数:

lpszCursorName 一个IDC_列表单,它包含指定的Windows预定义光标标识符。这些标识符
定义在WINDOWS.H中。下面列出这些标识符及其含义:

IDC_ARROW 标准的箭头光标

IDC_IBEAM 标准的文本插入光标

IDC_WAIT 沙漏光标

IDC_CROSS 用于精度选择的十字光标

IDC_UPARROW 向上指的箭头

IDC_SIZE 废弃的;使用IDC_SIZEALL

IDC_SIZEALL 四向箭头。用来重设窗口大小。

IDC_ICON 废弃的;使用IDC_ARROW.

IDC_SIZENWSE 左上右下双向箭头

IDC_SIZENESW 右上左下双向箭头

IDC_SIZEWE 水平双向箭头

IDC_SIZENS 垂直双向箭头

备注:

LoadStandardCursor或LoadOEMCursor成员函数被用来访问预定义的Windows光标。

例子:

HCURSOR hCursor;

//加载Windows预定义的"上指"光标

hCursor = AfxGetApp()->LoadStandardCursor(IDC_UPARROW);

15、LoadOEMCursor

加载Windows OEM预定义光标,其OCR_常量在WINDOWS.H中指定。

HCURSOR LoadOEMCursor( UINT nIDCursor ) const;

返回值: 如果成功,为一个光标句柄;否则为NULL。

参数:

nIDCursor 一个OCR_列表单,它包含指定的Windows预定义光标标识符。你必须在“#incl
ude <afxwin.h>”之前放置“#define OEMRESOURCE”来获得在WINDOWS.H中的OCR_常量的
访问权。

备注:

加载由nIDCursor指定的Windows预定义光标资源。LoadStandardCursor或LoadOEMCursor成
员函数被用来访问预定义的Windows光标。

例子:

//在stdafx.h文件中添加#define OEMRESOURCE来包含

//在windows.h中定义的OCR_值。

#define OEMRESOURCE

#include <afxwin.h> // MFC核心及标准元件

#include <afxext.h> // MFC扩展(包括VB)

HCURSOR hCursor;

// Load the predefined WIndows "size all" cursor.

hCursor = AfxGetApp()->LoadOEMCursor(OCR_SIZEALL);

16、LoadIcon

加载图标资源。

HICON LoadIcon( LPCTSTR lpszResourceName ) const;

HICON LoadIcon( UINT nIDResource ) const;

返回值: 如果成功,为一个图标句柄;否则为NULL。

参数:

lpszResourceName 指向包含图标资源名称的以null结尾的字符串指针。你可以 为该参数
使用CString对象。

nIDResource 图标资源的ID号码。

备注:

加载以lpszResourceName为名或在当前可执行文件中指定的nIDResource图标资源。LoadI
con仅在该图标先前没有被加载过时才可将它调入内存;否则,它取得已存在(内存中)的资
源句柄。

LoadStandardIcon或LoadOEMIcon成员函数被用来访问预定义的Windows图标。

注意:该成员函数调用Win32 API函数LoadIcon,而LoadIcon仅加载大小符合系统计量值S
M_CXICON和SM_CYICON的图标。

17、LoadStandardIcon

加载由WINDOWS.H中IDI_常量指定的Windows预定义图标。

HICON LoadStandardIcon( LPCTSTR lpszIconName ) const;

返回值: 如果成功,为一个图标句柄;否则为NULL。

参数:

lpszIconName 一个列表单,它包含指定的Windows预定义图标标识符。这些标识符定义在
WINDOWS.H中。下面列出这些标识符及其含义:

IDI_APPLICATION 缺省的应用程序图标

IDI_HAND 手状图标,用于严重警告消息

IDI_QUESTION 问号图标,用于提示消息

IDI_EXCLAMATION 惊叹号图标,用于警告消息

IDI_ASTERISK 星号状图标,用于通报消息

备注:

用LoadStandardIcon或LoadOEMIcon成员函数来访问预定义的Windows图标。

18、LoadOEMIcon

加载由WINDOWS.H中OIC_常量指定的WindowsOEM预定义图标。

HICON LoadOEMIcon( UINT nIDIcon ) const;

返回值: 如果成功,为一个图标句柄;否则为NULL。

参数:

nIDIcon 一个OIC_列表单,它包含指定的Windows预定义图标标识符。你必须在“#includ
e <afxwin.h>”之前放置“#define OEMRESOURCE”来获得在WINDOWS.H中的OIC_常量的访
问权。

备注:

用LoadStandardIcon或LoadOEMIcon成员函数来访问预定义的Windows图标。

19、RunAutomated

测试程序的命令行/Automation(自动)选项是否存在。该函数已废弃。新的方法是:在调用
ParseCommandLine之后使用在CCommandLineInfo::m_bRunEmbedded内的值。

BOOL RunAutomated( );

返回值: 如果该选项存在,返回非零;否则返回0

备注:

调用该函数来测试是否存在"/Automation"或"-Automation"选项,它表明服务器应用程序
是否被客户应用程序发动。如果存在,该选项被移出命令行。For more information on
OLE Automation, see the article Automation Servers in Visual C++ Programmer's
Guide.

20、RunEmbedded

测试程序的命令行/Embedding (嵌入)选项是否存在。该函数已废弃。新的方法是:在调用
ParseCommandLine之后使用在CCommandLineInfo::m_bRunEmbedded内的值。

BOOL RunEmbedded( );

返回值: 如果该选项存在,返回非零;否则返回0

备注:

调用该函数来测试是否存在"/Embedding"或"-Embedding"选项,它表明服务器应用程序是
否被客户应用程序发动。如果存在,该选项被移出命令行。For more information on em
bedding, see the article Servers: Implementing a Server in Visual C++ Programm
er's Guide.

21、ParseCommandLine

在命令行分析单个参数和标志。

void ParseCommandLine( CCommandLineInfo& rCmdInfo );

参数:

rCmdInfo CCommandLineInfo对象的索引。

备注:

调用该成员函数来分析命令行及发送参数,每次一个CCommandLineInfo::ParseParam。


当你用AppWizard开始一个MFC新工程,AppWizard将创建一个CCommandLineInfo的局部实例
,然后在InitInstance成员函数调用ProcessShellCommand和ParseCommandLine。命令行遵
循下面描述的途径:

在InitInstance中被创建后,CCommandLineInfo对象被传递给ParseCommandLine。

ParseCommandLine然后反复调用CCommandLineInfo::ParseParam,每次一个参数。

ParseParam填充CCommandLineInfo对象,它再传递给ProcessShellCommand。

ProcessShellCommand操纵命令行参数和标志。

注意:需要时也可直接调用ParseCommandLine。

For a description of the command-line flags, see CCommandLineInfo::m_nShellCom
mand.

22、ProcessShellCommand

操纵命令行参数及标志。

BOOL ProcessShellCommand( CCommandLineInfo& rCmdInfo );

返回值: 如果外壳命令被正确处理,返回非零;当从初始化函数InitInstance返回FALSE
时该函数返回0。

参数:

rCmdInfo 对CCommandLineInfo对象的引用。

备注:

该成员函数被InitInstance调用来接受从由rCmdInfo定义的CCommandLineInfo对象传递的
参数,并执行标定动作。

当你用AppWizard开始一个MFC新工程时,AppWizard将创建一个CCommandLineInfo的局部实
例,然后在InitInstance成员函数调用ProcessShellCommand和ParseCommandLine。命令行
遵循下面描述的途径:

在InitInstance中被创建后,CCommandLineInfo对象被传递给ParseCommandLine。

ParseCommandLine然后反复调用CCommandLineInfo::ParseParam,每次一个参数。

ParseParam填充CCommandLineInfo对象,它再传递给ProcessShellCommand。

ProcessShellCommand操纵命令行参数和标志。

CCommandLineInfo对象的成员变量由CCommandLineInfo::m_nShellCommand定义,象下面的
枚举类型(定义在CCommandLineInfo类中)。

 

enum{

FileNew,

FileOpen,

FilePrint,

FilePrintTo,

FileDDE,

};

要了解这些值的简短描述,看CCommandLineInfo::m_nShellCommand。

23、GetProfileInt

从应用程序的.INI文件获取一个条目。

UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );

返回值: 如果成功,为跟随指定条目字符串的整型值;如果函数没有发现该条目,则返回
值是参数nDefault的值;如果符合指定条目的值不是整型值,则返回0。

该成员函数支持.INI文件内的16进制标记值。当你取一个有符号整数时,应该将它转换成
整型值(int)。

参数:

lpszSection 指向包含指定条目段的字符串的指针,该字符串以null结尾。

lpszEntry 指向包含要搜索的值的条目的字符串的指针,该字符串以null结尾。

nDefault 指定缺省的返回值,当工作框架没有发现该条目时。该值可以是0~65,535范围内
的无符号值,或–32,768~32,767范围内的有符号值。

备注:

调用该成员函数来取出应用程序的.INI文件内指定段的条目内的整型值。

???该成员函数对不敏感This member function is not case情况 sensitive敏感, so
the strings in the lpszSection and lpszEntry parameters may differ不同 in cas
e万一.

24、WriteProfileInt

向应用程序的.INI文件的一个条目内保存一个整型值。

BOOL WriteProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue );

返回值: 成功为非零;否则为0。

参数:

lpszSection 指向包含指定条目段的字符串的指针,该字符串以null结尾。如果该段不存
在,它将被创建。段名为中立字符串;该字符串可以是大小写字母的任意组合。

lpszEntry 指向包含要保存的值的条目的字符串的指针,该字符串以null结尾。如果该条
目在指定段内不存在,它将被创建。

nValue 包含被写的值。

例子:

CString strSection = "My Section";

CString strStringItem = "My String Item";

CString strIntItem = "My Int Item";

CWinApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test");

CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem);

ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234);

int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0);

ASSERT(nValue == 1234);

25、GetProfileString

从应用程序的.INI文件的一个条目内取出一个字符串。

CString GetProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpsz
Default = NULL );

返回值: The为来自应用程序.INI文件的字符串,当该字符串没有被找到时为lpszDefaul
t。工作框架支持的最大字符串长度为_MAX_PATH。如果lpszDefault是NULL,返回值为空字
符串。

参数:

lpszSection 指向包含指定条目段的字符串的指针,该字符串以null结尾。

lpszEntry 指向包含要取出的值的条目的字符串的指针,该字符串以null结尾。该值必须
不是NULL。

lpszDefault 指向所给条目值的缺省字符串,当该条目在初始化文件中没有被发现时。


例子:

CString strSection = "My Section";

CString strStringItem = "My String Item";

CString strIntItem = "My Int Item";

CWinApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test");

CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem);

ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234);

int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0);

ASSERT(nValue == 1234);

26、WriteProfileString

向应用程序的.INI文件的一个条目内保存一个字符串。

BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszV
alue );

返回值: 如果成功为非零;否则为0。

参数:

lpszSection 指向包含指定条目段的字符串的指针,该字符串以null结尾。如果该段不存
在,它将被创建。段名为中立字符串;该字符串可以是大小写字母的任意组合。

lpszEntry 指向包含要保存的值的条目的字符串的指针,该字符串以null结尾。如果该条
目在指定段内不存在,它将被创建。

lpszValue 指向要写的字符串的指针。如果该参数为NULL,由参数lpszEntry指定的条目将
被删除。

例子:

CString strSection = "My Section";

CString strStringItem = "My String Item";

CString strIntItem = "My Int Item";

CWinApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test");

CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem);

ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234);

int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0);

ASSERT(nValue == 1234);

27、AddDocTemplate

向应用程序的可用文档模板列表添加文档模板。

void AddDocTemplate( CDocTemplate* pTemplate );

参数:

pTemplate 指向要添加的CDocTemplate指针。

备注:

调用该成员函数向应用程序的可用文档模板列表添加文档模板,这样维护应用程序。你可
以在调用RegisterShellFileTypes之前给应用程序添加所有文档模板。

例子:

BOOL CMyApp::InitInstance()

{

// ...

. // The following code is produced by AppWizard when you

// choose the MDI (multiple document interface) option.

CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(

IDR_MYTYPE,

RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMDIChildWnd), // standard MDI child frame

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

// ...

}

28、GetFirstDocTemplatePosition

取出第一个文档模板的位置。

POSITION GetFirstDocTemplatePosition( ) const;

返回值: 一个POSITION值,能被用于克隆或修改对象指针;如果列表是空的则为NULL。


备注:

获得应用程序中的首席文档模板的位置。由调用GetNextDocTemplate返回的 POSITION值来
得到首席CDocTemplate对象。

29、GetNextDocTemplate

取出文档模板位置,能被递归使用。

CWinApp::GetNextDocTemplate

CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;

返回值: 指向CDocTemplate对象的指针。

参数:

pos 前面调用GetNextDocTemplate or GetFirstDocTemplatePosition返回的POSITION值的
索引。该值在这次调用中被更新为下一个位置。

备注:

获得由pos鉴定的文档模板,然后将pos设置为POSITION值。如果你用GetFirstDocTemplat
ePosition来设定最初位置,你可以用GetNextDocTemplate循环向前。

你必须确保你的POSITION值是有效的。如果它无效,则只能用MFC类库的调试版。

如果取出的文档模板是最后一个有效值,则pos的新值被设为NULL。

30、OpenDocumentFile

被工作框架调用来从文件打开文档。

CWinApp::OpenDocumentFile

virtual CDocument* OpenDocumentFile( LPCTSTR lpszFileName );

返回值: 如果成功为指向CDocument的指针;否则为NULL。

参数:

lpszFileName 被打开的文件的名称。

备注:

工作框架调用该成员函数来为应用程序打开名称为CDocument的文件。如果该名称的文档已
被打开,包含该文档的第一个框架窗口将被激活。如果应用程序支持多文档模板,工作框
架用文件扩展名寻找适当的文档模板来试图加载该文档。如果成功,该文档模板则建立一
个框架窗口并显示该文档。

例子:

BOOL CMyApp::InitInstance()

{

// ...

if (m_lpCmdLine[0] == '/0')

{

// Create a new (empty) document.

OnFileNew();

}

else

{

// 打开作为第一个命令行参数的文件。

OpenDocumentFile(m_lpCmdLine);

}

// ...

}

31、AddToRecentFileList

增加一个文件名到最近用过的文件(MRU)列表。

CWinApp::AddToRecentFileList

virtual void AddToRecentFileList( LPCTSTR lpszPathName );

参数:

lpszPathName 文件的路径。

备注:

在使用该成员函数前,你可以调用LoadStdProfileSettings成员函数来加载当前MRU 文件
列表。

当工作框架打开文件或执行“另存为...”命令时,它调用该成员函数。

例子:

// This adds the pathname c:/temp/test.doc to the top of

// the most recently used (MRU) list in the File menu.

AfxGetApp()->AddToRecentFileList("c://temp//test.doc");

32、SelectPrinter

由用户通过指示打印机对话框来选择打印机。

CWinApp::SelectPrinter

void SelectPrinter( HANDLE hDevNames, HANDLE hDevMode, BOOL bFreeOld = TRUE );


参数:

hDevNames 一个DEVNAMES结构的句柄,该结构标识driver,device和指定打 印机的输出端
口名称。

hDevMode 一个DEVNAMES结构的句柄,该结构指定有关设备初始化和打印机 环境的信息。


bFreeOld 释放以前选择的打印机。

备注:

调用该成员函数来选择指定打印机,并释放以前在打印机对话框中选择的打印机。

如果hDevMode和hDevNames是NULL,SelectPrinter使用当前缺省打印机。

33、CreatePrinterDC

创建打印机设备环境。

CWinApp::CreatePrinterDC

BOOL CreatePrinterDC( CDC& dc );

返回值: 成功为非零;否则为0。

参数:

dc 打印机设备环境索引。

备注:

调用该成员函数用来从所选择的打印机来创建打印机设备环境(DC)。

34、GetPrinterDeviceDefaults

获得打印机设备环境缺省值。

CWinApp::GetPrinterDeviceDefaults

BOOL GetPrinterDeviceDefaults( PRINTDLG* pPrintDlg );

返回值: 成功为非零;否则为0。

参数:

pPrintDlg 指向PRINTDLG结构的指针。

备注:

调用该成员函数来为打印准备打印机设备环境。必要时从Windows .INI文件获得当前打印
机缺省值,或使用用户在打印机设置中的最后一个打印机配置。

◆可重载

35、InitInstance

通过重载来执行Windows实例初始化,象创建你的window对象。

CWinApp::InitInstance

virtual BOOL InitInstance( );

返回值: 初始化成功为非零;否则为0。

备注:

Windows允许同一个程序的几个副本在同一时刻运行。应用程序初始化从概念上分为两个部
分: 以前的应用程序初始化也就是程序运行时首先要做的,并且实例初始化是程序的每次
运行的一个副本要做的,包括第一次的。工作框架的WinMain实现调用该函数。

重载InitInstance来初始化你的Windows应用程序的每个新实例。典型地,你要重载InitI
nstance来构造你的主窗口对象并设置CWinThread::m_pMainWnd数据成员指向该窗口。For
more information on overriding this member function, see CWinApp: The Applica
tion Class in Visual C++ Programmer's Guide.

例子:

// AppWizard根据你选择的选项实现重载InitInstance函数。

// 举个例子,单文档界面(SDI)选项被选择,AppWizard创建一面的代码。

// 你可以向AppWizard生成的代码内添加其它每个实例的初始化代码。

 

BOOL CMyApp::InitInstance()

{

// 标准初始化

// 如果你不使用这些特性并希望减小你的最终程序的大小,你可以删除

// 下面你不需要的初始化常规工作。

 

SetDialogBkColor(); // 将对话框底色设置为灰色

LoadStdProfileSettings(); // 加载标准的INI文件选项(包括MRU)

 

// 注册应用程序的文档模板。 文档模板用于协调

// 文档、框架窗口和视图之间的联系。

 

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMainFrame), // 主SDI框架窗口

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

 

// 创建一个新(空)文档

OnFileNew();

 

if (m_lpCmdLine[0] != '/0')

{

// TODO: add command line processing here

}

 

return TRUE;

}

36、Run

运行缺省的消息循环。重载它可定制消息循环。

CWinApp::Run

virtual int Run( );

返回值: 由WinMain返回的一个int值。

备注:

Run接收并发送Windows消息直到应用程序收到WM_QUIT消息。如果应用程序的当前消息队列
没有消息,Run调用OnIdle来执行空闲时处理。新来的消息到PreTranslateMessage成员函
数做特殊处理,再到Windows函数TranslateMessage做标准键盘转换;最后,DispatchMes
sage Windows函数被调用。

Run很少被重载,但你可以重载它来实现特殊功能。

37、OnIdle

重载来执行特殊程序空闲时处理。

CWinApp::OnIdle

virtual BOOL OnIdle( LONG lCount );

返回值: 非零值表示接受更多空闲处理时间;0表示没有空闲处理时间。

参数:

lCount 这是个计数器,每当该线程的消息队列为空时OnIdle被调用一次,该计数器值增加
。每当一个新线程被处理时,该计数器复位为0。你可以用lCount参数来测定线程没有处理
消息的空闲时间的长短。

备注:

当该线程的消息队列为空时OnIdle被其缺省的消息循环所调用。你应该重载它,来做你自
己的后台空闲处理任务。

OnIdle返回0表明CPU没有空来执行闲差。每当消息队列清空时OnIdle被调用,lCount参数
自动增加;而每当有新线程开始时lCount被复位到0。用此计数器值你能调用你自己的非常
规的空闲处理。

下面是空闲循环处理的综述:

如果MFC类库中的消息循环检查消息队列并且发现没有等待处理的消息,它将为应用程序对
象调用OnIdle并把0作为lCount参数。

OnIdle执行一些处理并返回一个非零值来表示可以被再次调用来做更多处理。

消息循环再次检查消息队列。如果没有消息需要处理,它将再次调用OnIdle,增加lCount
参数值。

最后,OnIdle结束处理所有空闲任务并返回0。这告诉消息循环要停止调用OnIdle直到从消
息队列收到下一个消息,到此将参数设置为0该空闲周期重新开始。

因为在OnIdle结束之前应用程序不能处理消息,所以不要在该函数中做较长的任务。

注意 缺省的OnIdle实现更新命令用户界面对象如菜单项和工具条按钮,并且它执行内部数
据结构清除。所以,如果你重载OnIdle,你必须调用CWinApp::OnIdle附带lCount在你的重
载版本。首先调用所有基类空闲处理(即,直到基类OnIdle返回0)。如果你需要在基类处理
完成之前执行工作,复查基类实现来选择合适的lCount值在做你的工作期间。

例子:

下面两个例子展示如何使用OnIdle。第一个例子使用lCount参数区分它要处理的两个空闲
任务的优先权。第一个任务为高优先级,只要有空闲就应该处理它。第二个任务是次要的
,它仅当用户输入出现长暂停时被处理。注意调用OnIdle的基类版本。第二个例子管理有
不同优先级的空闲任务群体。

BOOL CMyApp::OnIdle(LONG lCount)

{

BOOL bMore = CWinApp::OnIdle(lCount);

if (lCount == 0)

{

TRACE("App短周期空闲/n");

bMore = TRUE;

}

else if (lCount == 10)

{

TRACE("App长周期空闲/n");

bMore = TRUE;

}

else if (lCount == 100)

{

TRACE("App较长周期空闲/n");

bMore = TRUE;

}

else if (lCount == 1000)

{

TRACE("App超长周期空闲/n");

// bMore不设为TRUE, 不再需要空闲

// 重要:bMore不设为FALSE自从CWinApp::OnIdle

//可能有更多空闲任务要完成

}

return bMore;

// 返回TRUE,只要有任何其它空闲任务

}

 

/*Second Example

// In this example, four idle loop tasks are given various

// opportunities to run:

// Task1 is always given a chance to run during idle time, provided

// that no message has queued up while the framework was processing

// its own idle loop tasks (at lCount levels 0 and 1).

// Task2 is given a chance to run only if Task1 has already run,

// provided that no message has queued up while Task1 was running.

// Task3 and Task4 are given a chance to run only if both Task1 and

// Task2 have already run, and no message has queued up in the mean

// time. If Task3 gets its chance to run, then Task4 always gets

// a chance to run immediately after Task3。*/

 

BOOL CMyApp::OnIdle(LONG lCount)

{

// In this example, as in most applications, you should let the

// base class CWinApp::OnIdle complete its processing before you

// attempt any additional idle loop processing.

if (CWinApp::OnIdle(lCount))

return TRUE;

 

// The base class CWinApp::OnIdle reserves the lCount values 0

// and 1 for the framework's own idle processing. If you wish to

// share idle processing time at a peer level with the framework,

// then replace the above if-statement with a straight call to

// CWinApp::OnIdle; and then add a case statement for lCount value

// 0 and/or 1. Study the base class implementation first to

// understand how your idle loop tasks will compete with the

// framework's idle loop processing.

 

switch (lCount)

{

case 2:

Task1();

return TRUE; // next time give Task2 a chance

case 3:

Task2();

return TRUE; // next time give Task3 and Task4 a chance

case 4:

Task3();

Task4();

return FALSE; // cycle through the idle loop tasks again

}

return FALSE;

}

38、ExitInstance

重载来做清除工作,当你的应用重新终止时。

CWinApp::ExitInstance

virtual int ExitInstance( );

返回值: 应用程序的退出代码;0表示没有错误,大于0的值表示有错误。该值被用做从W
inMain的返回值。

备注:

被工作框架从Run成员函数内调用来退出应用程序实例。

不要从除Run成员函数内以外的其它任何地方调用该成员函数。

该函数的缺省实现写工作框架选项到应用程序的.INI文件。重载它,当应用程序结束时来
做一些清理工作。

39、HideApplication

关闭所有文档前隐藏应用程序。

CWinApp::HideApplication

void HideApplication( );

40、CloseAllDocuments

关闭所有打开的文档。

CWinApp::CloseAllDocuments

void CloseAllDocuments( BOOL bEndSession );

参数:

bEndSession 指定无论是否Windows会话(session??)被激活。如果会话被激活它为TR
UE;否则为FALSE。

备注:

退出前调用该成员函数来关闭所有打开的文档。调用HideApplication前先调用CloseAllD
ocuments。

41、PreTranslateMessage

过滤消息,在它们发送给Windows函数::TranslateMessage和::DispatchMessage之前。


CWinApp::PreTranslateMessage

virtual BOOL PreTranslateMessage( MSG* pMsg );

返回值: 如果消息在PreTranslateMessage内被完全处理并不必再作更多处理,返回值为
非零。如果消息应该按普通途径作处理。

参数:

pMsg 一个指向MSG结构的指针,该结构包含要处理的消息。

备注:

重载该函数来过滤window消息,在它们被发送到Windows函数TranslateMessage和Dispatc
hMessage前。缺省的实现执行加速键转换,所以你必须调用CWinApp::PreTranslateMessa
ge成员函数在你的重载版本。

42、SaveAllModified

提示用户保存所有已变化的文档。

CWinApp::SaveAllModified

virtual BOOL SaveAllModified( );

返回值: 如果安全地终止了应用程序,返回值为非零;否则为0。

备注:

当应用程序的主框架窗口被关闭,或通过了一个WM_QUERYENDSESSION消息时该函数被工作
框架调用来保存所有文档。

该成员函数的缺省实现依次调用CDocument::SaveModified成员函数来保存所有在应用程序
内被修改过的文档。

43、DoMessageBox

为应用程序实现AfxMessageBox。

CWinApp::DoMessageBox

virtual int DoMessageBox( LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt );

返回值: 返回与AfxMessageBox相同的值。

参数:

lpszPrompt 在消息框内的文本的地址。

nType 消息框的类型。

nIDPrompt 对帮助的上下文字符串的索引。

备注:

工作框架调用该成员函数来为全局函数AfxMessageBox实现消息框。

不要调用该成员函数来打开消息框;应该用AfxMessageBox代替。

重载该成员函数来定制你的应用程序AfxMessageBox调用处理。

44、ProcessMessageFilter

截获确定的消息在它们到达应用程序之前。

CWinApp::ProcessMessageFilter

virtual BOOL ProcessMessageFilter( int code, LPMSG lpMsg );

返回值: 如果消息被处理返回非零;否则为0。

参数:

code 指定挂钩代码。该成员函数使用该代码来决定如何处理lpMsg。

lpMsg 指向Windows MSG结构的指针。

备注:

工作框架的挂钩函数调用该成员函数来过滤和响应确定的Windows消息。挂钩函数在它给应
用程序发送普通处理的消息之前处理事件。

如果重载该高级功能,要确保调用基类版本来维持工作框架的挂钩处理。

45、ProcessWndProcException

通过应用程序的消息及命令控制器截获所有非操作性(unhandled??)例外。

CWinApp::ProcessWndProcException

virtual LRESULT ProcessWndProcException( CException* e, const MSG* pMsg );

返回值: 此值应该返回给Windows。正常情况0L为windows消息,1L(TRUE) 为命令消息。


参数:

e 指向不可捕获的例外的指针。

pMsg 应该MSG结构,它包含导致工作框架抛出异常的有关信息。

备注:

每当控制器没有捕捉到由你的应用程序的消息或命令控制器抛出的例外,工作框架调用该
成员函数。

不要直接调用该成员函数。

该成员函数的缺省实现创建一个消息框。如果不可捕捉的例外产生自菜单、工具条或加速
键命令的失败,消息框显示"Command failed"消息;否则,它显示"内部应用程序错误Int
ernal application error"消息。

重载该成员函数来对你的例外进行全局操作。如果你希望显示该消息框,就要调用基本功
能。

46、DoWaitCursor

“等待”光标的开关。

CWinApp::DoWaitCursor

virtual void DoWaitCursor( int nCode );

参数:

nCode 为1,出现“等待”光标。如果为0,“等待”光标被恢复但不增加索引计数值. 如
果为–1,“等待”光标结束。

备注:

该成员函数被工作框架调用,来实现CWaitCursor、CCmdTarget::BeginWaitCursor、CCmd
Target::EndWaitCursor、和CCmdTarget::RestoreWaitCursor。缺省实现为一个沙漏光标
。DoWaitCursor维护索引计数器。

然而你不能简单地直接调用DoWaitCursor,你应该重载该成员函数来改变“等待”光标或
增加当“等待”光标出现时其它的处理。

早期实现“等待”光标更流行的方法是用CWaitCursor。

47、OnDDECommand

由工作框架在响应动态数据交换(DDE)时调用来执行命令。

CWinApp::OnDDECommand

virtual BOOL OnDDECommand( LPTSTR lpszCommand );

返回值: 如果该命令被l处理返回非零;否则为0。

参数:

lpszCommand 由应用程序认为标准的指向DDE命令的字符串。

备注:

当主框架窗口收到一个DDE执行消息时工作框架调用该成员函数。其缺省实现检查是否该命
令要求打开一个文档,并且要是这样,就打开指定的文档。当用户双击一个数据文件时Wi
ndows文件管理器(资源管理器)通常发送象DDE这样的命令字符串。重载该成员函数来操
纵其它DDE执行命令,象打印命令。

例子:

BOOL CMyApp::OnDDECommand(LPTSTR lpszCommand)

{

if (CWinApp::OnDDECommand(lpszCommand))

return TRUE;

 

// Handle any DDE commands recognized by your application

// and return TRUE. See implementation of CWinApp::OnDDEComand

// for example of parsing the DDE command string.

// Return FALSE for any DDE commands you do not handle.

return FALSE;

}

48、WinHelp

调用WinHelp Windows函数。

CWinApp::WinHelp

virtual void WinHelp( DWORD dwData, UINT nCmd = HELP_CONTEXT );

参数:

dwData 指定另外的数据。该值依赖于nCmd参数值。

nCmd 指定要求的帮助类型。要了解所有可能值及它们如何影响dwData参数,看WinHelp W
indows函数。

备注:

调用该成员函数请求WinHelp应用程序。工作框架也调用该成员函数来请求WinHelp应用程
序。

当你的应用程序终止时工作框架将自动关闭WinHelp应用程序。

 

例子:

//头文件: HELPIDS.H

//

// This example header file is #include'd twice:

// (1) It is #include'd by the .CPP file that passes the DWORD

// context i.d. to CWinApp::WinHelp.

// (2) It is #include'd in the [MAP] section of the .HPJ file,

// to associate the help context string "HID_MYTOPIC" with

// the help context numeric i.d., 101.

// The help context string "HID_MYTOPIC" is what identifies the

// help topic in the help .RTF source file, in the "#" footnote:

// # HID_MYTOPIC

//

// 注意,it is not necessary to manage help context id's this way

// for help topics associated with command id's and user interface

// id's defined in your RESOURCE.H file; you should use the MAKEHM

// tool, or the MAKEHELP.BAT file produced by AppWizard's Context

// Help option, to produce a help map (.HM) file for these id's.

// It is necessary to manage help context id's as illustrated here

// only for help topics not associated with command id's or user

// interface id's.

 

#define HID_MYTOPIC 101

// Show the custom help topic that has the context string

// "HID_MYTOPIC" in the help .RTF file, and which is mapped

// to the DWORD i.d. HID_MYTOPIC in the above HELPIDS.H file.

AfxGetApp()->WinHelp(HID_MYTOPIC);

// The following is one line of code in the help map (.HM)

// file produced by the MAKEHM tool, which in turn is called

// by the MAKEHELP.BAT file produced by the AppWizard Context

// Help option. The MAKEHM tool reads the following #define

// in the application's RESOURCE.H file:

// #define ID_MYCOMMAND 0x08004

// and adds a help id offset value of 0x10000 to create the

// help context DWORD value 0x18004. See MFC Tech Note 28

// for more information on help id offset values.

HID_MYCOMMAND 0x18004

// Rarely will you need to directly call WinHelp yourself

// with the help context i.d. for a command or user interface

// object. The framework will call WinHelp automatically when

// the user, for example, hits F1 when the focus is on a

// My Command menu item. However, if you do want to directly

// call WinHelp for the help topic associated with the command,

// here is how you would do it:

 

AfxGetApp()->WinHelp(0x10000 + ID_MYCOMMAND);

◆初始化

49、LoadStdProfileSettings

加载标准的.INI文件设置并激活MRU文件列表功能。

CWinApp::LoadStdProfileSettings

void LoadStdProfileSettings( UINT nMaxMRU = _AFX_MRU_COUNT );

参数:

nMaxMRU 记录最近使用的文件的数目。

备注:

从InitInstance成员函数调用该成员函数来激活并加载常用文件列表(MRU)和最后的预览状
态。如果nMaxMRU是零,将取消MRU列表维护。

50、SetDialogBkColor

设置缺省的对话框和消息框背景颜色、文本颜色。

CWinApp::SetDialogBkColor

void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtl
Text = RGB(0, 0, 0) );

参数:

clrCtlBk 应用程序对话框的背景颜色。

clrCtlText 应用程序对话控制颜色。

例子:

BOOL CMyApp::InitInstance()

{

// Standard initialization

 

SetDialogBkColor(); // Set dialog background color to gray

LoadStdProfileSettings(); // Load standard INI file options (including MRU)

 

// ...

}

51、SetRegistryKey

使应用程序设置存储在注册表中而不是.INI文件。

CWinApp::SetRegistryKey

void SetRegistryKey( LPCTSTR lpszRegistryKey );

void SetRegistryKey( UINT nIDRegistryKey );

参数:

lpszRegistryKey 指向包含键名的字符串的指针。

nIDRegistryKey 在注册表中键的ID/索引。

备注:

该函数设置m_pszRegistryKey,它再被CWinApp的成员函数GetProfileInt,GetProfileSt
ring,WriteProfileInt,和WriteProfileString使用。如果该函数已被调用,常用文件列
表(MRU)也被储存在注册表中。注册键值通常是公司名。它保存在下列形式的注册键内:H
KEY_CURRENT_USER/Software/<公司名>/<应用程序名>/<段名>/<值名>。

52、EnableShellOpen

允许用户从打开数据文件。

CWinApp::EnableShellOpen

void EnableShellOpen( );

备注:

典型做法是从你重载的InitInstance调用该函数,来使你的应用程序的用户能从Windows文
件管理器(资源管理器)内双击文件来打开数据文件。调用与该函数联合的RegisterShel
lFileTypes成员函数,或人为提供一个文档类型注册项.REG文件给你的应用程序。

Example

BOOL CMyApp::InitInstance()

{

// ...

CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(

IDR_MYTYPE,

RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMDIChildWnd), // standard MDI child frame

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

// Create main MDI Frame window.

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

// Save the pointer to the main frame window. This is the

// only way the framework will have knowledge of what the

// main frame window is.

m_pMainWnd = pMainFrame;

 

// enable file manager drag/drop and DDE Execute open

EnableShellOpen();

RegisterShellFileTypes();

// ...

 

// Show the main window using the nCmdShow parameter

// passed to the application when it was first launched.

pMainFrame->ShowWindow(m_nCmdShow);

pMainFrame->UpdateWindow();

// ...

}

53、RegisterShellFileTypes

在Windows文件管理器(资源管理器)注册所有应用程序的文档类型。

CWinApp::RegisterShellFileTypes

void RegisterShellFileTypes( BOOL bCompat = FALSE );

参数:

bCompat TRUE给外壳命令“打印”和“打印到”添加注册入口,允许用户从外壳直接打印
文件,或拖拽文件到打印机对象。它也增加一个缺省图标键。缺省情况下,为向后兼容该
参数为FALSE。

备注:

调用该成员函数在Windows文件管理器(资源管理器)来注册所有你的应用程序文档类型。
这允许用户通过在文件管理器(资源管理器)内双击文件图标来打开由应用程序创建的数
据文件。在你为你的应用程序的每个文档模板调用AddDocTemplate之后,调用RegisterSh
ellFileTypes。同样当你调用RegisterShellFileTypes时也调用EnableShellOpen成员函数

RegisterShellFileTypes反复通过CDocTemplate对象列表,这样应用程序维护为每个文档
模板在注册表添加入口,这是由Windows维护的文件关联。文件管理器(资源管理器)使用
这些入口来打开一个数据文档,当用户双击它时。这不包括必须传送给应用程序的.REG文
件。

如果注册数据库已经将所给文件扩展名与其它文件类型相关联,则不会创建新的关联。要
了解必须注册的信息字符串格式,看CDocTemplate类。

54、Enable3dControls

注意: 下面的描述对Enable3dControls和Enable3dControlsStatic的都一样。

55、Enable3dControlsStatic

激活3D风格的界面控制。

CWinApp::Enable3dControls

1、BOOL Enable3dControls( );

2、BOOL Enable3dControlsStatic( );

返回值:1、TRUE表示CTL3D32.DLL被成功加载;否则为FALSE.。

2、如果操作系统支持3D查找控制该函数将返回FALSE。

备注:

从你重载的InitInstance成员函数调用这两个函数的任意一个来激活对话框和窗口的3D界
面风格。这些成员函数加载CTL3D32.DLL并给应用程序注册该DLL。如果你调用Enable3dCo
ntrols或Enable3dControlsStatic,你就不必调用SetDialogBkColor成员函数。

Enable3dControls应该用于链接了MFC动态库DLLs时。Enable3dControlsStatic应该用于链
接了MFC静态库lib时。

特点仅在于专业版和企业版支持静态链接MFC。更详细的内容看Visual C++版本。

MFC自动为下列windows类提供3D控制效果:

CDialog

CDialogBar

CFormView

CPropertyPage

CPropertySheet

CControlBar

CToolBar

如果你希望的3D效果控制是这些类型的窗口之一,所有你需要激活的调用Enable3dContro
ls或Enable3dControlsStatic。如果你想给基于其它类(上列7类以外)的窗口添加3D效果,
你必须直接调用CTL3D32 API函数。

 

例子:

#ifdef _AFXDLL

Enable3dControls( ); //Call Enable3dControls

#else

Enable3dControlsStatic( );

//Call Enable3dControlsStatic

#endif

◆命令操纵

56、OnFileNew

执行ID_FILE_NEW命令。

CWinApp::OnFileNew

afx_msg void OnFileNew( );

备注:

你必须增加一个ON_COMMAND( ID_FILE_NEW, OnFileNew ) 声明到你的CWinApp类消息映射
表来激活该成员函数。如果激活后,该成员函数控制File New命令的执行。

看Technical Note 22 来了解其缺省行为和指导如何重载该成员函数。

 

例子:

// The following message map, produced by AppWizard, binds the

// File New, Open, and Print Setup menu commands to default

// framework implementations of these commands.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// Standard print setup command

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)

END_MESSAGE_MAP()

 

// The following message map illustrates how to rebind the

// File New, Open and Print Setup menu commands to handlers that

// you implement in your CWinApp-derived class. You can use

// ClassWizard to bind the commands, as illustrated below, since

// the message map entries are bracketed by //{{AFX_MSG_MAP

// and //}}AFX_MSG_MAP. Note, you can name the handler

// CMyApp::OnFileNew instead of CMyApp::OnMyFileNew, and likewise

// for the other handlers, if desired.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

ON_COMMAND(ID_FILE_NEW, OnMyFileNew)

ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

57、OnFileOpen

执行ID_FILE_OPEN命令。

CWinApp::OnFileOpen

afx_msg void OnFileOpen( );

备注:

你必须增加一个ON_COMMAND( ID_FILE_OPEN, OnFileOpen ) 声明到你的CWinApp类消息映
射表来激活该成员函数。如果激活后,该成员函数控制File Open命令的执行。

看Technical Note 22 来了解其缺省行为和指导如何重载该成员函数。

 

例子:

// The following message map, produced by AppWizard, binds the

// File New, Open, and Print Setup menu commands to default

// framework implementations of these commands.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// Standard print setup command

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)

END_MESSAGE_MAP()

 

// The following message map illustrates how to rebind the

// File New, Open and Print Setup menu commands to handlers that

// you implement in your CWinApp-derived class. You can use

// ClassWizard to bind the commands, as illustrated below, since

// the message map entries are bracketed by //{{AFX_MSG_MAP

// and //}}AFX_MSG_MAP. Note, you can name the handler

// CMyApp::OnFileNew instead of CMyApp::OnMyFileNew, and likewise

// for the other handlers, if desired.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

ON_COMMAND(ID_FILE_NEW, OnMyFileNew)

ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

58、OnFilePrintSetup

执行ID_FILE_PRINT_SETUP命令。

CWinApp::OnFilePrintSetup

afx_msg void OnFilePrintSetup( );

备注:

你必须增加一个ON_COMMAND( ID_FILE_PRINT_SETUP, OnFilePrintSetup )声明到你的CWi
nApp类消息映射表来激活该成员函数。如果激活后,该成员函数控制File Print命令的执
行。

看Technical Note 22 来了解其缺省行为和指导如何重载该成员函数。

 

例子:

// The following message map, produced by AppWizard, binds the

// File New, Open, and Print Setup menu commands to default

// framework implementations of these commands.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// Standard print setup command

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)

END_MESSAGE_MAP()

 

// The following message map illustrates how to rebind the

// File New, Open and Print Setup menu commands to handlers that

// you implement in your CWinApp-derived class. You can use

// ClassWizard to bind the commands, as illustrated below, since

// the message map entries are bracketed by //{{AFX_MSG_MAP

// and //}}AFX_MSG_MAP. Note, you can name the handler

// CMyApp::OnFileNew instead of CMyApp::OnMyFileNew, and likewise

// for the other handlers, if desired.

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

ON_COMMAND(ID_FILE_NEW, OnMyFileNew)

ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

59、OnContextHelp

在应用程序内控制SHIFT+F1帮助。

CWinApp::OnContextHelp

afx_msg void OnContextHelp( );

备注:

你必须增加一个ON_COMMAND( ID_CONTEXT_HELP, OnContextHelp )声明到你的CWinApp类消
息映射表并添加一个快捷键表入口,典型的如SHIFT+F1,来激活该成员函数。

OnContextHelp将应用程序置于帮助模式。光标变为带问号的箭头,用户可以将其移动到对
话框、窗口、菜单或命令按钮上按鼠标左键。该成员函数取出光标下的对象的帮助上下文
并以该帮助上下文调用Windows函数WinHelp。

60、OnHelp

在应用程序内控制F1 Help(使用当前上下文)。

CWinApp::OnHelp

afx_msg void OnHelp( );

备注:

你必须增加一个ON_COMMAND( ID_HELP, OnHelp )声明到你的CWinApp类消息映射表来激活
该成员函数。通常你你也要为F1添加一个快捷键入口。激活F1键仅仅是个惯例,不是必须
的。如果激活后当用户按F1键时工作框架调用该函数。

该消息控制函数的缺省实现决定当前窗口、对话框或菜单项的相关帮助上下文,然后调用
WINHELP.EXE。如果没有当前可用上下文,该函数使用缺省上下文。

重载该成员函数来设置帮助上下文给其它与拥有当前焦点的窗口、对话框、菜单项或工具
条按钮不同的内容。带着需求帮助主题ID调用WinHelp。

61、OnHelpIndex

控制ID_HELP_INDEX命令并提供缺省的帮助主题。

CWinApp::OnHelpIndex

afx_msg void OnHelpIndex( );

备注:

你必须增加一个ON_COMMAND( ID_HELP_INDEX, OnHelpIndex )声明到你的CWinApp类消息映
射表来激活该成员函数。如果激活后,当你的应用程序的用户以标准的HELP_INDEX主题来
选择Help Index命令来请求WinHelp,工作框架调用该消息控制函数。

62、OnHelpFinder

控制ID_HELP_FINDER和ID_DEFAULT_HELP命令

CWinApp::OnHelpFinder

afx_msg void OnHelpFinder( );

备注:

你必须增加一个ON_COMMAND( ID_HELP_FINDER, OnHelpFinder )声明到你的CWinApp类消息
映射表来激活该成员函数。如果激活后,当你的应用程序的用户以标准的HELP_FINDER主题
来选择Help Finder命令来请求WinHelp,工作框架调用该消息控制函数。

63、OnHelpUsing

控制ID_HELP_USING命令。

CWinApp::OnHelpUsing

afx_msg void OnHelpUsing( );

备注:

你必须增加一个ON_COMMAND( ID_HELP_USING, OnHelpUsing )声明到你的CWinApp类消息映
射表来激活该成员函数。如果激活后,当你的应用程序的用户以标准的HELP_HELPONHELP主
题来选择Help Using命令来请求WinHelp,工作框架调用该消息控制函数。

你可能感兴趣的:(CWinApp)