鱼C论坛

 找回密码
 立即注册
查看: 1560|回复: 0

[学习笔记] MFC-003第一个MFC应用程序

[复制链接]
发表于 2018-8-18 21:17:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-11-13 13:26 编辑

1、MFC简介
        微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
        MFC把Windows SDK API函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。
2、第一个MFC应用程序
1. #include <afxwin.h>
2.png

1> afx.h和afxwin.h
        afx.h里面定义都是CObject及其派生类,以及文件类、时间类、异常类、字符串类等,都是与窗口无关的类。
        afxwin.h里面包括Cwnd、CWinApp以及各种控件类,显然都是与窗口有关的类。
2> afxwin.h 与stdafx.h
        1) stdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展)。
        2) Windows和MFC的标准头文件都非常大,即使快速的处理程序,编译程序也要花费相当长的时间来完成工作,如果该头文件被被多个.cpp包含,编译过程将及其耗时,为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作。
        3) => AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFC头文件。且这一文件可以随选择的内容而变化;
        4) => AppWizard根据stdafx.h,然后就建立stdafx.cpp。
        5) => VisualC++编译stdafx.cpp文件,生成stdafx.pch文件(pch表示预编译头文件)。
        6) => VisualC++编译随后的每个.cpp文件时,它会查看生成的.pch文件,如果有将不再编译对应的头文件。
3> 遵守的规则:
        ◎编写的.cpp文件都需要首先包含stdafx.h。
        ◎工程文件里大多数.cpp文件需要的.h文件,可以加在stdafx.h后部,进行预编译stdafx.cpp。
        ◎.pch文件具有大量的符号信息,它是工程文件里最大的文件。
2.程序执行流程
        ① 程序开始时,先实例化应用程序对象(有且只有一个);
        ② 执行程序的入口应用程序对象的成员函数InitInstance();
        ③ 给框架类MyFrame对象动态分配空间(自动调用它的构造函数),在其构造函数内部,通过CWnd::Create创建窗口;
        ④ 框架类对象显示窗口CWnd::ShowWindow;
        ⑤ 框架类对象更新窗口CWnd::UpdateWindow;
        ⑥ 保存框架类对象指针CWinThread::m_pMainWnd。
3. 代码分析
1> 框架窗口类: CFrameWnd
        CFrameWnd是从CWnd(窗口基类)派生出来的。CFrameWnd模仿框架窗口行为,我们可以把框架窗口作为顶层窗口看待,它是应用程序与外部世界的主要接口。
2> 应用程序类: CWinApp
        MFC应用程序的核心就是基于CWinApp类的应用程序对象。CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。
        一个MFC程序可以有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化。
3> 入口函数: InitInstance
        InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,如果初始化正常,返回TRUE以便允许程序继续进行。此函数是MFC应用程序的入口。
3> 成员变量: m_pMainWnd
        在CWinApp中有一个名为CWinThread::m_pMainWnd的成员变量。 该变量是一个CWnd类型的指针,它保存了应用程序框架窗口对象的指针。也就是说,是指向CFramWnd对象(框架窗口类对象)的指针。
注意: 配置页修改配置==> 常规-->MFC的使用-->在共享DLL中使用MFC
3.png

4、消息映射
        消息映射是一个将消息和成员函数相互关联的表,类似于Qt中的信号槽。比如,框架窗口接收到一个鼠标左击消息,MFC将搜索该窗口的消息映射,如果存在一个处理WM_LBUTTONDOWN消息的处理程序,然后就调用OnLButtonDown。
将消息映射添加到一个类中所做的全部工作:
        1) 所操作类中,声明消息映射宏。
        2) 通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。
123.png

        3) 对应消息处理函数分别在类中声明,类外定义:
456.png

5、字符集
查看项目使用的字符集:
1.png
多字节字符集(8位的ANSI字符集)
        在Windows98以及以前的版本使用8位ANSI字符集,类似于我们程序员熟悉的ASCII字符集。
宽字符集(16位的Unicode字符集)
        在WindowsNT和Windows2000后开始使用16位的Unicode字符集,它是ANSI字符集的一个超集。Unicode适用于国际市场销售的应用程序,因为它包含各种各样来自非U.S.字母表的字符,比如中文,日文,韩文,西欧语言等。
