MFC Windows程序设计(第二版)第一章笔记

第一章 Hello MFC


      我们大家都知道每一个Windows程序都以一个WinMain()开始,MFC的当然不例外。但在MFC中,它被隐藏了起来。MFC定义了一个全局应用程序对象(姑且称其为theApp),而每一个全局对象都是在主程序进入点(EntryPoint)之前由启动代码构造完成的。换句话说,程序在进入WinMain()之前,内存中将有了一个theApp对象。这样,theApp的成员函数就可以为我们所用了。也就是这时,Winmain()出场了...   
    WinMain()首先调用theApp(就是应用程序类)的成员函数InitInstance()虚函数(要覆盖),构造主窗体,并显示更新,之后再调用Run()(一般不要覆盖),就进入消息循环。   
    在SDK程序设计时,消息总是以调用一个窗口的窗口过程(WndProc())来表明自己的存在。同时与此调用相伴随的通常是四个参数:消息所指窗口句柄、一个消息ID和两个名为wParam和lParam的32位参数。后两个参数值依消息不同而异。而在MFC中,消息映射取代了窗口过程作为消息与其处理之间的通讯接口。
    从CCmdTarget派生的任何类都可以包含消息映射。消息映射是一个将消息与其处理函数(作为类的成员函数)相互关联的表。它是MFC避免使用冗长的虚函数表(VTable)的一种方式(试想,如果每一个进入内存中的类有一个虚函数表,则每一个类对象实例就都要有一个指针VPointer(4字节)指向那个表,这个内存消耗是没法估量,也是多余的)。MFC用三个宏就解决了问题。
    因此,将一个消息映射添加到一个类中,要做三项工作:
    1)通过将DECLARE_MESSAGE_MAP语句添加到类声明中,声明消息映射;
    2)通过放置标示消息映射起止的宏执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间消息和其处理函数;
    3)添加成员函数定义处理消息。
    关于消息映射工作机制的情况,有兴趣的网友可以参考《深入浅出MFC》,那里讲的很详细。
    这本书也提供了自建Windows程序的方法,在New-Project中选Win32 Application,再在接下来的窗口中选A Empty Project。进入主环境之后,再用Project-Add To Project添加文件即可。编译之前,记着把编译选项改为Use MFC In A Shared DLL。当然,为了包含进去我们的MFC,在头文件中加上#include<Afxwin.h>

一些知识点:
1)匈牙利标记法:在每个变量名之前,用一个或多个小写字母标识变量类型。同时成员变量以m_开头。如m_strWndClass,m_表示这是个类数据成员,str表示这是类型为CString类的变量。常用类型前缀:b-BOOL,h-Handle,n-Int,l-long Int等。
2)文档/视图结构:使数据和数据的表现相分离,以简化程序设计的一种程序结构,后有章节详述。
3)CObject:大多数MFC类从CObject中直接或间接派生,它为其派生类提供了三个重要特性:序列化支持;运行期类型信息;诊断与调试支持。
4)Afx函数:Afx是Application Framework的简写,以Afx开头的函数都是全局函数,可以在任一个类实现中调用。典型的如AfxMessageBox()、AfxGetApp()等。
5)_T宏:用来将字符串常量字符设置为“中性”。这样不管是ANSI字符集还是Unicode,字符串都将与系统无关。关于_T的详细信息,作者建议阅读Jeffrey Richter的《Advanced Windows》或MSDN。

//---------------------------------------上面是转载,下面是自己的总结---------------------------------------------

①、WM_QUIT消息通知应用程序该结束了。其中,应用程序不能处理的消息,被传递给了DefWindowProc的API函数,该函数对未被处理的消息提供默认响应。

②、一旦头文件中包含了Afxwin.h,就可以将CWinApp以及其它的MFC类引入到应用程序中。所以本例的代码里面,就包含了#include<Afxwin.h>

③、InitInstance是用来执行程序每次开始时都需要进行的初始化工作的好地方。

④、注意,同理m_hWnd是CWnd类的成员函数一样。m_pMainWnd是CWinThread类的成员函数,m_nCmdShow是CWinApp类的成员函数。可以依据匈牙利命名法来思考。

⑤、指定窗口样式的另一个可用方法是覆盖从CWnd继承来的PreCreateWindow虚函数,修改传递给PreCreateWindow的CREATESTRUCT结构的style字段

//--------------------------------------------------------第一章的程序,很重要------------------------------------------------------------

第一步,创建一个Win32 Project,选择空工程,然后右键这个工程,给其加入一个空的头文件hello.h和空的源文件hello.cpp

第二步,头文件中写下两个类,其一是继承于CWinApp的类,其中一个函数写 virtual的InitInstance函数,为了初始化我们的窗体;其二是继承于CFrameWnd类(也可以是CWnd类),其中我们写下它的构造函数,为了创建窗体,以及写一个afx_msg void OnPaint()来进行消息映射,当然消息映射的最后不能忘记用 DECLARE_MESSAGE_MAP ()结尾,注意,无分号。

具体代码如下:

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance ();
};

class CMyWindow : public CFrameWnd
{
public:
    CMyWindow ();

protected:
    afx_msg void OnPaint ();
    DECLARE_MESSAGE_MAP ()
};

第三步,在hello.cpp中,分别对.h 中的函数进行实现。

#include<Afxwin.h>
#include"hello.h"

CMyApp myApp;   //注意要有一个全局的 App

BOOL CMyApp::InitInstance()
{
	m_pMainWnd=new CMyWindow;    //初始化窗体
	m_pMainWnd->ShowWindow(m_nCmdShow);
	m_pMainWnd->UpdateWindow();
	return TRUE;
}

BEGIN_MESSAGE_MAP(CMyWindow,CFrameWnd)    //注意这里,给出消息映射
	ON_WM_PAINT()
END_MESSAGE_MAP()

CMyWindow::CMyWindow()
{
	Create(NULL,_T("Hello MFC"));    //这里的创建没有用CreateWindow函数,Create其它的参数都有默认值
}

void CMyWindow::OnPaint()
{
	CPaintDC dc(this);  //注意CPaintDC这个设备描述表只在
	CRect rect;
	GetClientRect(&rect);

	dc.DrawText(_T("这是我自己写的MFC"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}


MFC Windows程序设计第二版是一本关于使用MFC框架进行Windows程序开发的图书,它由谭浩强编著。MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows平台的程序设计胶水代码库。本书通过详细介绍MFC的相关知识和实际案例,帮助读者快速掌握使用MFC进行Windows程序设计的技能。 本书的内容包括开发环境的搭建、MFC的基本概念和使用方法、控件的使用、窗口和对话框的设计、图形界面的设计等等。通过逐步实践和案例分析,读者可以了解如何创建一个基于MFCWindows应用程序,并且学会利用MFC框架提供的功能和控件来实现各种功能和交互效果。 此外,本书还介绍了一些高级主题,如多线程编程、数据库访问和网络编程等。这些内容可以帮助开发者进一步提升自己的编程水平,并且在实际开发中更灵活地应用MFC框架。 《MFC Windows程序设计第二版的优点在于结合了理论和实践,清晰地讲解了MFC框架的原理和使用方法,并通过实例帮助读者理解和掌握各种技术。此外,本书还提供了源代码和示例程序,供读者参考和练习。 总的来说,如果你对MFC框架和Windows程序开发感兴趣,或者希望进一步提升自己的技能,那么《MFC Windows程序设计第二版将是一本值得阅读的书籍。它具有全面的内容和实用的案例,对于初学者和有一定经验的开发人员都是一本不错的参考书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值