MFC笔记

我的大学--孙鑫MFC笔记教程 孙鑫MFC笔记教程(1)--Windows程序的内部运行原理   源文档 http://blog.youkuaiyun.com/liufei_learning/archive/2010/09/02/5859925.aspx> 孙鑫MFC笔记教程(2)--C++经典语法与应用 阅读详情

一.窗口类型的概述

窗口类型主要有二种即:文档类型(Document)和对话框类型(Dialog) 表单类型(Form)是介于这2种类型之间。文档类型的窗口的编程相对对话框来说要复杂得多,是我们学习的主要对象。

a)        文档类型(Document):文档类型的应用程序的界面,大部分区域用于文字或画图等读写操作,常见的有Word、Excel、写字板等。文档类型的窗口又分单文档和多文档2种类型

                       i.             多文档类型就是在一个窗口框架内有多个子窗口,常见的有Word、Excel

                                                   ii.           单文档类型当然就不可能有多个子窗口了,常见的有附件中的写字板、画图等。

b)       对话框类型(Dialog):对话框类型的界面中使用了很多控件,输入输出主要是针对控件,常见的有计算器、音量控制等。共对话框也是这种类型,只调用操作系统提供的就可以了。编程用的最多的也就是表单类型。对话框类型也可以象文档类型一样进行文字、画图等处理,而文档类型窗口中同样也可以使用控件。对话框窗口有模态和非模态2种类型。所谓模态对话框就是当前对话框不关闭,就不能切换到调用该对话框的父窗口;而所谓非模态窗口就是不关闭当前对话框,也同样可以切换到调用该对话框的父窗口。

单文档

对话框

CAboutDlg

“关于”对话框类。无须修改。

CAboutDlg

“关于”对话框类。无须修改。

CTest2App

主应用程序类,调用框架类、文档类、视图类,程序类。无须修改。

CTest3App

主应用程序类,调用主对话框类。无须修改。

CMainFrame

主框架类,即主窗口。很少需要修改。

Ctest3Dlg

主对话框类。

CTest2Doc

文档类,即存放数据主要在这儿编写代码。

CTest2view

视图类,即用于屏幕显示的类,文字显示和画图主要在这儿编写代码。

 

二.CmainFrame类

类中的PreCreateWindow()成员函数中,通过修改 CREATESTRUCT cs 来修改窗口类或样式。

typedef struct tagCREATESTRUCTW {

   LPVOID    lpCreateParams;     //指向创建窗口用的数据的指针

   HANDLE    hInstance;          //窗口的实例句柄

   HMENU     hMenu;              //窗口的菜单句柄

   HWND      hwndParent;         //窗口句柄

    int       cy;                 //窗口的高度

    int       cx;                 //窗口的宽度

    int       y;                  //窗口的左上角的y座标

    int       x;                  //窗口的左上角的x座标

   LONG      style;              //窗口的类型

   LPCSTR    lpszName;           //指向窗口的名称的指针

   LPCSTR    lpszClass;          //指向窗口类的名称的指针

   DWORD     dwExStyle;          //窗口的扩展类型

} CREATESTRUCTW, *PCREATESTRUCTW,*LPCREATESTRUCTW;

   

框架类主要处理窗口的类型、边框、位置、大小以及子窗口(对于多文档来说)等内容,工具条、状态条也是这个类的成员变量。如果要添加成员变量时,初始化要在CMainFrame()构造函数中添加代码;OnCreate()成员函数是消息WM_CREATE的处理函数,这里面根据需要修改代码(一般不需要);PreCreateWindow()成员函数是创建主窗口前的设置,调整窗口位置、大小、类型等都是在这儿修改代码。

三.文档类

文档类主要用来处理数据。例如画一个图,图的各节点座标、颜色、线条的粗细等都有文档类来处理,文件的保存和打开等当然也是文档类来处理。

四.            视图类

主要处理数据的显示,例如:文字在窗口中显示、键盘鼠标操作等都是由视图类来处理。视图类不断地从文档类取数据,不断地对文档类传送数据。当文档类数据较多时,视图类显示的数据只是文档类的一部分。

五.            主应用程序类

主应用程序类是程序的入口,其它各个类都是在这儿集成的。这个类除构造函数之外,唯一要注意的就是初始化函数。这个类一般不修改。

单文档

对话框

Ctest2App()

构造函数

Ctest2App()

构造函数

InitInstance()

初始化成员函数

InitInstance()

初始化成员函数

OnAppAbout()

由菜单发出的消息处理函数

 

 

 

