发布时间 : 星期四 文章剖析MFC六大关键技术更新完毕开始阅读
virtual BOOL Run();//消息循环 };
CFrameWnd::CFrameWnd(){} CFrameWnd::~CFrameWnd(){}
int CFrameWnd::Create() //封装创建窗口代码 {
WNDCLASS wndcls; wndcls.style=0; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDC_ARROW); wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=DefWindowProc;//默认窗口过程函数。 //大家可以想象成MFC通用的窗口过程。 wndcls.lpszClassName=\窗口类名\wndcls.lpszMenuName=NULL; RegisterClass(&wndcls);
hwnd=CreateWindow(\窗口类名\窗口实例标题名
\
return 0; }
BOOL CFrameWnd::ShowWnd()//显示更新窗口 {
ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); return 0; }
///////////// CWinApp1::CWinApp1() {
m_pCurrentWinApp=this; }
CWinApp1::~CWinApp1(){}
//以下为InitInstance()函数,MFC中要为CWinApp的派生类改写, //这里为了方便理解,把它放在CWinApp类里面完成! //你只要记住真正的MFC在派生类改写此函数就行了。 BOOL CWinApp1::InitInstance() {
m_pMainWnd=new CFrameWnd; m_pMainWnd->Create();
m_pMainWnd->ShowWnd(); return 0; }
BOOL CWinApp1::Run()//////////////////////封装消息循环 { MSG msg;
while(GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg); DispatchMessage(&msg); } return 0;
} //////////////////////////////////////////////////////封装消息循环
CWinApp1 theApp; //应用程序对象(全局) int WINAPI WinMain( HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
hInstance=hinst;
CWinApp1* pApp=theApp.m_pCurrentWinApp;
//真正的MFC要写一个全局函数AfxGetApp,以获取CWinApp指针。 pApp->InitInstance(); pApp->Run(); return 0; }
代码那么长,实际上只是写了三个函数,一是CFrameWnd类的Create(),第二个是CWinApp类的 InitInstance()和Run()。在此特别要说明的是InitInstance(),真正的MFC中,那是我们跟据自己构造窗口的需要,自己改写这个函数。
大家可以看到,封装了上面两个类以后,在入口函数WinMain中就写几行代码,就可以产生一个窗口程序。在MFC中,因为 WinMain函数就是固定的那么几行代码,所以MFC绝对可以帮我们自动完成(MFC的特长就是帮我们完成有规律的代码),所以我们创造MFC应用程序的时候,看不到WinMain函数。
写到这里,MFC六大关键技术之一:MFC程序的初始化过程(模拟),就差不多写完了。回头看一下,居然写了八千多字,原本以为写完六大关键技术也不用写那么多字,现在还觉得庆幸的是不把文档、视类牵连进去,否则更不知写到何时。
还有五大关键技术没有写,我还应该写下去吗?上面写了八千多字,都是我一个字一个字地敲进去,每个例子都是自己生硬地想出来。用了十多个小时,换来的可能更多是论坛中朋友们的漫骂,讥讽!