零基础带你了解MFC【万字总结】

目录

前言

MFC概述

主要特点

面向对象框架

简化Windows API调用

消息驱动的编程模型

文档/视图架构

资源管理和资源编辑器

可扩展性和复用性

跨平台性

MFC框架

MFC应用程序类型

单个文档应用程序(Single Document)

多个文档应用程序(Multiple Document)

基于对话框的应用程序(Dialog Based)

多个顶层文档应用程序(Multiple Top-Level Documents)

MFC框架的关键概念和组件

CWinApp类

CFrameWnd类

消息映射表(Message Map)

文档/视图架构的实现

创建对话框

控制焦点和消息传递

MFC消息处理

消息映射表(Message Map)

消息处理函数

常见消息类型

派发消息

自定义消息处理函数

消息的参数传递

MFC控件和对话框

控件(Controls)

常见控件

控件的创建与设置

控件事件处理

对话框(Dialog)

对话框的创建

对话框控件的关联

对话框模板

自定义对话框

MFC文档/视图架构

概念

文档类 (CDocument)

视图类 (CView)

框架窗口类 (CFrameWnd)

实现

文档/视图创建和关联

文档/视图的更新

消息映射表的使用

示例代码

MFC库中常用的类

CWinApp类

CFrameWnd类

CView类

CDocument类

CDialog类

CButton、CEdit、CListBox等控件类

CString类

CArray、CList等容器类

CWinThread类

MFC资源管理

资源文件 (.rc)

资源编辑器

加载和使用图标和位图

菜单和工具栏

字符串表

使用宏和符号定义

MFC消息框和对话框

消息框(MessageBox)

输入框(InputBox)

文件对话框(File Dialog)

颜色对话框(Color Dialog)

字体对话框(Font Dialog)

MFC调试和错误处理

断言(Assertions)

输出调试信息(Debugging Output)

异常处理(Exception Handling)

错误处理和返回值(Error Handling and Return Values)

使用AfxMessageBox进行错误提示

结语


前言

        都2023年了,怎么还有人在学MFC?要知道大概在13年MFC就停止更新了,距今大概已有10年的历史了。话随那么说,但总有一些学校课程和公司旧项目需要用到MFC。没办法,形势所迫。那么接下来我将带你初步了解MFC。

MFC概述

         MFC(Microsoft Foundation Classes)是一个C++类库,用于简化Windows图形用户界面(GUI)应用程序的开发。

主要特点

  1. 面向对象框架

    • MFC是一个基于面向对象编程(OOP)的框架,它使用C++语言的类和对象来建模Windows应用程序的各个组件。
    • 类(Class)是C++中的基本概念,而对象(Object)是类的实例。MFC通过类的继承和多态性等OOP概念,提供了一种组织和扩展代码的灵活方式。
  2. 简化Windows API调用

    • Windows API是一组用于编写Windows应用程序的函数。MFC的目标之一是简化Windows API的调用,使得开发者能够更轻松地创建Windows应用程序。
    • MFC通过提供一组高级的C++类封装了Windows API,使得开发者能够使用更直观的对象模型而不必深入了解Windows API的底层细节。
  3. 消息驱动的编程模型

    • MFC应用程序是基于消息的编程模型的。Windows系统通过消息传递来处理用户输入、系统事件等。MFC应用程序通过处理这些消息来响应用户的操作。
    • 每个窗口都有一个消息处理函数,通过消息映射表将特定的消息与相应的处理函数关联起来。这种消息驱动的模型使得应用程序能够高效地响应用户和系统的事件。
  4. 文档/视图架构

    • MFC引入了文档/视图架构,将应用程序分解为模型(文档)、视图和控制器的组件。
    • 文档表示应用程序的数据结构,视图负责显示和用户交互,而控制器负责协调文档和视图之间的交互。这种分层结构使得应用程序更易于维护和扩展。
  5. 资源管理和资源编辑器

    • MFC应用程序使用资源文件来存储图标、位图、对话框模板等资源。这些资源可以通过资源编辑器进行管理和编辑。
    • 资源编辑器提供了一个可视化的界面,使开发者能够轻松地设计和调整应用程序的外观,而无需深入处理代码。
  6. 可扩展性和复用性

    • MFC的设计考虑到了可扩展性和复用性,使得开发者能够构建可重用的模块和控件。
    • 类的继承机制和多态性使得开发者能够通过扩展或重写现有的类来创建自定义的控件或功能模块,提高了代码的复用性。
  7. 跨平台性

    • MFC主要用于Windows平台的应用程序开发,而且它是Windows特有的。如果考虑到跨平台性,开发者可能需要考虑其他跨平台框架,如Qt。

