首页 理论教育VC++MFC视频教程:CWinApp类的应用

VC++MFC视频教程:CWinApp类的应用

【摘要】:打开本章第7节建立的“Tp”工程,继续演示CWinApp类的开发应用。1)修改启动函数CWinApp派生类的构造函数代码。m_pszAppName成员变量有三种途径赋值,首先在CWinApp构造函数中获得字符串。在App派生类以外,调用CWinApp类成员函数的方法有两种。CWinApp类的成员函数LoadIcon和LoadStandardIcon,实际上是封装了API函数LoadIcon的结果。和加载图标的两个函数一样,CWinApp类的成员函数LoadCursor和LoadStandardCursor,分别用于加载程序光标和系统光标资源,它们封装的也是同一个API函数LoadCursor。

打开本章第7节建立的“Tp”工程,继续演示CWinApp类的开发应用。

1)修改启动函数CWinApp派生类的构造函数代码。

978-7-111-46378-8-Chapter04-56.jpg

2)编译并运行,测试代码。

m_pszAppName成员变量有三种途径赋值,首先在CWinApp构造函数中获得字符串。如果构造函数没有赋值,则通过字符串表中的AFX_IDS_APP_TITLE获取。如果字符串表中还没有赋值,则最后m_pszAppName根据进程的可执行文件的文件名进行赋值。

3)修改InitInstance函数的代码,测试CWinApp::SetDialogBkColor函数。

978-7-111-46378-8-Chapter04-57.jpg

4)测试图标加载函数,如图4-33所示。

在资源视图中,通过菜单命令插入或者导入一个图标资源,默认ID为IDI_ICON1。

978-7-111-46378-8-Chapter04-58.jpg

图4-33 添加图标资源

5)修改主对话框类的初始化函数代码。

978-7-111-46378-8-Chapter04-59.jpg

6)编译并运行,测试代码。窗口图标以及在任务栏的图标,都已经更改为新的图标。

在App派生类以外,调用CWinApp类成员函数的方法有两种。第一种是使用全局变量theApp调用,第二种是使用MFC全局函数AfxGetApp(),这个函数的返回值其实就是全局变量theApp的地址

7)使用LoadStandardIcon加载系统图标。

查看MSDN关于CWinApp::LoadStandardIcon函数的说明,在“WINDOWS.H”头文件中定义了5个系统图标ID。

#define IDI_APPLICATION MAKEINTRESOURCE(32512)

#define IDI_HAND MAKEINTRESOURCE(32513)

#define IDI_QUESTION MAKEINTRESOURCE(32514)

#define IDI_EXCLAMATION MAKEINTRESOURCE(32515

#define IDI_ASTERISK MAKEINTRESOURCE(32516)

#if(WINVER>=0x0400)

#defineIDI_WINLOGO MAKEINTRESOURCE(32517)

#endif/*WINVER>=0x0400*/

8)重新修改对话框初始化函数,测试加载系统图标。

978-7-111-46378-8-Chapter04-60.jpg

9)编译并运行,测试代码。(www.chuimin.cn)

CWinApp类的成员函数LoadIcon和LoadStandardIcon,实际上是封装了API函数LoadIcon的结果。查看MSDN关于LoadIcon函数的说明。

978-7-111-46378-8-Chapter04-61.jpg

其中第一个参数hInstance如果代入NULL,则该函数是从系统中加载图标;反之如果代入应用程序实例,则该函数从程序资源中加载图标。在MFC中调用应用程序实例,有以下几种方法。

HINSTANCE h=AfxGetInstanceHandle();

HINSTANCE h=AfxGetApp()->m_hInstance;

HINSTANCE h=theApp.m_hInstance;

10)修改代码,测试通过API加载图标资源。

978-7-111-46378-8-Chapter04-62.jpg

11)修改代码,测试通过API加载系统图标。

978-7-111-46378-8-Chapter04-63.jpg

12)通过断点进入LoadStandardIcon函数可以看到它的函数源代码。

978-7-111-46378-8-Chapter04-64.jpg

MAKEINTRESOURCE实际上就是强制类型转换,将整数类型强制转换为字符串指针类型。在源代码窗口中选中MAKEINTRESOURCE,然后按<F12>键可以查看到它的宏定义。

#define MAKEINTRESOURCE(i)(LPSTR)((DWORD)((WORD)(i)))

13)测试光标加载函数。

和加载图标的两个函数一样,CWinApp类的成员函数LoadCursor和LoadStandardCursor,分别用于加载程序光标和系统光标资源,它们封装的也是同一个API函数LoadCursor。

978-7-111-46378-8-Chapter04-65.jpg

其中第一个参数hInstance如果代入NULL,则该函数是从系统中加载图标;反之如果代入应用程序实例,则该函数从程序资源中加载图标。MSDN关于LoadStandardCursor函数的说明指出,在“WINDOWS.H”头文件中定义了以下系统光标ID。

978-7-111-46378-8-Chapter04-66.jpg

14)为对话框类添加一个WM_SETCURSOR的消息映射函数,如图4-34所示。

978-7-111-46378-8-Chapter04-67.jpg

图4-34 添加WM_SETCURSOR消息映射函数

15)修改该消息映射函数的代码。

978-7-111-46378-8-Chapter04-68.jpg

16)编译并运行,测试代码。

当鼠标光标停留在不同的控件上时,显示出不同的光标形状。在程序内导入或者自绘一个光标,就要使用CWinApp::LoadCursor函数。