单文档

对话框

BOOL Ctest2App::InitInstance()

{

     InitCommonControls();

     CWinApp::InitInstance();

    if (!AfxOleInit())

    {

         AfxMessageBox(IDP_OLE_INIT_FAILED);

        return FALSE;

    }

     AfxEnableControlContainer();

     SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

   

    //加载标准 INI 文件选项(包括 MRU)

     LoadStdProfileSettings(4);

 

    //上面内容不用太关注,以下是重点

    //注册应用程序的文档模板。文档模板

    //将用作文档、框架窗口和视图之间的连接

     CSingleDocTemplate* pDocTemplate;

    pDocTemplate  = new CSingleDocTemplate(

         IDR_MAINFRAME,

         RUNTIME_CLASS(Ctest2Doc),

         RUNTIME_CLASS(CMainFrame),

         RUNTIME_CLASS(Ctest2View));

    if (!pDocTemplate)

        return FALSE;

     AddDocTemplate(pDocTemplate);

    //分析标准外壳命令、DDE、打开文件操作的命令行

     CCommandLineInfo cmdInfo;

     ParseCommandLine(cmdInfo);

    //调度在命令行中指定的命令。如果

    //用 /RegServer、/Register、/Unregserver

    //或 /Unregister 启动应用程序,则返回 FALSE。

    if (!ProcessShellCommand(cmdInfo))

        return FALSE;

    //唯一的一个窗口已初始化,因此显示它并对其进行更新

     m_pMainWnd->ShowWindow(SW_SHOW);

     m_pMainWnd->UpdateWindow();

    //仅当存在后缀时才调用 DragAcceptFiles,

    //在 SDI 应用程序中,这应在 ProcessShellCommand

    //之后发生

    return TRUE;

}

BOOL Ctest3App::InitInstance()

{

     InitCommonControls();

     CWinApp::InitInstance();

 

 

 

 

 

     AfxEnableControlContainer();

     SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

 

 

 

 

    //上面内容不用太关注,以下是重点

    Ctest3Dlg  dlg;

    m_pMainWnd =  &dlg;

    INT_PTR  nResponse = dlg.DoModal();

    //下面的程序注意:对话框窗口已经被关闭

    if (nResponse == IDOK)

    {

        // TODO: 在此放置处理何时用“确定”来关闭

        //对话框的代码

    }

    else if (nResponse == IDCANCEL)

    {

        // TODO: 在此放置处理何时用“取消”来关闭

        //对话框的代码

    }

 

    // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,

    // 而不是启动应用程序的消息泵。

    return FALSE;

}

 

 

 

 

 

 

 

 

六.            WinMain()函数在哪儿

MFC把千篇一律的WinMain()函数写在①crtexec.c中,在编译完后链接时才组装到你的exe程序中。运行时,这个WinMain()函数调用MFC的全局函数AfxWinMain(),这个全局函数AfxWinMain()是写在②appmodul.cpp中的。在AfxWinMain()函数中做三件事,③注册窗口类、④调用应用程序类的初始化函数InitInstance()、⑤调用应用程序类的Run()函数(实际上是父类的父类CWinThread的Run()成员函数)。

上面这个Run()函数中包含消息循环,而InitInstance()函数又将框架类、文档类、视图类结合在一起,于是所有的类全部集成起来了,然后在主应用程序类、框架类、文档类、视图类里面接受这些消息并处理。编程的重点在文档类和视图类,什么样的消息,执行什么样的处理函数,这样就有效地将数据和控制分离开来。

七.            消息处理

与窗口有关的消息(即以“WM_”开头的消息),只能在框架类和视图类中处理;来自菜单或工具条的命令事件,则框架类、视图类、主应用程序类、文档类全部可以处理。这其中有优先级别高低的问题,一个类接受到命令消息时,先传给比自己级别高的类,如果未处理再自己处理。如果自己也不处理,则传给比自己级别低的类。这个优先级别是:视图类>文档类>文档模板类>框架类>主应用程序类>MFC缺省的处理程序中。

八.            添加、删除消息处理

添加一个消息处理,一般要改动三个地方,以WM_LBUTTONDOWN消息为例,①在视图类的定义(test2View.h)中添加一个成员函数,②在视图类(test2View.c)中添加一条消息映射,③在视图类(test2View.c)中实现消息处理的成员函数。

九.            程序入口

主应用程序类是从CWinApp类继承的,作用相当于WinMain程序;CMainFrame是从CFrameWnd类继承的,其作用相当于WndProc程序。也就是说,消息首先由框架类接受,然后按优先顺序传给其它的类。文档类和视图类由消息来驱动(视图类的PreCreateWindow()除外)。