TEXT(_T)宏
        自适应将字符转换为项目使用的字符集。
        MFC中的TEXT宏可以自动适应字符类型,如果定义了预处理器程序符号_UNICODE,那么编译器将使用Unicode字符,如果没用定义该预处理器程序符号,那么编译器将使用ANSI字符。
TCHAR类型
        如果定义了_UNICODE符号TCHAR将变为wchar_t类型。如果没用定义_UNICODE符号,TCHAR将变为普通古老的char类型。
3、完整代码
mfc.h
  1. #include <afxwin.h>   // mfc头文件

  2. class MyApp:public CWinApp   // CWinApp 应用程序类
  3. {
  4. public:
  5.         // 程序入口
  6.         virtual BOOL InitInstance();

  7. };


  8. class MyFrame :public CFrameWnd  // 窗口框架类
  9. {
  10. public:
  11.         MyFrame();

  12.         // 声明宏(消息映射)
  13.         DECLARE_MESSAGE_MAP();

  14.         // 鼠标左键按下 函数原型
  15.         afx_msg void OnLButtonDown(UINT, CPoint);
  16.         // 键盘按下 函数原型
  17.         afx_msg void OnChar(UINT, UINT, UINT);
  18.         // 绘图 函数原型
  19.         afx_msg void OnPaint();
  20. };
复制代码

mfc.cpp
  1. #include "mfc.h"

  2. MyApp app;  // 全局应用程序对象,有且仅有一个

  3. BOOL MyApp::InitInstance()
  4. {
  5.         //创建窗口
  6.         MyFrame * frame = new MyFrame;

  7.         //显示和更新
  8.         frame->ShowWindow(SW_SHOWNORMAL);
  9.         frame->UpdateWindow();

  10.         m_pMainWnd = frame;  // CWinThread类成员  保存指向应用程序主窗口的指针

  11.         return TRUE;  // 返回正常初始化
  12. }

  13. // 分界宏(消息映射) ==>  
  14. BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
  15.         ON_WM_LBUTTONDOWN()    // 鼠标左键按下
  16.         ON_WM_CHAR()           // 键盘
  17.         ON_WM_PAINT()          // 绘图
  18. END_MESSAGE_MAP()


  19. MyFrame::MyFrame()
  20. {
  21.         Create(NULL, TEXT("mfc"));  //创建窗口,标题为mfc
  22. }

  23. void MyFrame::OnLButtonDown(UINT, CPoint point)
  24. {
  25.         /*  方式1
  26.         TCHAR buf[1024];
  27.         wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);
  28.         MessageBox(buf);
  29.         */

  30.         // 方式2
  31.         CString str;
  32.         str.Format(TEXT("x = %d, y = %d"), point.x, point.y);
  33.         MessageBox(str);
  34. }

  35. void MyFrame::OnChar(UINT key, UINT, UINT)
  36. {
  37.         CString str;
  38.         str.Format(TEXT("您按下了%c键。"), key);
  39.         MessageBox(str);
  40. }

  41. void MyFrame::OnPaint()
  42. {
  43.         CPaintDC dc(this);   // this为指定的绘图设备

  44.         // 到CDC类里找其他能画的图形
  45.         dc.TextOutW(100, 100, TEXT("为了部落"));   // 绘文字   
  46.         dc.Ellipse(10, 10, 200, 100);     // 绘椭圆

  47.         MessageBox(L"aaass");  // 当前系统使用Unicode编码,需要使用宽字节编码

  48.         // 统计字符串的长度
  49.         int num1 = 0;
  50.         char *p = "abcdefg";
  51.         num1 = strlen(p);

  52.         // 统计宽字节字符的字符串的长度
  53.         int num2 = 0;
  54.         wchar_t *p2 = L"abcd";   // wchar_t  声明宽字节
  55.         num2 = wcslen(p2);

  56.         // char *    -->  CString
  57.         char *p3 = "abc123";
  58.         CString str = CString(p3);

  59.         // CString   -->  char *
  60.         wchar_t *p4 = /* (char*) */str.GetBuffer();
  61. }
复制代码

附件: VC++之MFC类库中文手册.zip (1.42 MB, 下载次数: 2)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
╰☆忝婲雨☆╮ + 1 + 1 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表