一,MFC简介:
MFC是Microsoft Foundation Classes的简称,是微软公司提供的一个类库(class libraries)。这个类库以C++类的形式封装了Windows的API,并且包含一个应用程序框架,用于辅助开发Windows图形界面程序。使用MFC可以减少应用程序开发人员的工作量,它包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
在学习MFC之前,我们有必要学习一下Windows的消息机制和编程模型,了解这些底层逻辑有利于学习MFC框架。
二,Windows的消息机制
Windows消息机制是Windows程序设计的基础,它基于事件驱动模式,使应用程序能够响应各种事件,如用户点击鼠标或键盘输入等。
消息机制主要由以下三个部分组成:
- 消息队列:Windows为每个应用程序维护一个消息队列。当系统发生某个事件时,Windows会将该事件翻译为消息,并放入应用程序的消息队列中。应用程序必须从消息队列中取出消息,然后根据消息的类型和内容进行相应的处理。
- 消息循环:这是一个无限循环,负责从消息队列中读取消息,并将消息分发给相应的处理函数。这样,应用程序就能持续监听和处理各种事件。
- 窗口过程:每个窗口都有一个窗口过程,用于接收并处理Windows发送给窗口的消息。窗口过程是一个回调函数,它在处理完一个消息后,通常会给Windows返回一个值,以表示消息的处理结果。
在Windows应用程序中,消息的类型多种多样,包括命令消息和控件通知消息等。命令消息通常用于处理从一个窗口发送到另一个窗口的用户请求,如点击按钮。控件通知消息则用于子控件通知其父窗口某些事件的发生,如列表框中的选项被选中。
总的来说,Windows消息机制为应用程序提供了一种高效、灵活的方式来处理各种事件和响应用户操作。通过理解和运用消息机制,开发者可以创建出功能丰富、响应迅速的Windows应用程序。
三,Windows编程模型
Windows编程模型是一种基于事件驱动的编程架构,其执行流程主要依赖于外部事件的发生。这种模型主要用于构建桌面应用程序和其他类型的应用,这些应用运行在Microsoft Windows操作系统之上。它强调了窗口、消息处理和系统API的使用,通过这些机制,开发者能够构建出功能丰富、响应用户交互的桌面应用程序。
在Windows编程模型中,应用程序通过处理操作系统发送来的消息来响应事件。这些事件可能包括一次击键、鼠标单击或是要求窗口更新的命令等。应用程序的进入点是函数WinMain,但大部分操作实际上是在一个称为窗口过程的函数中进行的。窗口过程函数处理发送给窗口的消息。WinMain函数会创建窗口并进入消息循环,即从消息队列中检索并调度消息给窗口过程。
Windows消息循环机制是Windows操作系统中GUI编程的核心部分,也是事件驱动编程模型的基础。消息由MSG结构体对象表示,其中包含了接收消息的窗口的句柄。消息循环不断地从消息队列中取出消息,并进行响应。应用程序调用DispatchMessage函数,将消息回传给操作系统。
Windows编程模型的主要特点是其事件驱动程序设计方式,这使得应用程序能够与用户进行交互。这种消息驱动机制是Windows编程的最大特点,它不同于传统的顺序、关联、过程驱动的程序设计方法。
为了进行Windows编程,开发者需要了解并使用SDK(软件开发工具包),其中包含用于建立应用软件的开发工具集合。同时,Windows操作系统提供了API函数(应用程序编程接口),这些函数在Windows.h文件中进行声明,并被用于应用程序编程。
总的来说,Windows编程模型为开发者提供了一种灵活且强大的方式来构建响应迅速、功能丰富的Windows应用程序。通过理解和运用这个模型,开发者能够创建出符合用户需求和期望的高质量软件。
我们开始进入MFC的学习
四,如何利用MFC创建窗口
利用MFC(Microsoft Foundation Classes)创建窗口涉及一系列步骤,这些步骤通常包括创建一个MFC应用程序项目,设计窗口界面,添加控件,以及编写窗口处理代码。以下是一个基本的指南,帮助你开始使用MFC创建窗口:
1. 创建MFC应用程序项目
- 打开Visual Studio。
- 选择“创建新项目”。
- 在项目模板中,选择“MFC AppWizard (exe)”或类似的选项(取决于你的Visual Studio版本)。
- 为项目命名并选择保存位置。
- 在向导中,根据你的需要选择适当的设置(如单文档、多文档、对话框等)。
2. 设计窗口界面
- 在资源视图中,找到并打开你的主窗口或对话框资源。
- 使用资源编辑器添加和布局控件,如按钮、文本框、列表框等。
- 设置控件的属性和ID。
3. 编写窗口处理代码
- 在你的主窗口或对话框类中,重写必要的消息处理函数。例如,你可能需要重写
OnInitDialog
来初始化对话框,或重写OnOK
和OnCancel
来处理用户点击“确定”或“取消”按钮的事件。 - 对于其他控件,你可以通过它们的ID来访问它们,并添加事件处理函数。例如,你可以为按钮添加一个点击事件处理函数。
- 在消息处理函数中,编写处理用户输入和更新窗口状态的代码。
4. 编译和运行你的应用程序
- 点击“生成”或“构建”来编译你的项目。
- 确保没有编译错误。
- 运行你的应用程序,并测试窗口的功能。
5. 调试和优化
- 如果在测试过程中发现问题,使用Visual Studio的调试工具来查找和修复错误。
- 优化你的代码和界面,以提高性能和用户体验。
注意事项:
- 确保你熟悉C++和Windows编程的基本概念。
- MFC是一个复杂的框架,有很多功能和细节需要学习。建议查阅MFC的官方文档和教程,以获取更详细的信息和示例代码。
- 在设计界面和编写代码时,考虑用户体验和可维护性。
通过遵循这些步骤,你应该能够使用MFC创建一个基本的窗口应用程序。随着你对MFC的深入了解,你可以添加更多的功能和复杂性来满足你的需求。
五,用MFC创建空白窗口
创建一个简单的空白窗口使用MFC涉及几个关键步骤。以下是一个简化的示例,展示如何使用MFC创建一个基本的空白窗口:
首先,你需要使用Visual Studio创建一个MFC应用程序项目。在Visual Studio中,选择“文件” -> “新建” -> “项目”,然后在项目模板中选择“MFC AppWizard (exe)”或类似的选项。按照向导的指示设置项目选项。
一旦你创建了MFC项目,Visual Studio会自动为你生成一些基础代码。下面是一个简化的示例,展示了如何在MainFrm.cpp
文件中重写OnCreate
函数来创建一个空白窗口:
// MainFrm.cpp: 实现主窗口
#include "stdafx.h"
#include "YourApp.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainFrame 构造函数
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_WM_CREATE()
END_MESSAGE_MAP()
// CMainFrame 消息处理程序
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您自己的创建代码
// 例如,你可以在这里创建和添加控件到窗口
// 创建一个空白的窗口客户端区域
CRect rectClient;
GetClientRect(&rectClient);
::SetWindowPos(m_hWndMDIClient, NULL, rectClient.left, rectClient.top,
rectClient.Width(), rectClient.Height(),
SWP_NOACTIVATE | SWP_NOZORDER);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWndEx::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
return TRUE;
}
在这个例子中,OnCreate
函数是MFC框架调用以创建窗口的地方。在OnCreate
函数中,我们首先调用基类CMDIFrameWndEx::OnCreate
来执行标准的窗口创建过程。然后,我们获取客户端区域的矩形,并使用SetWindowPos
函数调整多文档界面(MDI)客户端窗口的大小以填充整个主窗口。这将创建一个空白的窗口客户端区域。
请注意,这个示例假设你使用的是MDI(多文档界面)应用程序类型。如果你使用的是SDI(单文档界面)或对话框类型的应用程序,你需要调整代码以适应不同的基类(如CFrameWnd
或CDialogEx
)。
此外,还需要确保你的MainFrm.h
头文件和其他相关文件(如应用程序类)已正确设置,并且你的项目配置正确以支持MFC。
最后,编译并运行你的应用程序。如果一切配置正确,你应该会看到一个没有任何控件的空白窗口。你可以根据需要在这个基础上添加控件和其他功能。
六,详细教学
小伙伴们可以跟着B站视频教程学习,也可以参考下面这篇文章:
基础的图形化编程是程序员必须掌握的,除了MFC之外,还有QT等等。用这些框架编程远比你想象得简单,一起学起来吧。