复习

  1. C++

    1. 三大特性:封装、继承、多态

    2. 类构造函数:

      • 调用顺序:先父类再子类,可在初始化列表中调用父类构造
      • 析构顺序:先子类再父类
      • 转换构造:有且仅有一个非本类类型的参数
      • 默认构造:无参
      • 拷贝构造:有且仅有一个本类类型引用的参数
    3. main 函数前执行其他代码,比如打印 Hello World

      1
      2
      3
      4
      5
      6
      int fun(){
      printf("Hello World\n");
      return 1;
      }
      int g_nNum = fun();//函数将返回值1赋给全局变量g_nNum
      int main(){}
      1
      2
      3
      4
      5
      6
      7
      8
      class MyClass{
      public:
      MyClass(){
      printf("Hello World\n");
      }
      };
      MyClass g_obj;//调用构造函数
      int main(){}
  1. SDK

    1. 窗口创建流程
      1. 设计窗口类:绑定类名;绑定窗口回调函数
      2. 注册窗口类
      3. 创建窗口:提供一个已注册的窗口类名
      4. 更新显示窗口
      5. 消息泵:GetMessage 获取消息,DispatchMessage 将消息分发给窗口,TranslateMessage 转换消息
    2. 消息处理过程
      1. WM_XXX:窗口消息,处理窗口创建,窗口关闭等消息(WM_KEYDOWNWM_LBUTTONDOWN
      2. WM_COMMAND:基本控件消息
      3. WM_NOTIFY:通用控件的通知消息,处理列表、树、鼠标等消息
    3. 控件使用
      1. 创建控件:通过 CreateWindowEx 来创建,通过不同的窗口类名来创建不同的空间
      2. 操作控件:通过 SendMessage 来操作
      3. 响应控件消息:一般在 WM_COMMAND 消息中,wParam 的低16位保存触发消息的控件 ID

MFC

  1. MFC 的入口在 CWinAppInitInstance 函数里,编写 MFC 程序,需要实现一个 CWinApp 的派生类,然后实现 InitInstance 这个虚函数,在此函数中创建一个窗口,将窗口对象的指针赋给 m_pMainWnd 这个指针

  2. MFC 有3种编程模型:单文档、多文档、对话框

  3. 创建对话框:

    1. 要有一个对话框资源

    2. 要有一个 CDialog 类对象 objDlg

    3. 调用 objDlgDoModal 函数创建模态对话框,不能和程序的其他窗口交互

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #include<afxwin.h>
      #include<afxdialogex.h>
      #include "resource.h"
      class CMyApp:public CWinApp {

      public:
      virtual BOOL InitInstance();
      };
      BOOL CMyApp::InitInstance()
      {
      // TODO: 在此添加专用代码和/或调用基类
      CDialog obj(IDD_DIALOG1);
      obj.DoModal();
      return CWinApp::InitInstance();
      }
      CMyApp OBJ;

      调用 objDlgCreate 函数创建非模态对话框,可以和程序的其他窗口交互

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      class CMyApp:public CWinApp {

      public:
      virtual BOOL InitInstance();
      CDialogEx *m_pobj;
      };
      BOOL CMyApp::InitInstance()
      {
      // TODO: 在此添加专用代码和/或调用基类
      //CDialog obj;//这是局部对象,创建了对话框,但没显示出来,
      //当离开此函数后,对象就被销毁
      m_pobj = new CDialogEx();
      m_pobj->Create(IDD_DIALOG1);
      m_pobj->ShowWindow(SW_SHOW);
      //需要将主窗口对象的地址赋给m_pMainWnd
      m_pMainWnd = m_pobj;
      return CWinApp::InitInstance();
      }
      CMyApp OBJ;
  1. MFC 是通过消息映射机制去处理消息的

    消息是程序员自己写代码处理的,实现窗口处理消息,实际上就是在给 CDialogEx 添加功能,应该使用继承。假设已有一个继承自 CDialogEx 的类,去实现消息映射

    1. 在类的声明中加 DECLARE_MESSAGE_MAP()

    2. 在类外加

      1
      2
      3
      BEGIN_MESSAGE_MAP(本类类名, 父类名)
      ........ //添加对应消息的处理宏
      END_MESSAGE_MAP()
  2. 绑定变量:使 MFC 在控件使用方面更具便捷性

    控件的主要功能是和用户进行交互,那么控件的便捷性主要体现在获取用户数据的便捷及将用户的数据显示的便捷,通过控件和变量进行绑定,可以方便地交互数据。控件都是窗口,进行便捷的窗口操作也是一个重要的需求

    绑定变量说的是控件和变量的绑定,有2种方式:

    1. 绑定基本数据类型的变量,如 intCString 等通过 UpdateData 进行数据交互,UpdateData(TRUE) 会将控件数据更新到变量中,UpdateData(FALSE) 会将变量数据显示在控件上

      文本框:CString 单选框:int,在每组的第一个单选框去绑定 复选框:int 下拉框:CString

    2. 绑定相应的控件类对象,就可以进行窗口方面的操作,以及控件独有的一些函数

      • 绑定 MFC 默认的类对象,使用 MFC 控件类的函数
      • 绑定 MFC 控件类的派生类(自己实现)的对象,增强控件类的功能

    控件和变量的绑定是在 DoDataExchange 函数中实现的

    若通过界面操作绑定变量,添加的代码和之前双击或通过类向导添加的是一样的

    1571834329625

    1571834350667

    1571834370023

MFC 程序:

  1. 继承 CWinApp 得到一个自定义的子类
  2. 使用 CWinApp 的子类定义一个全局对象
  3. CWinApp 的子类中重写虚函数:BOOL InitInstance()
  4. 虚函数就是 MFC 的程序入口

MFC 窗口:使用 CDialogEx 来操作对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <afxwin.h>
#include "resource.h"
#include <afxdialogex.h>
class MyDialog : public CDialogEx {
public:
MyDialog(UINT uIdTemplate, CWnd* parent = nullptr)
: CDialogEx(uIdTemplate, parent)/*调用父类构造*/
{}
// 在类内定义按钮点击函数
// 需要将这个函数放在消息映射表
// 中注册
void onButtonClicked()
{
MessageBox(_T("按钮被点击"));
}
// 在类内声明消息映射表
DECLARE_MESSAGE_MAP()
};
// 在类外定义消息映射表
BEGIN_MESSAGE_MAP(MyDialog, CDialogEx)
// 响应按钮的点击事件,需要在消息映射表中编写
ON_COMMAND(IDC_BUTTON1, &MyDialog::onButtonClicked)
END_MESSAGE_MAP()

//CWinApp 是MFC的应用程序类
//用于表示整个窗口应用程序.
//CWinApp类或它的子类只能定义一个对象
//且一个MFC的应用程序必须使用这个类或它的
//子类来定义一个全局对象来启动MFC程序框架.
class MyApp : public CWinApp {
public:
virtual BOOL InitInstance()override
{
// 这个虚函数相当于程序入口
MyDialog dlg(IDD_DIALOG1);
// DoModal : 运行一个模态对话框
dlg.DoModal();
return TRUE;
}
};
MyApp g_app;// 全局对象

响应消息和类向导

  1. 窗口消息
    1. 对话框初始化消息
    2. WM_SIZEWM_LBUTTONDOWN
    3. 需要类向导
  2. 控件消息
    1. 按钮点击:直接在对话框视图上双击
    2. 其他控件的消息响应需要类向导

对话框

对话框的初始化函数是一个虚函数:OnInitDialog

1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}