“Ctest2App theApp;”,这便是整个应用程序的总入口。MFC的crtexec.c的WinMain()函数调用test2.cpp中的“Ctest2App theApp;”。theApp是类的实例,自然也是必然要调用主应用程序类的构造函数,包括父类的构造函数,之后再调用MFC的appmodul.cpp中的AfxWinMain()函数,由AfxWinMain()函数调用主应用程序类的InitInstance()成员函数。

在主应用程序类的InitInstance()成员函数中,定义了框架类、文档类、视图类的实例,从而间接地调用了框架类的PreCreateWindow()和OnCreate()成员函数,由OnCreate()函数再调用视图类的PreCreateWindow()成员函数。然后再回到主应用程序类的InitInstance()成员函数中,执行“m_pMainWnd->ShowWindow(SW_SHOW);”和“m_pMainWnd->UpdateWindow();”。

 

十.            公共对话框MessageBox

在MFC的CWnd类中封装了一个MessageBox()成员函数,但MSDN并不推荐使用,一般用AfxMessageBox()全局函数

intAfxMessageBox(          

intAFXAPI AfxMessageBox(

LPCTSTR    lpszText,

UINT       nIDPrompt,            //要表示的字符串

UINT       nType = MB_OK,

UINT       nType = MB_OK,         //画面形状(按钮、模式、图标、缺省值4个值组合使用)

UINT       nIDHelp = 0            

UINT       nIDHelp = (UINT) -1    //帮助ID,缺省为0

);                             );

 

返回值

说明

0

不能正常表示

IDYES

                                                                      被按下

IDNO

     被按下

IDOK

     被按下

IDCANCEL

     被按下或【ESC】被按下

IDABORT

     被按下

IDIGNORE

     被按下

IDRETRY

     被按下

显示按钮

说明

ID_ABORTRETRYIGNORE

                

ID_OK

    

ID_OKCANCEL

          

ID_RETRYCANCEL

          

ID_YESNO

          

ID_YESNOCANCEL

                

模式

说明

ID_APPMODAL

模态(缺省值)即不关闭就不能回到父窗口,但可以切换到其它应用程序。

ID_SYSTEMMODAL

系统模态即不关闭就不能回到任何窗口。

ID_TASKMODAL

特殊用途而备用。

显示图标

说明

ID_ICONEXCLAMATION

      感叹符号

ID_ICONINFORMATION

      情报符号

ID_ICONquestion

      问号

ID_ICONSTOP

      停止符号

缺省按钮

说明

ID_DEFBUTTON1

第一个探针为缺省按钮。

ID_DEFBUTTON2

第二个探针为缺省按钮。

ID_DEFBUTTON3

第三个探针为缺省按钮。

 

十一. MFC特有的规则

a)       类型:MFC将C++的关键字用宏定义成以下内容。

MFC类型

意思

C++类型

BOOL,BOOLEAN

布尔型

boolean

BYTE

1字节数值型

char

WORD

2字节数值型

short

DWORD

4字节数值型

int

UINT

无符号整型

unsigned int

VOID

void型

void

LPDWORD

DWORD的指针型

int*

LPCSTR

常量字符串

const char*

LPSTR

字符串

char*

LPCVOID

常量void指针

const void*

LPVOID

void指针

void*

b)       命名规则:MFC有以下命名规则。

                       i.             类名:以大写的C开头,单词的首字母大写,单词之间不用下划线。

                     ii.             成员函数和全局函数:以单词的首字母大写,单词之间不用下划线。全局函数前再加Afx

                   iii.             成员变量:匈牙利命名法,以“m_”开头,单词的首字母大写。

                   iv.             宏、类型名:全部使用大写。

 

十二.      用TRACE宏调试

TRACE()宏函数来调试程序,TRACE()宏函数只在DEBUG状态有效,即按<F5>运行时有效,<Ctrl + F5>时无效。断点也可以设置条件。如,断点的条件是“i>5”。

