`
swimmer2000
  • 浏览: 37997 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

《深入浅出MFC》中关于程序生死的笔记

阅读更多

要能够轻松掌握MFC(希望它还没有过时)并不是件容易的事,这方面候捷的《深入浅出MFC》是本不错的书。但这书对读者也有一定的要求,既要熟悉C+SDK方式写程序,又要对C++继承和多态特性有所了解。为了能够更好的引导读者阅读,候捷先生在书中特别开辟了第一章和第二章来做基础知识的介绍。通过阅读它,我们也能很快地记住Win32程序的特点:

1. 程序进入点为WinMain函数
2. 要注册窗口类和产生窗口
3. 要有消息循环
4. 要有窗口过程函数(WndProc)

这四点用代码来表示,就会是下面这个样子:

// 1. 程序进入点为WinMain函数,相当于c中main函数
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,
LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

// 2. 要注册窗口类
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

// 2. 要产生窗口
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

// 3. 要有消息循环,通过while实现
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

// 4. 要有窗口过程函数(WndProc)
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

而在《深入浅出MFC》第一章中,候捷用InitApplication和InitInstance这两个函数把注册窗口类和创建窗口的代码再次进行了包装,代码如下:

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

// 2. 要注册窗口类
return RegisterClass (&wndclass);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
if (!hwnd)
return FALSE;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
return TRUE;
}

使用包装后的函数,入口函数WinMain就可以简化成下面这个样子:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,
LPSTR lpCmdLine,int nCmdShow)
{
if (!InitApplication(hInst))
return FALSE;

if (!InitInstance(hInst, nCmdShow))
return FALSE;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

候捷为什么要多次一举,用InitApplication和InitInstance把这些代码行包装起来呢?原因是MFC就是这么做的。那MFC为什么要这样做?那是因为InitApplication里的代码(注册窗口类)一个应用程序(application)实例只需要执行一次,而InitInstance中的代码则属于窗口的范畴(见第六章)。

而且书中还有这样的一段话,

“几乎可以说CWinApp用来取代WinMain在SDK程序中的地位。这并不是说MFC程序没有WinMain(稍后我会解释),而是说传统上SDK程序的WinMain所完成的工作现在由WinApp的三个函数完成:
virtual BOOL InitApplication();
virtual BOOL InitInstance();
virtual int Run();
WinMain知识扮演役使它们的角色。”

这样一来,MFC程序中WinMain的内容大概可以用以下的伪代码来表示:

int WINAPI WinMain(...)
{
// Call WinApp::InitApplication() 2. 注册窗口类
// Call WinApp::InitInstance(); 2. 创建窗口
// Call WinApp::Run(); 3. 消息循环
}

确实够简单,但是文章开头提到的第4点,窗口过程(WndProc)哪里去了?答案在CFrameWnd这样的窗口类中找。


:以上理解与MFC实际的行为有出入,但对于理解MFC程序的运行有些帮助。更多的信息请阅读《深入浅出MFC》第六章。

分享到:
评论

相关推荐

    深入浅出MFC读书笔记3

    深入浅出MFC读书笔记3 在MFC中,Document-View架构是一个非常重要的概念。本文将对Document-View架构中的关键组件进行深入探讨,并对其实现思路进行详细的解析。 首先,让我们来看一下Document的概念。在MFC中,...

    《深入浅出MFC》高清第二版(书签)_深入浅出MFC_c++mfc_

    3. **MFC扩展篇**:这一部分深入探讨了MFC中的一些高级主题,如ActiveX控件、数据库访问(ODBC和DAO)、网络编程、打印与打印预览等。这些技术让开发者能够构建功能强大的企业级应用程序。 4. **实践篇**:通过实际...

    《深入浅出MFC》读书心得

    《深入浅出MFC》读书心得是 Windows 程序设计的经典读物,本文将对书中的一些重要知识点进行总结和解释。 首先,Windows 程序可以分为两个部分:程序代码和 UI(User Interface)资源。程序代码使用 C++编译器,而...

    深入浅出MFC 深入浅出MFC 深入浅出MFC

    《深入浅出MFC》是一本专注于Microsoft Foundation Classes (MFC) 的技术书籍,MFC是微软为Windows应用程序开发提供的一套C++类库。它将Windows API进行了封装,使得开发者能够更方便地构建Windows桌面应用程序。MFC...

    深入浅出MFC读书笔记2

    深入浅出MFC读书笔记2是对MFC框架的进一步学习和理解,主要涵盖了MFC的基础概念、类库结构以及程序构建的关键要素。MFC(Microsoft Foundation Classes)是微软为Windows平台开发的应用程序提供的一种类库,它基于...

    Windows程序设计(第五版pdf代码)深入浅出MFC

    Windows程序设计(第五版pdf代码)深入浅出MFC,包含了3部分内容,分别是windows程序设计第五版pdf中文高清,和代码,深入浅出MFCpdf中文,比较全面的学习windos开发的全部资料了,免费分享!和别人十一分没多大差别

    深入浅出.MFC

    《深入浅出MFC》是一本专为C++程序员深入理解Microsoft Foundation Classes (MFC)框架而编写的经典书籍。MFC是微软公司为Windows平台开发应用程序提供的一种强大的类库,它基于C++,极大地简化了Windows API的使用,...

    深入浅出MFC--侯捷 深入浅出MFC--侯捷 深入浅出MFC--侯捷

    《深入浅出MFC》是侯捷先生撰写的一本关于Microsoft Foundation Classes (MFC) 的经典著作。MFC是微软公司开发的一个C++类库,它封装了Windows API,为开发者提供了一种更加面向对象的方式来编写Windows应用程序。...

    MFC 深入浅出 + 学习笔记

    总的来说,"深入浅出MFC"的学习资源可以帮助开发者从基础到高级全面了解MFC,通过实例和笔记加深理解,从而更高效地开发Windows应用程序。无论是初学者还是有一定经验的程序员,都能从中受益,提升自己的MFC编程能力...

    深入浅出MFC简体中文版(附源码

    《深入浅出MFC简体中文版》是一本专注于Microsoft Foundation Classes (MFC) 的技术专著,旨在帮助读者深入理解和应用这一强大的Windows应用程序开发框架。MFC是微软为C++开发者提供的一种库,它封装了Windows API,...

    深入浅出MFC(侯捷老师的作品)

    《深入浅出MFC》是侯捷老师撰写的一本经典著作,主要针对Microsoft Foundation Classes (MFC) 这一强大的Windows应用程序开发框架进行深入解析。MFC是微软为C++开发者提供的一套类库,它封装了Windows API,使得...

    深入浅出MFC实例程序

    本教程“深入浅出MFC实例程序”旨在通过一系列实际案例,帮助你深入理解和掌握MFC的核心概念与应用。 1. MFC基本架构 MFC的架构基于事件驱动模型,主要由框架类、文档/视图结构、控件类和应用程序类等组成。框架类...

    深入浅出MFC(PDF)

    《深入浅出MFC》是一本专为程序员设计的详细指南,主要讲解Microsoft Foundation Classes (MFC) 库的使用和开发技术。MFC是微软公司提供的一个C++类库,它封装了Windows API,使得开发者能用面向对象的方式来编写...

    深入浅出MFC(windows编程,MFC程序设计)

    在探讨《深入浅出MFC:Windows编程,MFC程序设计》这一主题时,我们首先需要了解MFC(Microsoft Foundation Classes)的基本概念及其在Windows编程中的应用。MFC是微软提供的一套C++类库,用于简化Windows应用程序的...

    深入浅出MFC学习笔记

    ### 深入浅出MFC学习笔记:关键知识点解析 #### 一、Windows消息机制与回调函数 在深入探讨MFC之前,我们先来理解Windows操作系统中的消息机制及其核心组成部分——回调函数。 ##### 1.1 Windows消息机制概述 ...

    深入浅出MFC

    ### 深入浅出MFC —— 侯俊杰详解MFC技术 #### MFC简介与重要性 Microsoft Foundation Classes (MFC) 是一套由微软开发的C++类库,用于简化Windows应用程序的开发过程。它基于Windows API,通过面向对象的方法封装...

    《深入浅出MFC》中文第2版

    《深入浅出MFC》中文第2版是一本专注于Windows应用程序开发的专业书籍,特别是针对Microsoft Foundation Classes (MFC) 库的深入解析。MFC 是微软提供的一套面向对象的类库,它使得开发者能够利用C++语言进行Windows...

Global site tag (gtag.js) - Google Analytics