MFC初步教程(一)
学习过很多语言以及环境,对于Java、C++、Qt等都很容易理解,并且能很快上手做项目,唯独对MFC一直浑浑噩噩,不太清楚,参与项目总是独立负责一块,与业务逻辑更相关,用std库的机会多,与GUI、Doc/View打交道的时间少,没有对其进行系统地学习。现在独立完成项目,各方面都要清楚,尤其觉得MFC是自己的一个短板,更觉得有系统一学的必要。
一、用MFC创建窗口
MFC的目的是减轻程序员的工作量,让程序员专注于程序的逻辑而非一堆离散的SDK函数,其主要作用是将绝大部分常用的函数包装好,提供一个完整的框架。在MFC中,有两个类最为重要,一个是CWinApp,另一个是CFrameWnd ,前者负责实现应用级别的功能,后则实现GUI相关的功能。
MFC中的所有类都继承与CCmdTarget,CCmdTarget类都具有处理消息映射中的消息的能力(即能处理windows消息)。在CWinApp中,一个重要的重载函数是InitInstance,它负责窗口的创建;它还有一个重要的数据成员m_pMainWnd,它是指向窗口的指针。
以下我们用CWinApp和CFrameWnd两个类构建一个window是程序,(新建一个Win32空项目,添加如下代码的文件)其代码如下所示:
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 | #include <afxwin.h> class MFC_Tutorial_Window: public CFrameWnd { public : MFC_Tutorial_Window() { Create(NULL, "MFC Tutorial" ); } }; class MyApp: public CWinApp { MFC_Tutorial_Window *wnd; public : BOOL InitInstance() { wnd = new MFC_Tutorial_Window(); m_pMainWnd = wnd; m_pMainWnd->ShowWindow(1); return 1; } }; MyApp theApp; |
然后选择project->setting->General->using MFC in a shared dll
二、消息映射
继承自CCmdTarget的类均具有处理windows消息的能力,MFC提供了一中消息映射的机制,即每个集成自CCmdTarget的类均可声明自己处理的消息,下面通过简单的实例说明MFC中消息映射的实现方式。
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 | #include <afxwin.h> class MFC_Tutorial_Window : public CFrameWnd { public : MFC_Tutorial_Window() { Create(NULL, "MFC Tutorial Part 2 CoderSource Window" ); } void OnLButtonDown( UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() // 说明MFC_Tutorial_Window会处理相关window是消息 }; BEGIN_MESSAGE_MAP( MFC_Tutorial_Window, CFrameWnd) // 定义MFC_Tutorial_Window中的消息映射,MFC_Tutorial_Window是CFrameWnd的子类,声明事件处理链 ON_WM_LBUTTONDOWN() //Macro to map the left button click to the handler // 如果在此声明的消息在MFC_Tutorial_Window中没有提供消息处理函数,则在CFrameWnd中寻找 END_MESSAGE_MAP() void MFC_Tutorial_Window::OnLButtonDown( UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CFrameWnd::OnLButtonDown(nFlags, point); MessageBox( "Left Button clicked" ); } class MyApp : public CWinApp { MFC_Tutorial_Window *wnd;? public : BOOL InitInstance() { wnd = new MFC_Tutorial_Window(); m_pMainWnd = wnd; m_pMainWnd->ShowWindow(1); return 1; } }; MyApp theApp; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!