091001再来复习一下MFC程序的基础
2009-10-09 17:22
288 查看
一般的Window应用程序基本流程
WinMain()函数
任何一个应用程序都有一个入口函数,在Window下,程序的入口函数根据应用程序的类型,有两种选择:控制台程序的入口函数是main(),一般的 Window界面程序的入口函数是WinMain()。这里只探讨同我们下面的讨论有关的WinMain()函数。下面是该函数的原型:(Visuall C++中)
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
其中:
hInstance是标识当前进程的实例,它实际上是进程所占据的地址空间的首地址,在很多Window API中,都要将它作为一个参数传进去,所以,应用程序一般都会将它保存在一个全局量中。
hPreInstance是应用程序前一个实例的实例句柄。这是16位Window的残留物,在Win32应用程序中,这个参数始终为NULL。所以,某些从16为移植到32位的应用程序,如果使用了hPreInstance,就应该对代码作相应的修改。
lpCmdLine是命令行参数,这同main()中的argv[]类似。
nCmdShow用来指明应用程序的主窗口的显示方式(最大化显示,最小化显示,一般化显示)。
一个实例
下面是一个显示”Hello, world”的程序的代码,它体现了一般的Window应用程序的基本流程。
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
//第一:注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_HELLOWORLD);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_HELLOWORLD;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
file://第二:创建一个该类型的窗口
HWND hWnd;
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) return FALSE;
file://一nCmdShow所指定的方式显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
file://第三:启动消息循环,将消息发送给相应的窗口函数
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
file://第四:窗口函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
char* szHello = “Hello, world!”;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
上面程序的执行过程如下:
1、注册一个窗口类
这是为后面的创建窗口作准备,在使用CreateWindwo()和CreateWindowEx()创建窗口时,都必须提供一个标识窗口类的字符串。
2、创建窗口
创建窗口类的主要意图是向操作系统提供窗口处理函数。
启动消息循环,分发并处理消息。
其中的关键部分是消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
调用GetMessage()从线程的消息队列中取出一条消息,将消息翻译后,再调用
DispatchMessage()将该消息分发至相应的窗口过程。(实际上DispatchMessage()是将该消息作为参数调用对应的窗口的窗口函数,这就是分发的实质),在后面我们会详细讨论MFC的消息环同上面的消息环的区别。
WinMain()函数
任何一个应用程序都有一个入口函数,在Window下,程序的入口函数根据应用程序的类型,有两种选择:控制台程序的入口函数是main(),一般的 Window界面程序的入口函数是WinMain()。这里只探讨同我们下面的讨论有关的WinMain()函数。下面是该函数的原型:(Visuall C++中)
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
其中:
hInstance是标识当前进程的实例,它实际上是进程所占据的地址空间的首地址,在很多Window API中,都要将它作为一个参数传进去,所以,应用程序一般都会将它保存在一个全局量中。
hPreInstance是应用程序前一个实例的实例句柄。这是16位Window的残留物,在Win32应用程序中,这个参数始终为NULL。所以,某些从16为移植到32位的应用程序,如果使用了hPreInstance,就应该对代码作相应的修改。
lpCmdLine是命令行参数,这同main()中的argv[]类似。
nCmdShow用来指明应用程序的主窗口的显示方式(最大化显示,最小化显示,一般化显示)。
一个实例
下面是一个显示”Hello, world”的程序的代码,它体现了一般的Window应用程序的基本流程。
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
//第一:注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_HELLOWORLD);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_HELLOWORLD;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
file://第二:创建一个该类型的窗口
HWND hWnd;
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) return FALSE;
file://一nCmdShow所指定的方式显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
file://第三:启动消息循环,将消息发送给相应的窗口函数
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
file://第四:窗口函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
char* szHello = “Hello, world!”;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
上面程序的执行过程如下:
1、注册一个窗口类
这是为后面的创建窗口作准备,在使用CreateWindwo()和CreateWindowEx()创建窗口时,都必须提供一个标识窗口类的字符串。
2、创建窗口
创建窗口类的主要意图是向操作系统提供窗口处理函数。
启动消息循环,分发并处理消息。
其中的关键部分是消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
调用GetMessage()从线程的消息队列中取出一条消息,将消息翻译后,再调用
DispatchMessage()将该消息分发至相应的窗口过程。(实际上DispatchMessage()是将该消息作为参数调用对应的窗口的窗口函数,这就是分发的实质),在后面我们会详细讨论MFC的消息环同上面的消息环的区别。
相关文章推荐
- MFC对话框程序基础复习004
- MFC对话框程序基础复习005
- MFC对话框程序基础复习001
- MFC对话框程序基础复习003
- MFC对话框程序基础复习005
- MFC对话框程序基础复习002
- 深入剖析MFC基础框架——跟踪MFC单文档程序的执行过程
- 再来一个复习一下,ELFhash算法和hash table
- 是时候复习一下Java基础了(一)
- MFC 让程序停一下 但不卡住的办法
- MFC学习笔记(1)——Windows程序基础
- [MFC学习之C++基础] 孙鑫视频中第三讲中提到的小测试程序(关于基类和子类的继承关系)
- VC6_基于对话框MFC程序最基础教程示例~
- MFC 让程序停一下 但不卡住的办法
- MFC复习和学习 第一章 MFC基础窗口构建 MFC应用程序启动机制 MFC
- 读书笔记,不定期更新,复习一下基础概念
- MFC基础:Windows内部程序运行原理
- java基础复习1--基本数据类型、运算符号、表达式语句与程序结构
- Windows编程基础--第5节 MFC对话框程序
- MFC窗口程序启动隐藏窗口,但是窗口闪烁一下才隐藏的处理