MFC框架

在你创建MFC项目时,总会遇到【应用程序类型】这个选项

我将向你讲解这四个选项是什么

MFC应用程序类型

  1. 单个文档应用程序(Single Document)

    • 概述: 单个文档应用程序通常用于处理单个文档的应用,比如文本编辑器或绘图应用。
    • 知识涉及: 包括文档/视图架构,其中有一个文档类(CDocument)负责管理数据,一个视图类(CView)用于显示和交互。
  2. 多个文档应用程序(Multiple Document)

    • 概述: 多个文档应用程序适用于同时打开和管理多个文档的场景,例如Microsoft Word。
    • 知识涉及: 同样包括文档/视图架构,但具有能够处理多个文档的结构。通常涉及到文档模板(CMultiDocTemplate)的使用。
  3. 基于对话框的应用程序(Dialog Based)

    • 概述: 基于对话框的应用程序是一种简单的应用程序类型,主要使用对话框来实现用户界面,适用于小型工具或配置界面。
    • 知识涉及: 对话框类(CDialog)和资源编辑器的使用,消息处理在对话框内完成。这种应用程序类型通常没有文档/视图架构。
  4. 多个顶层文档应用程序(Multiple Top-Level Documents)

    • 概述: 这是一种介于单个文档和多个文档之间的应用程序类型,允许用户同时管理多个顶层文档。
    • 知识涉及: 类似于多个文档应用程序,但每个文档窗口是独立的顶层窗口,可以单独操控。也涉及文档模板的使用。

刚入门的话,一般都是基于对话框开发。

MFC框架的关键概念和组件

  1. CWinApp类

    • CWinApp是MFC应用程序的主类,负责初始化应用程序和管理其生命周期。它是应用程序的入口点,通常包括应用程序的初始化和退出代码。
    • 下面是一个简单的CWinApp子类的例子:
    class MyApp : public CWinApp {
    public:
        virtual BOOL InitInstance() {
            // 初始化应用程序
            return TRUE;
        }
    };
    
    MyApp theApp;  // 创建应用程序对象
    
  2. CFrameWnd类

    • CFrameWnd是MFC应用程序中主窗口的基类。它管理主窗口的外观和行为,包括菜单、工具栏、状态栏等元素。
    • 以下是一个简单的CFrameWnd子类的例子:
    class MyFrame : public CFrameWnd {
    public:
        MyFrame() {
            Create(NULL, _T("My MFC App"));  // 创建主窗口
        }
    };
    
  3. 消息映射表(Message Map)

    • MFC使用消息映射表来关联窗口消息与相应的处理函数。这是消息驱动编程的核心机制。
    • 以下是一个处理按钮点击消息的消息映射表的例子:
    //消息映射
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
        ON_COMMAND(ID_BUTTON_CLICK, OnButtonClick)
    END_MESSAGE_MAP()
    
    
    //事件定义
    void MyFrame::OnButtonClick() {
        // 处理按钮点击事件
    }
    
  4. 文档/视图架构的实现

    • CDocument类表示应用程序的数据,而CView类则表示用户界面的可视化部分。这两者通过CFrameWnd的子类来协调工作。
    • 下面是一个简单的文档/视图架构的实现:
    class MyDocument : public CDocument {
        // 实现文档相关的功能
    };
    
    class MyView : public CView {
        // 实现视图相关的功能
    };
    
  5. 创建对话框

    • MFC提供了CDialog类和资源编辑器,用于创建对话框。对话框可以包含各种控件,如按钮、文本框等。
    • 下面是一个简单的创建对话框的示例:
    class MyDialog : public CDialog {
    public:
        MyDialog() : CDialog(IDD_MYDIALOG) { }
    
        virtual BOOL OnInitDialog() {
            // 在对话框初始化时执行的代码
            return TRUE;
        }
    };
    
  6. 控制焦点和消息传递

    • MFC提供了处理焦点和消息传递的机制。通过重载OnSetFocusOnKillFocus等函数,可以处理控件的焦点事件。
    • 下面是一个简单的处理焦点事件的例子:
