您的位置:首页 > 其它

《明明白白看MFC之程序框架(一)》

2004-04-05 23:14 453 查看
最近一直在学习VC,因为是自学,有许多问题都是在经过一番辛苦的查找资料才得以解决的,现在,把这些学习VC入门刚刚弄懂得问题贴出来,希望可以得到更多的指教,如果能够帮助到跟我有过同样困惑的人,那就是万幸了!

在VC中借助MFC可以方便的创建Windows应用程序,但是,要弄清楚MFC的来龙去脉还真是不容易,首先,需要知道Windows程序的基本框架,然后才有可能更深入的去了解MFC框架中的Windows程序。

一、SDK应用程序结构

使用经典的SDK编写Windows程序虽然稍显麻烦,但是其给我带来的感觉是具有如行云流水般的运行脉络,简洁明了得运行过程,让我理解起来非常容易,下面就看看一个经典的SDK编写的Windows程序的源代码:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
………………………………
MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
……………………

return TRUE;
}

//窗口函数WndProc(),回调函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
……………………
switch (message)
{
case WM_COMMAND:
………………
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
……
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

SDK之"Hello World"源程序

首先让我们看一下这个程序的结构,WinMain()是函数的入口点,该函数的主要任务是完成一些初始化的工作和维护了一个消息循环。他们的工作流程如下:入口(WinMain())---à MyRegisterClass()---->InitInstance ()-àwhile消息循环。函数由入口开始执行,之后调用 MyRegisterClass()注册窗口类,之后InitInstance ()生成并显示窗口,这样之后,就完成了一个窗口的初始化工作了(当然,在 MyRegisterClass(),InitInstance ()中都需要调用相应的API函数来具体的实现,不过我这里重点分析的是他的结构,所以不考虑他的具体实现细节),然后就是维护消息循环,可以看出,这个程序运行过程简单名了,一步一步执行下来,完全符合我们的思维。
但是,有一点是需要注意的,那就是那个消息循环的结构,在例子程序中,我让程序在窗口中输出一句"Hello World"。在主程序中已经把应用程序的框架搭建好了,而所有的控制等信息都是通过消息循环发送的窗口处理过程中进行处理的,输出信息是在接受到WM_PAINT信息时输出的。
直接使用SDK编写的Windows应用程序是如此直截了当,然而在MFC中所有的这些似乎都不复存在了,取而代之的却是一些莫名其妙得宏,那么这些宏有什么神奇,他们是怎么实现一个Windows程序的呢?(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: