MFC——简单示例演示及通过MFC向导创建MFC项目

简介: MFC——简单示例演示及通过MFC向导创建MFC项目

文章目录

创建空项目简单实现Windows下应用程序界面

部分概念

示例实现

帮助文档的使用(备注)

Windows字符集

通过MFC向导创建MFC项目

通过VS MFC向导创建MFC项目流程

文档/视图结构体系

消息处理的添加

MFC框架中一些重要的函数


创建空项目简单实现Windows下应用程序界面

部分概念

因为MFC是由C++编写的,编写MFC程序需要包含#include <afxwin.h>头文件。并且在mfc中需要包含以下几个重要内容。

20200406162003685.png

  • 配置环境

20200406162026473.png

20200406162032615.png

  • 程序执行流程:
  • ① 程序开始时,先实例化应用程序对象(有且只有一个)
  • ② 执行程序的入口函数InitInstance()
  • ③ 给框架类MyFrame对象动态分配空间(自动调用它的构造函数),在其构造函数内部,通过CWnd::Create创建窗口
  • ④ 框架类对象显示窗口CWnd::ShowWindow
  • ⑤ 框架类对象更新窗口CWnd::UpdateWindow
  • ⑥ 保存框架类对象指针CWinThread::m_pMainWnd

示例实现

  • 创建空项目,添加.h头文件及.cpp源文件。

2020040616172056.png

  • 在.h头文件和.cpp源文件中添加如下代码。

mfc.h

#pragma once
#include <afxwin.h>//MFC需要包含的头文件
class MyApp : public CWinApp
{
public:
  //程序入口
  virtual BOOL InitInstance();
};
//窗口框架类
class MyFrame : public CFrameWnd
{
public:
  MyFrame();//窗口构造函数
  //使用消息映射声明宏
  DECLARE_MESSAGE_MAP();
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//鼠标左键按下的处理
  afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);//键盘声明
  afx_msg void OnPaint();//绘图声明
};


mfc.cpp

#include "mfc.h"
MyApp app;//应用程序的对象,有且仅有一个
BOOL MyApp::InitInstance()
{
  //创建窗口
  //MyFrame* frame = new MyFrame;
  m_pMainWnd = new MyFrame;
  //更新显示
  m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
  m_pMainWnd->UpdateWindow();
  //m_pMainWnd = frame;//保存指向应用程序的主窗口的指针
  return TRUE;//返回正常的初始化
}
//消息映射分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()//鼠标左键按下宏
ON_WM_CHAR()//键盘按下消息处理宏
ON_WM_PAINT()//绘图映射入口宏
END_MESSAGE_MAP()
//窗口框架的默认构造函数
MyFrame::MyFrame()
{
  Create(NULL, TEXT("MFC WINDOW"));
}
//鼠标左键按下的实现
void MyFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
  //TCHAR buf[1024];
  //wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);
  //MessageBox(buf);
  //MFC使用字符串
  CString str;
  //格式化字符串
  str.Format(TEXT(":::: x = %d, y = %d"), point.x, point.y);
  MessageBox(str);
}
//键盘事件处理实现
void MyFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  TCHAR buf[1024];
  wsprintf(buf, TEXT("按下了 %c "), nChar);
  MessageBox(buf);
}
//绘图事件实现
void MyFrame::OnPaint()
{
  CPaintDC dc(this);//画到当前窗口
  //画文字
  dc.TextOutW(100, 100, TEXT("hello world!"));
  dc.Ellipse(10, 10, 100, 100);
}


帮助文档的使用(备注)

  • MSDN的使用

20200406162320722.png20200406162325325.png20200406162334215.png

  • 2020040616233856.png
  • MFC类库中文手册使用

通过此手册查找,必须加上成员所属的类作用域(类名:: ),否则,无法查找到匹配的关键字。

20200406162409755.png

20200406162416334.png

Windows字符集

通过设置visual studio项目属性下的字符集可以设置该项目使用的字符集类型,有Unicode和多字节字符集。

2020040616252993.png20200406162533710.png


  • 多字节字符集(8位的ANSI字符集)

在Windows98以及以前的版本使用8位ANSI字符集,它类似于我们程序员熟悉的ASCII字符集。

char sz[] = "ABCDEFG";
char *psz = "ABCDEFG";
int len = strlen(sz);


  • 宽字符集(16位的Unicode字符集)

在WindowsNT和Windows2000后开始使用16位的Unicode字符集,它是ANSI字符集的一个超集。Unicode适用于国际市场销售的应用程序,因为它包含各种各样来自非U.S.字母表的字符,比如中文,日文,韩文,西欧语言等。

//在字符串前加字母L表示将ANSI字符集转换成Unicode字符集。
wchar_t wsz[] = L"ABCDEFG"; 
wchar_t *pwsz = L"ABCDEFG";
int len = wcslen(wsz); //测试宽字节字符串的长度


  • TEXT(_T)宏

MFC中的TEXT宏可以自动适应字符类型,如果定义了预处理器程序符号_UNICODE,那么编译器将使用Unicode字符,如果没用定义该预处理器程序符号,那么编译器将使用ANSI字符。

MessageBox(TEXT("鼠标左键"));
MessageBox(_T("鼠标左键"));


  • TCHAR类型

如果定义了_UNICODE符号TCHAR将变为wchar_t类型。如果没用定义_UNICODE符号,TCHAR将变为普通古老的char类型。

通过MFC向导创建MFC项目

通过VS MFC向导创建MFC项目流程

  • 在VS中选择“文件” – “新建” – “项目”:

20200406162746442.png

  • 选择 MFC – MFC应用程序,接下来我们创建一个单文档MFC标准类型应用程序。

20200406162757734.png

  • 一路按默认值next,到最后一个页面:

2020040616281575.png

  • MFC自动为我们生成了四个类,它们的继承关系如下:

20200406162831690.png

  • 查看类视图

点击视图->类视图,可以看到如下的类视图结构

20200406162919633.png20200406162928739.png

文档/视图结构体系

MFC应用程序框架结构的基石是文档/视图体系结构,它定义了一种程序结构,这种结构依靠文档对象保存应用程序的数据,并依靠视图对象控制视图中显示的数据,把数据本身与它的显示分离开。


数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成。 MFC在类CDocument和CView中为稳定视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument和CView合作,把所有的片段连在了一起。


CView类也派生于CWnd类,框架窗口是视图窗口的一个父窗口。主框架窗口(CFrameWnd)是整个应用程序外框所包括的部分,即图中粗框以内的内容,而视类窗口只是主框架中空白的地方。

20200406163118557.png

消息处理的添加

在主框架类中添加WM_LBUTTONDOWN消息的响应函数,具体操作如下:

20200406163144371.png

从类视图中找到CMainFrame(继承自CFrameWnd),选择此类然后从属性面板中找到消息按钮 ,在消息列表中找到WM_LBUTTONDOWN消息,添加。


添加时间响应后工程文件改变


  • 在框架类头文件中添加了鼠标左键消息函数的函数声明

20200406163307156.png

  • 在框架类cpp文件中添加了消息映射宏

20200406163322924.png

  • 在框架列cpp文件中添加了处理鼠标左键消息的函数定义

20200406163334441.png

通过以上操作后,编译执行程序发现程序并没有响应并弹出消息框。这是因为框架窗口是视窗口的父窗口,那么视类窗口就应该始终覆盖在框架类窗口之上。就好比框架窗口是一面墙,视类窗口就是墙纸,它始终挡在这面墙前边。也就是说,所有操作,包括鼠标单击、鼠标移动等操作都只能有视类窗口捕获。所以我们将鼠标响应事件添加到cmainFrame类下是得不到响应的,我们应该添加到view视类对象下,重复刚刚的消息事件添加操作。


MFC框架中一些重要的函数

  • InitInstance函数

应用程序类的一个虚函数,MFC应用程序的入口。


20200406163652930.png

  • PreCreateWindow函数

当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。

通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口的外观。

最后再调用CreateWindowEx函数完成窗口的创建。


20200406164100666.png

  • OnCreate函数

OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。

OnCreate与Create的区别:


  • Create()负责注册并产生窗口,像动态创建控件中的Create()一样,窗口创建之后会向操作系统发送WM_CREATE消息。
  • OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等。
  • OnCreate()是消息WM_CREATE的消息响应函数。
  • OnDraw和OnPaint:

当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数。OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。

通常我们不必编写OnPaint处理函数。当在View类里添加了消息处理OnPaint()时,OnPaint()就会覆盖掉OnDraw()。

OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。


  • OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。
  • OnDraw()是CView的成员函数,没有响应消息的功能。


20200406164346257.png

  • 注意:
  • MFC中后缀名为Ex的函数都是扩展函数。
  • 在MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。


相关文章
20 MFC - 案例总结(下)
20 MFC - 案例总结(下)
69 0
|
存储 C++
07 MFC - 用向导生成一个MFC应用程序
07 MFC - 用向导生成一个MFC应用程序
69 0
|
C++ Windows
09 MFC - 创建基于对话框的 MFC 应用程序框架
09 MFC - 创建基于对话框的 MFC 应用程序框架
93 0
|
数据安全/隐私保护 C++
20 MFC - 案例总结(中)
20 MFC - 案例总结(中)
92 0
|
6月前
MFC编写DLL窗口功能代码
MFC编写DLL窗口功能代码
31 0
|
6月前
|
存储 API Windows
新建MFC桌面应用程序
新建MFC桌面应用程序
24 0
|
存储 API 区块链
20 MFC - 案例总结(上)
20 MFC - 案例总结
139 0
02 QT - 创建QT项目(向导的方式)
02 QT - 创建QT项目(向导的方式)
92 0
|
测试技术 BI 区块链
MFC——对话框的创建及使用(上)
MFC——对话框的创建及使用
1249 0
MFC——对话框的创建及使用(上)
|
数据安全/隐私保护
MFC——对话框的创建及使用(下)
MFC——对话框的创建及使用
277 0
MFC——对话框的创建及使用(下)