zoukankan      html  css  js  c++  java
  • Hello MFC 之疯狂注释版

    回想刚刚学习MFC编程的时候,打开《MFC windows程序设计》这本书,书中给的第一段代码就是一个Hello MFC的小程序。看得我头大,书中讲解的很详细,几乎每行代码都给了解释。但解释归解释,我一行一行的琢磨这些代码,还是不知道它们是什么意思。于是我把代码一行一行的敲到了编译器里,并找着书上的讲解,给每行代码都标上了长长的、详细的注释。尽管有的注释写上去后我还是不懂,但总算完成了这个HelloMFC 之疯狂注释版。今天翻出来,贴上来纪念一下。

    可以发现,Hello MFC的代码比Hello Win32的代码少了很多。不得不说MFC确实让我们开发Win32程序更方便。MFC的魅力在于对API的封装思想。现在很多SDK开发包尤其是系统SDK,大部分都是基于C语言的类似windows API的形式。如果我们能学习MFC,把这些API以面向对象的形似封装成类库,使用起来会大大方便!面向对象就是好,MFC的亲兄弟ATL里和COM相关的智能类、STL里的迭代器的实现,都是值得我们学习的!


    #include <afxwin.h>
    
    class CMyApp:public CWinApp				//定义一个CMyApp类,用于创建程序本身,继承自CWinApp类	
    {
    	virtual BOOL InitInstance();		//声明InitInstance函数为虚函数
    };
    
    class CMyWnd:public CFrameWnd			//定义一个CMyWnd类,用于创建窗口,继承自CFrameWnd类
    {
    public:
    	CMyWnd();							//声明构造函数
    protected:
    	afx_msg void OnPaint();				//声明OnPaint函数,用于接到消息后重绘客户区
    	DECLARE_MESSAGE_MAP();				//声明消息映射
    };
    
    CMyApp myapp;										//创建一个CMyApp类的对象myapp,在全局区实例化应用程序对象,一个程序至少有一个应用程序对象
    
    BOOL CMyApp::InitInstance()							//定义InitInstance函数,用于创建并显示窗口
    {
    	m_pMainWnd=new CMyWnd;							//创建一个CMyWnd对象并把地址赋给CMyApp类的成员指针变量m_pMainWnd
    	m_pMainWnd->ShowWindow(m_nCmdShow);				//通过该成员指针调用ShowWindow函数来显示它,参数为WinMain函数穿过来的参数,决定窗口初始为最小化、最大化或正常化
    	m_pMainWnd->UpdateWindow();						//刷新窗口,同win32程序设计
    	return true;									//初始化程序窗口正常,返回true使程序继续进行如果返回false则程序立即退出
    }													//一下三个函数为标识消息的宏
    BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)					//开始消息映射,第一个参数为消息映射所属的类,第二个参数为该类的基类,有了基类名,MFC框架可以再必要时查找基类的消息映射
    ON_WM_PAINT()										//接收处理WM_PAINT类型的消息,该消息在拖动窗口边框,改变窗口大小,移动窗口等行为时触发
    END_MESSAGE_MAP()									//结束消息映射
    
    CMyWnd::CMyWnd()									//定义CMyWnd类的构造函数
    {
    	Create(NULL,_T("The Hello Application"));		//创建CMyWnd类对象时执行该构造函数,第一个参数指定了窗口基于WNDCLASS类的名称,这里将其设定为NULL将创建一个基于由主结构注册的WNDCLASS类的默认框架窗口,第二个参数为在窗口标题栏出现的文本
    }
    
    void CMyWnd::OnPaint()								//定义CMyWnd类的OnPaint函数,用于重绘客户区
    {
    	CPaintDC dc (this);								//构造一个名为dc的CPaintDC对象,即设备环境对象,所有的图形输出都通过该类的对象来执行
    	CRect rect;										//构造一个代表矩形的CRect对象rect
    	GetClientRect(&rect);							//调用winAPI函数GetClientRect以使用窗口的客户区坐标来初始化rect这个矩形
    	dc.DrawText(_T("Hello,MFC!"),-1,&rect,			//调用CDC类的DrawText函数来在客户区中间显示"Hello,MFC!"字符串,第一个参数为要显示的字符串,第二个参数为要显示的字符串中的字符数,这里是-1意味着不限定,该字符串是以NULL字符终止的。第三个参数为刚刚新建的CRect类的对象rect的地址,这里也可以是一个指定格式矩形的一个RECT结构
    		DT_SINGLELINE|DT_CENTER|DT_VCENTER);		//第四个参数为输出选项,DT_SINGLELINE代表单行文本,DT_CENTER和DT_VCENTER代表在格式矩形中水平居中和垂直居中
    }


  • 相关阅读:
    python2将str类型与unicode类型字符串写入文件的编码问题
    正则表达式匹配邮箱
    python读取excel表格
    python正则匹配re.search与re.findall的区别
    python使用join提取列表类型中的数字字符串
    判断一个python字符串中是否包含中文字符
    wordstation中虚拟机关机hang住,无法正常关机
    网络中涉及到优先级的主设备会被抢占与非抢占。
    [转]一天一点学习Linux之Inode详解
    [转]理解Linux文件系统之inode(非ext格式)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3111383.html
Copyright © 2011-2022 走看看