技术标签: Windows-MFC mfc
MFC(全称:Microsoft Foundation Classes),微软基础类库。他封装了Windows应用程序的各种API以及相关机制的c++类库。
(1)开发效率高
(2)程序执行效率高,相对C#
(3)迁移性差(仅支持Windows)相对QT
(1)afx.h 将其他MFC头文件包含在内
(2)afxwin.h 包含了各种MFC窗口类,包含了afx.h和windows.h
(3)afxext.h 包含了扩展窗口类的支持,如:工具栏和状态栏
(1)MFC控制台程序:可以调用MFC的控制台程序
(2)MFC库程序
MFC静态库
MFC动态库
MFC扩展库:扩展库只能被MFC应用程序调用
(3)MFC窗口程序
单文档视图架构程序
多文档视图架构程序
对话框应用程序
(1)创建
(2)介绍
双冒号开头函数为win32的API函数,如:
::GetModuleHandle(NULL);
以Afx开头函数为MFC库的全局函数,如:
AfxWinInit(hModule, NULL, ::GetCommandLine()
MFC静态库
(1)创建
MFC动态库
(1)创建
MFC扩展库
(1)创建
(2)说明
扩展库只能被MFC应用调用,而且该库使用动态的MFC库
单文档框架程序
(1)创建
(2)说明
参与架构的类:
应用程序类:负责程序流程
class CMFCSdlApp : public CWinApp
框架窗口类:负责程序主框架
class CMainFrame : public CFrameWnd
视图类:负责窗户口显示
class CMFCSdlView : public CView
文档类:负责数据管理数据
class CMFCSdlDoc : public CDocument
多文档框架程序
(1)创建
(2)说明
参与架构的类:
应用程序类:负责程序流程
class CMFCMdiApp : public CWinApp
多文档主框架窗口类
class CMainFrame : public CMDIFrameWnd
多文档子框架窗口类
class CChildFrame : public CMDIChildWnd
视图窗口类:显示数据
class CMFCMdiView : public CView
文档类:数据管理
class CMFCMdiDoc : public CDocument
对话框应用程序
(1)创建
(2)说明
参数框架类:
应用程序类:管理流程
class CMFCDlgApp : public CWinApp
对话框窗口类
class CMFCDlgDlg : public CDialogEx
(1)CObject类
MFC类绝大部分的父类,提供了MFC类库中的一只些基本机制
对运行时类信息的支持
对动态创建的支持
对序列化的支持
(2)CWinApp类 应用程序类,封装了应用程序,线程等信息
(3)CDocument类 文档类,管理数据
(4)Frame Windows 框架窗口类,封装了窗口程序组成的各种框架窗口
(5)CSplitterWnd 用来完成拆分窗口的类
(6)Control Bars 控件条(工具栏)类
(7)Dialog Boxes 对话框类,封装了各种对话框
(8)View 视图类,封装了各种显示窗口
(9)Control 控件类,封装了各种常用的控件
(10)Exceptions 异常处理类,封装了中常用的各种异常
(11)File 文件类,各种文件的I/O操作
(12)绘图类,包括CDC类和CGdiObject类
(13)数据集合类,CArray/Clist/CMap,封装了相应的数据结构管理
(14)非Cobject类的子列
CPoint,CTime,CString
Win32程序使用MFC,即可以创建一个MFC应用程序
// MFCBase.cpp
#include <afxwin.h>
//框架窗口类
class CMyFrameWnd : public CFrameWnd
{
};
//应用程序类
class CMyWinApp : public CWinApp
{
public:
CMyWinApp()
{
}
virtual BOOL InitInstance();
};
//初始化函数:InitInstance
//退出释放函数:ExitInstance
BOOL CMyWinApp::InitInstance()
{
CMyFrameWnd* pFrame = new CMyFrameWnd;
pFrame->Create(NULL, "MFCBase");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
//应用程序类对象,MFC程序入口
CMyWinApp theApp;
(1)程序启动流程
构造theApp对象,掉调用父类CWinApp的构造函数
将theApp对象的地址保存到线程状态信息中
将theApp对象的地址保存到模块状态信息中
进入WinMain函数,调用AfxWinMain函数(打断点,通过调用堆栈进入)
AFX_MODULE_STATE aaa;//当前程序模块状态信息
AFX_MODULE_THREAD_STATE bbb; //当前程序线程状态信息
CWinApp::CWinApp()//构造全局对象CMyWinApp theApp
{
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
//获取全局变量&aaa
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
//获取全局变量&bbb
pThreadState->m_pCurrentWinThread = this;//将&theApp保存到bbb的一个成员中
AfxGetThread()
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//获取&bbb
CWinThread* pThread = pState->m_pCurrentWinThread;
return pThread;//返回的为&theApp
}
pModuleState->m_pCurrentWinApp = this;//将&theApp保存到aaa的一个成员中
AfxGetApp()
{
return AfxGetModuleState()->m_pCurrentWinApp;//返回&theApp
}
}
WinMain(...)//程序流程是不是theApp对象指导向哪走
{
AfxWinMain(...)
{
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();//这两代码都是获取&theApp
pApp->InitApplication();//利用theApp对象调用应用程序类成员虚函数 初始化
pThread->InitInstance();//利用theApp对象调用应用程序类成员虚函数 创建并显示窗口
pThread->Run()//利用theApp对象调用应用程序类成员虚函数 消息循环
{
for (;;)
{
while(没有消息时)
OnIdle(..);//利用theApp对象调用应用程序类成员虚函数 空闲处理
do{
if(GetMessage抓到WM_QUIT)
return ExitInstance();
//程序结束前,利用theApp对象调用应用程序类成员虚函数 善后处理。
}while(...)
}
}
}
}
文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout
文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件
文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"
文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules
文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure
文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板
文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server
文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d
文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c
文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...
文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy
文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos