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);