1.应用程序类 CWinApp

https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cwinapp-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(AFXWIN%2FCWinApp);k(CWinApp);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019

CWinApp 类

派生出 Windows 应用程序对象的基类

2.框架类 CFrameWnd

提供 Windows 单文档界面 (SDI) 重叠式或弹出框架窗口功能,并提供管理窗口的成员。

class CFrameWnd : public CWnd

错误

>------ 已启动生成: 项目: mfc, 配置: Debug Win32 ------
>mfc.cpp
>c:\program files (x86)\microsoft visual studio\\community\vc\tools\msvc\14.14.\atlmfc\include\afx.h(): fatal error C1189: #error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
>已完成生成项目“mfc.vcxproj”的操作 - 失败。
========== 生成: 成功 个,失败 个,最新 个,跳过 个 ==========

解决:

fatal error LNK1561: 必须定义入口点”解决方法 
建立了一个空项目。
添加了一个 Hello.cpp 和 Hello.h
然后,编译的时候,报错:“fatal error LNK1561: 必须定义入口点” 网上找了许久,发现一个解决方法。
解决方案上,右键->属性->链接器->高级->入口点,设置成:WinMainCRTStartup 另一方法是:
解决方案上,右键->属性->链接器->系统->子系统,下拉框选择:窗口 (/SUBSYSTEM:WINDOWS)

1,有且只有一个全局应用程序类对象

2,在程序入口函数实现功能 InitInstance()

  A,给框架类MyFrame 对象动态分配空间(自动调用它的构造函数)

    a,框架类MyFrame 对象构造函数里创建窗口 CWnd::Create

  B,框架类对象显示窗口 CWnd::ShowWindow

  C,框架类对象更新窗口 CWnd::UpdateWindow

  D,保存框架类对象指针 CWinThread::m_pMainWnd

PostMessage 与 SendMessage

https://blog.csdn.net/xiaodan007/article/details/7681031

消息映射

https://docs.microsoft.com/zh-cn/cpp/mfc/reference/message-map-macros-mfc?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(AFXWIN%2FDECLARE_MESSAGE_MAP);k(DECLARE_MESSAGE_MAP);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019

#include "mfc.h"

// 有且只有一个全局的应用程序类对象
MyApp myApp; BOOL MyApp::InitInstance()
{
/*
1,创建框架类对象
2,显示窗口
3,更新窗口
4,保存框架类对象指针
*/
MyFrame *frame = new MyFrame; frame->ShowWindow(SW_SHOWNORMAL);// 显示窗口
frame->UpdateWindow();// 更新窗口
m_pMainWnd = frame; // 保存框架类对象指针 return true;
} // 定义消息宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP() MyFrame::MyFrame()
{
// CWnd 类的成员函数 CWnd::create
// CFrameWnd 继承于 CWnd
Create(NULL, TEXT("MFC")); // 调用以创建并初始化与关联的 Windows 框架窗口CFrameWnd对象。
} void MyFrame::OnlButtonDown(UINT, CPoint)
{
// CWnd::MessageBox
MessageBox(TEXT("鼠标左键"));
}
#pragma once

#include <afxwin.h>

//1.应用程序类 CWinApp,派生类(子类)
class MyApp : public CWinApp
{
public:
// 基类的虚函数
// 派生类只是重写
// MFC 程序入口地址
virtual BOOL InitInstance();
private:
}; //2.框架类 CFrameWnd, 派生类(子类)
class MyFrame : public CFrameWnd
{
public:
MyFrame();
// 声明消息映射宏
DECLARE_MESSAGE_MAP(); afx_msg void OnlButtonDown(UINT,CPoint);
private:
};

增加画图消息处理

#include "mfc.h"

// 有且只有一个全局的应用程序类对象
MyApp myApp; BOOL MyApp::InitInstance()
{
/*
1,创建框架类对象
2,显示窗口
3,更新窗口
4,保存框架类对象指针
*/
MyFrame *frame = new MyFrame; frame->ShowWindow(SW_SHOWNORMAL);// 显示窗口
frame->UpdateWindow();// 更新窗口
m_pMainWnd = frame; // 保存框架类对象指针 return true;
} // 定义消息宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP() MyFrame::MyFrame()
{
// CWnd 类的成员函数 CWnd::create
// CFrameWnd 继承于 CWnd
Create(NULL, TEXT("MFC")); // 调用以创建并初始化与关联的 Windows 框架窗口CFrameWnd对象。
} void MyFrame::OnlButtonDown(UINT, CPoint)
{
// CWnd::MessageBox
MessageBox(TEXT("鼠标左键"));
} void MyFrame::OnPaint()
{
CPaintDC cdc(this);
cdc.TextOutA(,,TEXT("hello world"));
}

