MFC原理第一讲.MFC的本质.以及手工编写MFC的程序

PS: 这个博客属于复习知识.从头开始讲解. 在写这篇博客之前.已经写了3篇MFC的本质了.不过掌握知识点太多.所以从简重新开始.

一丶MFC的本质是什么.

  MFC的本质其实就是Win32程序的一种封装. 其实就是封装好了.我们直接用就行了.

二丶手工编写一个MFC程序.

  手工编写MFC程序.需要熟悉两个类

  一个是CWinAPP,一个是CFramWnd类.

这两个类的作用.

  CWinAPP  这个主要就是保存窗口的一些数据.跟窗口本身无关.

  CFrameWnd 这个类主要就是创建窗口. 跟窗口有关的一个类.

看下MFC的窗口继承图:

  

首先就是不管那个类.顶层的类就是CObject类.

CWinAPP的顶层类是Cobject  CFrameWnd也是.

总的来说. 这两个类一个是保存数据.一个是跟窗口有关.

总结:  

  CWinAPP  这个类就是与程序有关.与窗口无关.并且保存数据和动作的一个类.

  CFrameWnd 这个类就是与窗口有关的一个类. 管理窗口的.

三丶如何开始编写一个简单的MFC窗口类

  既然上面我们熟悉了两个类的作用. 那么还要熟悉里面的成员方法.

  CWinApp 里面的 InitInstance虚函数.  这个主要是保存窗口句柄. 显示更新窗口. 与程序有关.与窗口无关.

  CFrameWnd 里面的Create  这个其实就是创建窗口.  我们的CWinAPP里面需要创建CFramWnd 窗口类.并且保存窗口句柄. 所以CFrameWnd是管理窗口的.

编写MFC类的步骤.

  1.创建Win32工程.

  2.添加一个头文件.跟一个.cpp文件.

  3.头文件中定义字节的 CMyApp 并且继承 CWinAPP. 重写虚方法 InitInstance

  4.头文件中接着定义 自己的CMainWnd类. 继承CFrameWnd. 并且提供构造.构造里面创建窗口.

  5.CPP 文件必须包含MFC类库. afxWin.h

  6. 使用MFC 静态库的方式.

例如下图:

  

具体实现代码:

  1. .h文件的代码.

  

#pragma once

#ifndef MY_FIRST_MFC_936d35ee_d677_44be_a8ae_1ea4b1c7c086
#define MY_FIRST_MFC_936d35ee_d677_44be_a8ae_1ea4b1c7c086 class CMyApp :public CWinApp
{
//1覆盖虚函数 保存创建窗口的一些数据. 但跟窗口本身无关.
public:
virtual BOOL InitInstance();
}; //框架类
class CMainWnd : public CFrameWnd
{
//构造函数.构造create窗口 主要跟窗口有关的一个类.
public:
CMainWnd(); };
#endif // !MY_FIRST_MFC_936d35ee_d677_44be_a8ae_1ea4b1c7c086

.cpp的窗口代码.

#include <afxwin.h>
#include "FirstMfc.h" CMyApp theApp; BOOL CMyApp::InitInstance()
{
//窗口窗口保存在m_painWnd
m_pMainWnd = new CMainWnd;        创建我们的窗口保存在m_pMainWnd中. m_pMainWnd成员是专门保存窗口句柄的.这个成员在CWinThread中定义. 这个类先不用管是什么类.
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
} CMainWnd::CMainWnd()
{
//创建窗口
Create(NULL, TEXT("HelloMfc"));
}

应用程序截图:

  

四丶带着疑问学习

  疑问:

    1.不是说MFC是对Win32程序的封装吗.但我们很简单的就创建除了窗口.那么Winmain在哪里.

    2.消息处理在哪里.

以上疑问我们会慢慢讲到. 如果有兴趣.可以看看MFC源码.也可以看看我以前写过的MFC原理的博客.

代码链接: 链接:https://pan.baidu.com/s/1yS2CBfCLiUY9OJHw9NwD7Q 密码:6z6w

MFC原理第一讲.MFC的本质.以及手工编写MFC的程序的更多相关文章

  1. MFC原理第二讲.MFC的初始化过程

    MFC原理第二讲MFC的初始化过程 一丶简介 通过上一讲.我们手工模拟了一个MFC程序. 但是上一讲留下了疑问. 就是WinMain在哪.以及消息处理在哪里. 这一节主要就是讲解Winmain在哪里. ...

  2. 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)

    框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...

  3. MFC原理第六讲.消息传递

    ---恢复内容开始--- MFC原理第六讲.消息传递 一丶简介 通过上一讲我们的消息映射表.我们得知. 消息映射表 会保存父类的MessageMap 以及自己当前的消息结构体数组. 消息传递是一层一层 ...

  4. MFC原理第四讲.动态创建机制

    MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...

  5. MFC控件第一讲.DC编程

    MFC控件第一讲.DC编程 一丶简介 什么是DC,DC有什么用. DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的.  DC可以简单理解为.没一个窗口程序都有一块内存 ...

  6. MFC原理第五讲.消息映射.以及如何添加消息

    MFC原理第五讲.消息映射.以及如何添加消息 一丶消息映射是什么 我们知道.Win32程序.都是通过消息去驱动的. 不断的在处理消息. 只要我们使用固定的宏.就可以让我们的框架知道一旦消息发生.该往哪 ...

  7. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

  8. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

  9. iOS底层原理总结 - 探寻block的本质(一)

        面试题 block的原理是怎样的?本质是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMu ...

随机推荐

  1. CentOS下安装Git

    在终端输入命令:yum install git,此时会进行提示安装,输入y, 在这种安装方式下,速度很快(windows系统下下载客户端速度超慢),当出现安装完毕时,就可以了. 安装完毕后输入git ...

  2. UC浏览器input文本框输入文字回车键自动提交

    这是测试今天在jira给我提出的一个bug 下面是贴的代码 屏蔽或者禁止回车键 <!DOCTYPE html> <html> <head> <meta cha ...

  3. HTML常用的特殊符号&前端使用的标点符号

    不想在项目中使用图片, 还得切,如关闭按钮“×”.男女符号“♂♀”.对勾“√”等,找到了一篇全面的博客,转自https://www.haorooms.com/post/html_tsfh,感谢. 如下 ...

  4. intent和手势探测

    一.三种启动方法 setComponent ComponentName comp = new ComponentName( this, SecondActivity.class); Intent in ...

  5. Paper | 多任务学习的鼻祖

    目录 1. MTL的定义 2. MTL的机制 2.1. Representation Bias 2.2. Uncorrelated Tasks May Help? 3. MTL的用途 3.1. Usi ...

  6. 利用websocket实现微信二维码码扫码支付

    由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...

  7. 最近一个dish项目的建设思考

    系统通用能力的沉淀:a.核心模型的数据沉淀 b.通用服务能力的沉淀 ps1:以前重心主要放在了业务的抽象和通过设计模式来增加可复用的扩展性.局限在于,抽象的范围会被单个业务或者当前的业务所束缚,在更大 ...

  8. RabbitMQ 使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  9. springDatasolr 排序

    String sortValue = (String) searchMap.get("sort");// ASC DESC String sortField = (String) ...

  10. Spring源码追踪1——doGetBean(为什么org.springframework.data.redis.core.RedisTemplate的实例可以注入为ListOperations)

    类org.springframework.beans.factory.support.AbstractBeanFactory方法T doGetBean(final String name, final ...