for(int i=0; i<10; i++) {

TRACE("i = [%d]\n", i);

 

100天学习MFC 读书笔记 060719 经过一轮的徘徊,灰心,..........................之后,暂定100天,看看能否入门,为了记念大学时的梦想,为了兴趣.学习内容按孙鑫的教程,>(暂不论这本书好坏,就是贵了点)(后记,原来已经有很多人作这个笔记了...............................................................)白天正常上班,学习只能抽空了 阅读详情

相关推荐

MFC学习笔记001

教程:B站黑马程序员MFC教程(3天) 网址:https://www.bilibili.com/video/BV1JW41147NX?p=1 需要下载API: VC++之MFC类库中文手册(修正者:一怀去意) (注:百度可以找到,百度网盘下载) 课程安排 第一天(Win消息机制,SDK编程基础): 1,基本概念介绍(SDK,API,句柄,消息队列,WinMain函数) 2,第一个Windows界面程序(WinAPI) 3,消息循环和窗口过程函数 4,第一个MFC程序(CWinApp,CFrameWnd)

m0_49218979的博客 1133

Windows常用API

目录:   1:MessageBox        -------------------------------- 1 2:MessageBox        ---------------------------------4 3:MessageBox        -------------------------------- 6 4:ShowWindow        ----

wadesun_2020的博客 2万+

MFC学习笔记

##MFC 二维变化实验 根 目录: 1、添加 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O 检查列表:Ctrl/Command + Shift + C 插入代码:Ctrl/Command + Shift +

amy_1218的博客 1002

sizeof进行结构体大小的判断

typedef struct{    int a;    char b;}A_t;typedef struct{    int a;    char b;    char c;}B_t;typedef struct{    char a;    int b;    char c;}C_t;void main(){    char*a=0;    cout    cout         cout 

van150 4万+

《深入浅出MFC第2版》读书笔记(一)

第0章 你一定要知道(导读)        我是先知道有侯俊杰(侯捷)这样的一个人物,之后才知道有一本叫做《深入浅出MFC》的书是他的。        当我第一次真正有机会亲手捧起这本书的时候,其实我已经度过了MFC入门阶段,并且处于一个桀骜不驯的时期。什么是桀骜不驯的时期呢,当年我正在念大学,那个学期数据结构老师布置了个大作业,要求用VC来做客户端,但是在大学的教程安排里面是没有VC这门

duxiuxing的专栏 1282

VS2015串口通信编程(MFC)笔记

3. 选用MSCOMM控件方式进行串口通信 (1). 只能打开不大于COM16的串口;该控件不能在其他线程中直接被调用,但可以将其操作封装到函数中被间接使用。 (2). 接收:MSCOMM控件中断事件,用于接收下位机消息。 (3). 发送:另外创建一个子线程用于控制发送流程。 m_pThread = AfxBeginThread(UpgradeThread, (LPVOID)(this), THREAD_PRIORITY_BELOW_NORMAL, 256 * 1024);//stack size = 25

sqh9595的博客 2万+

MFC结构体的定义标准,可参考

明月清风 精进不止 3096

MFC工作笔记0002---MFC HelloWorld程序

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 1. class MyApp:public CWinApp这个意思是说 MyApp:继承自CWinApp 2. 这里public: BOOL InitInstance() 这个是定义了一个公有的方法 这里是创建了一个类的指针,分配了一块堆内存 给Frame这个对象. 然后: 这里是分别调用这个frame类中的,这两个方法 这个是把这个指针...

添柴程序猿的专栏 538

DC--类库MFC中的结构体

在MFC中,一个DC(device context)是一个结构体,它定义了图形对象的参数设置以及它们的属性,还有影响输出结果的模式选择。通过CDC类进行各种绘图操作,例如选笔,选色,选涂色的花样,选“画”字的大小字体,画直线曲线多变性,画图像(照片)等,可以“画”到屏幕上,“画”到打印机上,“画”到文件里。图形对象包括画线的笔,绘图和填充用的画刷,可以复制的位图或者屏幕的卷动,用于可用颜色定义的调

HappyJandun's 学习笔录 1320

Windows下高效部署llama.cpp:从环境配置到模型量化的完整指南

本文提供了一份详尽的Windows系统下部署llama.cpp的完整指南。内容涵盖从Python环境配置、使用CMake与MinGW编译工具链的搭建,到编译llama.cpp项目、获取并转换模型为GGUF格式,以及执行模型量化和基础推理测试的全过程。指南旨在帮助开发者在普通Windows电脑上,无需高端显卡,仅凭CPU即可高效运行大语言模型,并重点解决了部署过程中常见的环境与编译错误。

weixin_28841265的博客 880

硅谷刷屏的ClawdBot,让Mac mini卖爆了!创始人爆料:一人开发、100% AI 写代码

这两天,个人 AI 助手 ClawdBot 席卷硅谷,国内外社交平台上全是关于它的讨论。 在试用后,网友们纷纷给出了很高的评价。“它是迄今为止最伟大的 AI 应用,相当于你 24 小时全天候专属 AI 员工。”Creator Buddy 创始人兼 CEO Alex Finn 盛赞道,“这就是他们 (Anthropic) 希望 Claude Cowork 呈现的样子。”

技术引领业务创新 1584

MFC 类库结构 总结

MFC主要类库结构总结 MFC类主要分为应用程序结构类、窗口支持类、图书设备类、模版集合类、简单数据类型类以及全局AFX函数等6个类。 1.应用程序结构类 应用程序结构类代表的是应用程序的基本元素,主要包括了CcmdTarget类、CwinThread类、CwinApp类、Cdocument类以及CdocTemplate类等。应用程序开始运行时,应用程序结构类最先被初始化。应用程...

u011555996的博客 2229

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 136

Visual C++MFC编程实例 学习笔记

最近在看这本书--《Visual C++MFC编程实例》,总体感觉是挺不错的,所以准备写一下笔记。

Jacky_Dai的专栏 445

从零到一:嵌入式车载通信中间件VSOMEIP的跨平台构建之旅

本文详细介绍了嵌入式车载通信中间件VSOMEIP的跨平台构建过程,重点解析了交叉编译环境配置、Boost库编译、VSOMEIP定制化编译等关键技术环节。通过实战案例展示了在ARM架构嵌入式设备上的部署与调试方法,为开发者提供了一套完整的VSOMEIP嵌入式应用解决方案。

lilh34434的博客 196

7.6 GPU页表更新机制

本文分析了AMDGPU驱动中BO到VA映射的页表更新实现机制。核心流程通过amdgpu_vm_bo_update()函数触发,支持CPU直接写入和SDMA异步命令两种更新模式。系统根据VRAM可见性自动选择最优更新策略,处理三种主要场景:命令提交、BO迁移和BO销毁。关键实现包括DMA地址数组处理、权限标志合并和BO迁移状态转换,最终通过amdgpu_vm_update_range()完成硬件页表更新。该机制有效平衡了更新延迟与吞吐量,为GPU虚拟内存管理提供基础支撑。

图形/计算GPU的驱动与虚拟化技术分享园地 2466

Windows 编程学习笔记目录

MFC学习笔记

2401_82825368的博客 1704

7、刚度矩阵与弹簧元素:有限元分析的核心

本文深入探讨了有限元分析中的核心概念——刚度矩阵与弹簧元素。详细介绍了刚度矩阵的定义、构建方法及其对称性、正定性和稀疏性等性质,同时解析了弹簧和阻尼器元素的特性及其在模拟复杂系统中的应用,如液压缸、减震器等。通过结合刚度矩阵与弹簧元素,可以提高结构模型的精度并模拟复杂的工程系统。文章还讨论了优化策略、验证流程、误差分析及实际应用案例,展示了这些技术在桥梁分析、汽车悬挂系统等领域的重要作用,并展望了其在未来新材料、智能结构和数字孪生技术中的发展潜力。

nice1的博客 235

《深入浅出MFC》第一、二章笔记

前言因工作需要,重新编写MFC程序,虽然在这个年代,MFC大大地没落了,但是也还得认真了解这个框架,因此重新学习《深入浅析MFC》。 本书是一本非常经典的书籍,很值得读。第一章笔记在本章中,作者指出:如果读者不了解Win32程序的写法,不熟悉C++语言,那么不要看本书,看了会受到打击。去年我就是这样。作者在本章中介绍了Windows系统是消息驱动,强制多任务系统,Win32程序生成与消亡的过程,消

cxzq2010的专栏 318

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3059

Linux内存管理(17):percpu 分配器——基本原理

随着 SMP(对称多处理器架构)的发展,在享受处理器更快的执行效率的同时,也为数据同步带来了更大的挑战,因为在 SMP 架构中,程序确实是在并发执行,从单 CPU 只需要考虑调度风险,到SMP 中还需要考虑多 CPU 中同时执行的风险,而且在单 CPU 下乱序执行也会在 SMP 架构中带来,从而也衍生了一些新的同步机制,例如:内存屏障、percpu 机制等等。

私房菜 1249

深入浅出MFC学习笔记--转载从优快云,

侯捷《深入浅出MFC》 深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质) http://blog.youkuaiyun.com/ithzhang/article/details/7622830 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)  http://blog.youkuaiyun.com/ithzhang/arti

u010153219的专栏 735

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: C++笔记
下一篇: 正确解决 Invalid module format
shell812
博客等级 码龄18年 202粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值