void MyView::OnSetFocus(CWnd* pOldWnd) {
    // 处理控件获得焦点的事件
}

MFC消息处理

        MFC(Microsoft Foundation Class)应用程序通过处理消息来响应用户输入和系统事件。消息处理是MFC应用程序中的核心概念之一,它通过消息映射表将特定的消息与相应的处理函数关联起来。

  • 消息映射表(Message Map)

  • 消息映射表是一个表格,它将消息ID与处理该消息的成员函数进行关联。在MFC中,消息映射表使用BEGIN_MESSAGE_MAPEND_MESSAGE_MAP宏定义,其中通过ON_MESSAGEON_COMMAND等宏将消息ID与成员函数关联。
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()

在上面的例子中,ON_WM_LBUTTONDOWNON_COMMAND分别将鼠标左键点击消息和文件打开命令与相应的处理函数关联。

消息处理函数

  • 消息处理函数是成员函数,用于响应特定的消息。它们的原型通常由相应的消息宏定义,例如ON_WM_LBUTTONDOWN宏定义的消息处理函数原型为afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
void MyFrame::OnLButtonDown(UINT nFlags, CPoint point) {
    // 处理鼠标左键点击事件
}

void MyFrame::OnFileOpen() {
    // 处理文件打开命令
}

常见消息类型

  • MFC支持处理各种消息类型,包括但不限于:
    • 命令消息 (ON_COMMAND): 用于处理菜单项、工具栏按钮等发送的命令。
    • 通知消息 (ON_NOTIFY): 用于处理从控件发送的通知消息,例如列表框的选择变化。
    • 定时器消息 (ON_WM_TIMER): 用于处理定时器触发的事件。
    • 鼠标和键盘消息 (ON_WM_MOUSEMOVE, ON_WM_KEYDOWN): 用于处理与鼠标和键盘有关的事件。

派发消息

  • 消息的派发是由Windows操作系统完成的,MFC框架提供了一种机制,通过派发消息到相应的消息处理函数。这发生在消息循环中。
int MyApp::Run() {
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);  // 派发消息
    }
    return msg.wParam;
}

自定义消息处理函数

  • 除了处理Windows定义的消息之外,你还可以定义和处理自己的消息。为此,你可以使用ON_MESSAGE宏,并在消息处理函数中进行相应的处理。
// 在消息映射表中定义自定义消息处理函数
ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, OnMyCustomMessage)

// 自定义消息处理函数的原型
afx_msg LRESULT OnMyCustomMessage(WPARAM wParam, LPARAM lParam);


LRESULT MyFrame::OnMyCustomMessage(WPARAM wParam, LPARAM lParam) {
    // 处理自定义消息
    return 0;
}

消息的参数传递

  • 消息处理函数的参数通常包括与特定消息相关的信息,例如鼠标事件的坐标、键盘事件的按键信息等。这些参数的具体形式取决于消息的类型。

  • 例如,ON_WM_LBUTTONDOWN宏定义的OnLButtonDown函数接收两个参数,分别是UINT nFlagsCPoint point,分别表示鼠标事件的标志和坐标。

void MyFrame::OnLButtonDown(UINT nFlags, CPoint point) {
    // 使用鼠标事件的标志和坐标
}

MFC控件和对话框

控件(Controls)

常见控件

  • MFC提供了各种常见的控件,如按钮 (CButton)、文本框 (CEdit)、列表框 (CListBox)、组合框 (CComboBox)、静态文本 (CStatic) 等。

控件的创建与设置

  • 控件通常在对话框中创建,可以通过资源编辑器直观地设计对话框的布局。
  • 控件的属性可以在资源编辑器中设置,也可以在代码中使用相应的控件类成员函数进行设置。
// 创建按钮控件
CButton myButton;
myButton.Create(_T("Click Me"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 100, 30), this, IDC_BUTTON1);

// 设置按钮文本
myButton.SetWindowText(_T("New Text"));

控件事件处理

  • 控件通常与消息映射表结合使用,以响应用户的交互事件。例如,按钮点击事件可以通过BN_CLICKED消息来处理。
ON_BN_CLICKED(IDC_BUTTON1, OnButtonClick)
void MyDialog::OnButtonClick() {
    // 处理按钮点击事件
}

对话框(Dialog)

对话框的创建

  • 对话框可以通过资源编辑器创建,也可以在代码中动态创建。在资源编辑器中创建的对话框可以在代码中使用DoModal函数调用。
// 在资源编辑器中创建的对话框
CMyDialog dlg;
dlg.DoModal();

对话框控件的关联

  • 在对话框中的控件可以通过控件变量进行访问,这些变量通常通过DDX_ControlDDX_*宏进行关联。
class CMyDialog : public CDialog {
public:
    CButton m_button;
    CEdit m_edit;

    CMyDialog(CWnd* pParent = NULL) : CDialog(IDD_MYDIALOG, pParent) {
        // 使用 DDX_Control 宏关联控件
        DDX_Control(pDX, IDC_BUTTON1, m_button);
        DDX_Control(pDX, IDC_EDIT1, m_edit);
    }

    // ...
};

对话框模板

  • 对话框使用对话框模板(Dialog Template)定义其外观和布局。模板可以在资源编辑器中设计,并在对话框类中关联。
IDD_MYDIALOG DIALOGEX 0, 0, 200, 100
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "My Dialog"
FONT 8, "MS Sans Serif"
BEGIN
    PUSHBUTTON      "OK",IDOK,10,10,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,70,10,50,14
    EDITTEXT        IDC_EDIT1,10,30,180,14
END

自定义对话框

  • 可以通过派生自CDialog类来创建自定义对话框,以满足特定的应用程序需求。自定义对话框可以包含自定义的控件和逻辑。
class CMyCustomDialog : public CDialog {
public:
    CMyCustomDialog(CWnd* pParent = NULL) : CDialog(IDD_CUSTOM_DIALOG, pParent) { }

    // ...
};

MFC文档/视图架构

概念

文档类 (CDocument)

  • CDocument是表示应用程序数据的基类。每个文档类负责管理一个数据集,可以是文本、图形、数据库记录等。
  • 使用时需要派生自CDocument类,并实现其中的函数来处理数据的读取、保存等操作。
class CMyDocument : public CDocument {
public:
    // 实现文档操作,如数据的读取和保存
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);
};

视图类 (CView)

  • CView是表示用户界面的基类。每个视图类负责显示和交互一个文档的数据。
  • 使用时需要派生自CView类,并实现其中的函数来处理绘制、用户输入等操作。
class CMyView : public CView {
public:
    // 实现视图的绘制和用户输入的处理
    virtual void OnDraw(CDC* pDC);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

框架窗口类 (CFrameWnd)

  • CFrameWnd是表示应用程序主窗口的基类。它通常包含一个菜单、工具栏、状态栏等用户界面元素。
  • 使用时需要派生自CFrameWnd类,并实现其中的函数来处理窗口的创建和布局。
class CMainFrame : public CFrameWnd {
public:
    // 实现主窗口的创建和布局
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
};

实现

文档/视图创建和关联

  • 在主框架类的创建过程中,通常需要创建文档对象和视图对象,并将它们关联起来。
// 在主框架类中创建文档和视图
CMyDocument* pDoc = new CMyDocument;
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
pDoc->CreateNewDocument();
SetActiveView((CView*) pDoc->CreateView(&context, AFX_IDW_PANE_FIRST));

文档/视图的更新

  • 当文档数据发生变化时,需要通知关联的视图进行更新。这通常通过在文档中调用UpdateAllViews函数来实现。
// 在文档中进行数据更新,并通知相关的视图
void CMyDocument::UpdateAllViews() {
    SetModifiedFlag();  // 标记文档为已修改
    UpdateAllViews(NULL);
}

消息映射表的使用

  • 在文档和视图类中,通常需要使用消息映射表来关联消息和相应的处理函数,以实现对用户输入和系统事件的响应。
// 在视图类中的消息映射表
BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// 在视图类中处理鼠标左键点击事件
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
    // 处理鼠标左键点击事件
}

示例代码

以下是一个简单的MFC文档/视图应用程序的示例代码,用于说明文档/视图架构的基本实现。

// MyDocument.h
class CMyDocument : public CDocument {
public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);
};

// MyDocument.cpp
BOOL CMyDocument::OnNewDocument() {
    // 初始化文档数据
    return TRUE;
}

void CMyDocument::Serialize(CArchive& ar) {
    // 读取或保存文档数据
}

// MyView.h
class CMyView : public CView {
public:
    virtual void OnDraw(CDC* pDC);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

// MyView.cpp
void CMyView::OnDraw(CDC* pDC) {
    // 绘制视图内容
}

void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
    // 处理鼠标左键点击事件
}

// MainFrm.h
class CMainFrame : public CFrameWnd {
public:
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
};

// MainFrm.cpp
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
    // 创建文档和视图,并关联它们
    CMyDocument* pDoc = new CMyDocument;
    CCreateContext context;
    context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
    pDoc->CreateNewDocument();
    SetActiveView((CView*) pDoc->CreateView(&context, AFX_IDW_PANE_FIRST));

    return TRUE;
}

通过这种架构,文档和视图之间实现了分离,使得应用程序更易于扩展和维护。

MFC库中常用的类

CWinApp类

  • CWinApp是MFC应用程序的主类,负责应用程序的初始化和管理。
  • InitInstance函数用于初始化应用程序,ExitInstance函数用于清理资源。
class CMyApp : public CWinApp {
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
};

CFrameWnd类

  • CFrameWnd是MFC应用程序中主窗口的基类,负责主窗口的创建和管理。
  • Create函数用于创建主窗口,OnCreate函数用于处理主窗口的创建事件。
class CMyFrame : public CFrameWnd {
public:
    CMyFrame() {
        Create(NULL, _T("My MFC App"));
    }

    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    DECLARE_MESSAGE_MAP()
};

CView类

  • CView是MFC应用程序中视图的基类,负责显示和处理用户交互。
  • OnDraw函数用于绘制视图内容,OnLButtonDown等函数用于处理用户输入。
class CMyView : public CView {
public:
    virtual void OnDraw(CDC* pDC);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    DECLARE_MESSAGE_MAP()
};

CDocument类

  • CDocument是MFC应用程序中文档的基类,负责管理应用程序的数据。
  • OnNewDocumentSerialize函数用于初始化新文档和读写文档数据。
class CMyDocument : public CDocument {
public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);
};

CDialog类

  • CDialog是MFC应用程序中对话框的基类,负责创建和管理对话框。
  • OnInitDialog函数用于在对话框初始化时执行一些操作。
class CMyDialog : public CDialog {
public:
    CMyDialog() : CDialog(IDD_MYDIALOG) { }

    virtual BOOL OnInitDialog();
};

CButton、CEdit、CListBox等控件类

  • MFC提供了一系列控件类,用于创建和操作各种用户界面控件。
  • CButton用于创建按钮,CEdit用于创建文本框,CListBox用于创建列表框等。
CButton myButton;
myButton.Create(_T("Click Me"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 100, 30), this, IDC_BUTTON1);

CString类

  • CString是MFC中用于处理字符串的类,提供了许多字符串操作的方法。
  • Format函数用于格式化字符串,GetLength函数用于获取字符串长度。
CString str;
str.Format(_T("The length is %d"), str.GetLength());

CArray、CList等容器类

  • MFC提供了多种容器类,如CArrayCList,用于存储和管理数据集合。
  • AddRemoveAt等函数用于操作容器中的元素。
CArray<int, int> myArray;
myArray.Add(1);
myArray.Add(2);
myArray.RemoveAt(0);

CWinThread类

  • CWinThread是MFC中用于多线程编程的类,可以派生自它来创建自己的线程。
  • InitInstanceExitInstance函数用于线程的初始化和清理。
class CMyThread : public CWinThread {
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
};

MFC资源管理

资源文件 (.rc)

  • MFC应用程序的资源通常存储在资源文件中,该文件的扩展名为.rc(Resource Script)。
  • 资源文件使用类似于C语言的语法,定义了图标、位图、对话框模板、菜单等资源。
// 示例:在资源文件中定义一个图标
IDI_MYICON ICON "myicon.ico"

资源编辑器

  • Visual Studio提供了资源编辑器,可以直观地编辑资源文件。通过资源编辑器,你可以添加、删除、修改各种资源。
  • 在资源编辑器中,可以编辑对话框、图标、位图等资源,也可以设置菜单、工具栏等。

加载和使用图标和位图

  • MFC提供了LoadIconLoadBitmap等函数,用于加载图标和位图。
HICON hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_MYBITMAP);

菜单和工具栏

  • 菜单和工具栏的定义也在资源文件中。你可以使用资源编辑器添加菜单项和工具栏按钮,并在代码中使用。
// 示例:在资源文件中定义一个菜单
IDR_MYMENU MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&Open", ID_FILE_OPEN
        MENUITEM "&Save", ID_FILE_SAVE
    END
END
// 示例:在代码中加载和设置菜单
CMenu menu;
menu.LoadMenu(IDR_MYMENU);
SetMenu(&menu);

字符串表

  • 字符串表定义了应用程序中使用的字符串。这些字符串可以是消息框的提示信息、菜单项的文本等。
// 示例:在资源文件中定义一个字符串表
STRINGTABLE
BEGIN
    IDS_APP_TITLE           "My MFC App"
    IDS_HELLO               "Hello, World!"
END
// 示例:在代码中加载字符串
CString str;
str.LoadString(IDS_APP_TITLE);

使用宏和符号定义

  • 在资源文件和代码中,你可以使用宏和符号定义,使得资源和代码之间更加灵活。
// 示例:在代码中使用宏和符号定义
CString str;
str.LoadString(IDS_APP_TITLE);
MessageBox(str, _T("Information"), MB_OK | MB_ICONINFORMATION);

MFC消息框和对话框

消息框(MessageBox)

  • 消息框用于显示提示、警告或错误等信息给用户,并通常包含确定、取消等按钮以供用户选择。
  • AfxMessageBox是MFC中用于显示消息框的函数,可以在全局范围内调用。
// 示例:显示一个简单的消息框
AfxMessageBox(_T("Hello, World!"), MB_OK | MB_ICONINFORMATION);
  • MB_OK 表示消息框包含确定按钮,MB_ICONINFORMATION 表示消息框包含信息图标。

输入框(InputBox)

  • MFC并没有提供直接的输入框函数,但你可以通过对话框和控件的组合来实现。
  • 创建一个对话框,将一个编辑框(CEdit)用于用户输入,然后在对话框中处理确定按钮点击事件。
// 示例:创建包含输入框的对话框
class CInputDialog : public CDialog {
public:
    CString m_inputText;

    CInputDialog(CWnd* pParent = NULL) : CDialog(IDD_INPUT_DIALOG, pParent) { }

    virtual void DoDataExchange(CDataExchange* pDX);
    virtual BOOL OnInitDialog();
    afx_msg void OnOK();

    DECLARE_MESSAGE_MAP()
};

void CInputDialog::DoDataExchange(CDataExchange* pDX) {
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_INPUT, m_inputText);
}

BOOL CInputDialog::OnInitDialog() {
    CDialog::OnInitDialog();
    return TRUE;
}

void CInputDialog::OnOK() {
    UpdateData(TRUE);
    CDialog::OnOK();
}

// 在使用的地方
CInputDialog dlg;
if (dlg.DoModal() == IDOK) {
    CString input = dlg.m_inputText;
    // 处理输入
}

文件对话框(File Dialog)

  • MFC提供了CFileDialog类,用于显示文件对话框,使用户能够选择文件。
  • CFileDialog有多种用法,可以设置打开文件、保存文件等。
// 示例:显示打开文件对话框
CFileDialog fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("Text Files (*.txt)|*.txt||"), this);
if (fileDlg.DoModal() == IDOK) {
    CString filePath = fileDlg.GetPathName();
    // 处理选择的文件路径
}

颜色对话框(Color Dialog)

  • MFC提供了CColorDialog类,用于显示颜色对话框,使用户能够选择颜色。
  • CColorDialog的用法类似于文件对话框。
// 示例:显示颜色对话框
CColorDialog colorDlg;
if (colorDlg.DoModal() == IDOK) {
    COLORREF color = colorDlg.GetColor();
    // 处理选择的颜色
}

字体对话框(Font Dialog)

  • MFC提供了CFontDialog类,用于显示字体对话框,使用户能够选择字体。
  • CFontDialog的用法类似于文件对话框。
// 示例:显示字体对话框
CFontDialog fontDlg;
if (fontDlg.DoModal() == IDOK) {
    LOGFONT lf;
    fontDlg.GetCurrentFont(&lf);
    // 处理选择的字体信息
}

MFC调试和错误处理

断言(Assertions)

  • MFC中使用ASSERTVERIFY宏来进行断言。断言用于在运行时检查某个条件是否为真,如果为假,则会中断程序的执行。
// 示例:使用 ASSERT 进行断言
ASSERT(n > 0);
  • VERIFYASSERT的作用类似,但VERIFY在断言失败时不会中断程序执行,而是继续执行后续代码。
// 示例:使用 VERIFY 进行断言
VERIFY(n > 0);

输出调试信息(Debugging Output)

  • TRACE宏用于输出调试信息。这些信息通常会显示在调试输出窗口。
// 示例:输出调试信息
TRACE(_T("This is a debug message\n"));

异常处理(Exception Handling)

  • MFC中的异常处理主要通过trycatchthrow实现。异常处理对于处理运行时错误非常重要。
// 示例:使用异常处理
try {
    // 一些可能抛出异常的代码
    if (errorCondition) {
        throw CMyException();  // 抛出自定义异常
    }
}
catch (CException* e) {
    // 处理异常
    e->ReportError();
    e->Delete();  // 释放异常对象
}

错误处理和返回值(Error Handling and Return Values)

  • MFC中的函数通常会返回BOOL类型,表示函数是否成功执行。可以使用FALSETRUE来表示成功或失败。
// 示例:返回错误码
BOOL MyFunction() {
    // 一些操作
    if (errorCondition) {
        return FALSE;  // 表示操作失败
    }
    return TRUE;  // 表示操作成功
}

使用AfxMessageBox进行错误提示

  • 在遇到错误时,可以使用AfxMessageBox函数弹出消息框提示用户。
// 示例:使用 AfxMessageBox 进行错误提示
if (errorCondition) {
    AfxMessageBox(_T("An error occurred!"), MB_OK | MB_ICONERROR);
}

结语

以上就是MFC的基础知识点总结归纳。如果你觉得这篇文章对你有帮助,还请点个赞支持我,谢谢。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Completits_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值