mfc.cpp

#pragma once

#include <afxwin.h>

//1.应用程序类 CWinApp,派生类(子类)
class MyApp : public CWinApp
{
public:
// 基类的虚函数
// 派生类只是重写
// MFC 程序入口地址
virtual BOOL InitInstance();
private:
}; //2.框架类 CFrameWnd, 派生类(子类)
class MyFrame : public CFrameWnd
{
public:
MyFrame();
// 声明消息映射宏
DECLARE_MESSAGE_MAP() afx_msg void OnlButtonDown(UINT,CPoint);
afx_msg void OnPaint();
private:
};

mfc.h

(二)一个MFC程序,消息映射,纯代码的更多相关文章

  1. MFC的消息映射机制揭秘

    MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...

  2. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(05)

    1.3.4 绘制窗口 如何在屏幕上随心所欲的进行绘制?应用程序通过响应来自Windows的WM_PAINT消息进行绘制的,此消息通知它更新窗口. WM_PAINT消息如何发生:窗口位置改变:窗口大小改 ...

  3. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)

    1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...

  4. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)

    1.3.1 应用程序对象 MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口.当包含头文件<afxwin.h>, ...

  5. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(01)

    #include <afxwin.h> class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; cl ...

  6. visual2017专业版MFC编程环境搭建及第一个MFC程序的创建

    1.MFC介绍及环境搭建 MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由指向文件和源文件组成. 首先,打开vi ...

  7. MFC学习笔记(一): 不用MFC向导如何新建一个MFC程序

    使用Visual Studio新建一个空项目,项目命名为HelloMFC,完成后,打开项目属性页面,将配置属性选项卡中的常规项打开,将其中的MFC的使用属性栏改为:在静态库中使用MFC或者在共享DLL ...

  8. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(04)

    1.3.3 框架窗口对象 MFC的CWnd类及其派生类为窗口或应用程序创建的窗口提供了面向对象的接口. CMainWindow是从CFrameWnd类派生而来,CFrameWnd模仿框架窗口的行为,可 ...

  9. 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记

    切换项目结构模式 Project模式的项目结构 我们将项目切换成Project模式,这就是真实的目录结构. .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文 ...

随机推荐

  1. 洛谷 P2746 [USACO5.3]校园网Network of Schools

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  2. Selenium工具爬取商品

    selenium是一个优秀的自动化测试工具,支持多种语言,具体介绍参考官方文档:https://www.seleniumhq.org/docs/. 下面我们使用selenium工具模拟用户点击商品详情 ...

  3. Python爬虫—requests库get和post方法使用

    目录 Python爬虫-requests库get和post方法使用 1. 安装requests库 2.requests.get()方法使用 3.requests.post()方法使用-构造formda ...

  4. PB事件/函数的触发机制和触发方式

    PB作为windows下的一个非常便捷的DB开发工具,有着和windows一样的消息触发机制PB提供了相应event/function触发机制和触发方式,用户可以根据自己的实际需要选用不同方法. 1. ...

  5. 在Linux上安装和配置CSF(配置服务器安全和防火墙)

    CSF是国外一家小公司开发的linux系统免费防火墙,它基于iptables工作,能有效缓解服务器压力,具有自动屏蔽暴力破解密码IP.管理开放端口.免疫轻量DDos和CC等等功能,同时,安装和使用也极 ...

  6. 怎样在Chrome浏览器上安装 Vue Devtools 扩展程序

    第一步: 前往 GitHub 下载 Vue Devtools 项目文件 https://github.com/vuejs/vue-devtools 注意: 1. 将分支切换为 master 2. 下载 ...

  7. python之字符串类型的格式化

    python之字符串类型的格式化 要点:python字符串通过format()方法进行格式化处理.(Python语言同时支持两种字符串格式化方法,一种类似C语言中printf()函数的格式化方法,支持 ...

  8. 函数——箭头函数&自执行函数(二)

    一.箭头函数是在es6中添加的一种规范,它相当于匿名函数,简化了函数的定义. 1.语法 a.function用var,let,cost来表示: b.参数要写在第一个等号后面:   参数有多个,需要加一 ...

  9. Flutter 36: 图解自定义 View 之 Canvas (三)

    小菜继续学习 Canvas 的相关方法: drawVertices 绘制顶点 小菜上次没有整理 drawVertices 的绘制方法,这次补上:Vertice 即顶点,通过绘制多个顶点,在进行连线,多 ...

  10. 使用Eclipse开发Java应用并部署到SAP云平台SCP上去

    1. 首先根据这个链接配置好Eclipse. 确保SAP Cloud Platform Tools for Java正确安装. 确保neo SDK的路径配置正确: 我使用的是下图这个SDK:neo-j ...