Java图形界面事件处理与MFC的对比

MFC,JAVA 和QT 对于一个程序工作者来说,使用什么样的开发环境无疑是最为重要的。 首先,来明确几个概念: C语言:是一种面向过程的高级程序设计语言,它是目前众多计算机语言中举世公认的优秀的结构程序设计语言之一。(它只是一种语法和规约,和你使用的VC6.0或是TuberC是没有任何关系的)。 C++:在长期的编程实践中,人们认识到C的代码执行效率和可以重复使用的代码利用率并不是很高……当C语言发展到顶峰的... 阅读详情

写在前面

本博文是我根据自己的学习经验以及一些参考书籍总结出来,不具有权威性,如有错误,欢迎各位批评指出,我的邮箱:chaoyanglius@outlook.com欢迎给转载,转载请遵守CCPL协议(见文末),本文链接:http://blog.youkuaiyun.com/github_30605157/article/details/51727757.

刚刚学了MFC,感觉好吃力,有些东西实在是有点儿复杂,令人很头疼。这时我才想起Java的好,于是又把Java书翻出来,把Java的事件处理机制好好复习了一遍。下面是我根据自己的理解,将二者做了一下简单的对比。

类继承层次关系

Java GUI

p3

Java事件处理

p1

p2

MFC

p2

在MFC中的GUI以及组件是通过资源文件来产生的,而Java中则仍然采用类的形式来产生相应的界面以及组件。

事件处理方式

下面是我对Java事件处理机制的概括:

Java采用事件委托模型,该模型由事件对象、事件源、事件监听器三部分组成。当一个事件从某个事件源发生时,事件源便将事件对象传递给所有注册的监听器,监听器对象将利用事件对象中的信息决定如何对事件做出响应。

事件源与监听器之间必须先建立委托关系,建立的方法是通过调用addXXXListener函数。

比如:

Button.addMouseListener(ActionListener);

这样就将事件源Button与ActionListener之间就建立了委托关系,也叫做注册;接下来就会根据事件对象中的信息调用相应的方法来处理事件。

下面我们再来看看MFC是如何处理事件(MFC习惯称之为消息,下面改使用消息)的:

在MFC消息处理机制,有一个最重要的部分——消息映射(Message Map),这也是我们所能明显看到的部分(内部的消息处理实际上和win32很相似,内部隐藏了WinMain函数,包括窗口类的注册和产生,而且在CWinApp类的run函数里面存在消息循环,包括获取消息的GetMessage函数和分派消息的DispatchMessage函数)。当一个消息产生时系统会根据具体的消息类型,在MFC的消息映射表中找到对应的函数处理。因此,我们所做的工作就是将消息与对应的处理函数绑定即可。

NOTE:当然我这里介绍的都是表面上的、显而易见的原理,既然是对比,就应该公平的比较,因为我在上面介绍的Java的事件处理的机制也是表面上的,并未深入说明,其实大多数资料对于Java的事件委托模型的讲解也都只是讲这些东西,具体怎么实现并未详细说明;另外我在本文中对于MFC的消息处理不在做深入的讲解,因为不论网络上还是书籍(比如侯杰的深入浅出MFC)上都有丰富而又精彩的讲解。

原因分析

  • 表面上看,Java的事件处理与MFC的事件处理都同样简洁,一目了然,但这些都是表面上的,它们内部的工作都十分复杂。而且关于Java事件委托模型内部的原理(如何实现的)的资料,不管是网络上还是书籍上都很难找到;而关于MFC消息处理机制的内部原理的资料却非常的丰富。原因显而易见,Java的事件委托模型不需要理解很深入,便可驾轻就熟,而MFC如果不理解的深入一些,便很难驾驭。因为在MFC中涉及到很多的类,每个类中都可能会有一个消息映射,在将消息ID与处理函数绑定之前我们需要知道应该在哪个类的消息映射中添加,也就是说我们必须对类的层次关系以及各个类的功能有所了解。

NOTE:貌似论文中有很多关于这方面的资料,我想我是不是可以不严谨地说:Java的事件委托模型的内部实现原理更难理解一些,以致于需要专门的学者去做研究呢。我曾今尝试过阅读它的源代码,但是感觉好像比MFC更难理解一些,只是模模糊糊地看懂了一些。

  • Java封装得非常好,整个程序的工程很简洁,以致于程序员感觉不到背后工作的复杂,而对于MFC,它的封装就不如Java了,程序员在编程时依然可以看到消息处理过程的踪影——消息映射表(一系列难以理解的宏,如DECLARE_MESSAGE_MAP(),BEGIN.../ON.../END...)而且庞大的工程文件也让程序员十分的头疼。在Java程序中,程序员看不到类里面的东西,实际也不需要看到,我们只需要了解类中的方法如何使用就行了以及有哪些接口需要实现就行了;而在MFC中,程序员必须面对各种类:CXXXFrame,CXXXApp,CXXXDoc,CXXXView等等,我们必须清楚每种类具体是干什么的,我们才能对类进行修改扩展,否则的话就无从下手,因为我们连main函数(程序的入口)都找不到(当然MFC是有main函数的,只是隐藏起来了)。总结起来一句话,MFC提供给程序员的是一个框架,而Java提供给程序员的则是一个工具。使用工具当然比使用一个框架容易得多。

总结

这么说来,貌似Java好像没有MFC自由(我的确是这么认为的)。但是要自由必须付出代价:大多数的Java学习者基本上都避开了事件委托模型实现的具体方法的学习,这也是Java入门门槛低的原因,也就是说我们不必了解这些原理性的东西,照样可以写出很好的程序;而MFC就不一样了,大部分的初学者基本都要从win32程序开发开始学起,理解了win32的消息处理之后,再去学习MFC的消息处理(如何实现),这当然需要很多的精力和时间。而且同样完成一个任务,MFC的代码量相对较多,实现起来也比较繁琐。

参考资料

  1. Java核心技术卷I. Cay S.Horstmann等著.机械工业出版社
  2. Java语言程序设计. Y.Daniel Liang著. 机械工业出版社
  3. 深入浅出MFC. 侯俊杰著. 华中科技大学出版社

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

VC++6.0下的C++图形界面程序设计基础 MFC程序例子     为了完成一个作业,需要学c++的MFC(虽然它年事已高……)在学java前我是学过 照着书(当年学C++的教材)(清华大学出版社 邵兰洁主编的《C++面向对象程序设计》)写了第一个Demo出来: 书上介绍的很详细:步骤如图所示: 1.设计长方形类 构建这两个文件 MyRectangle.cpp  #include"StdAfx.h" #include"MyRectan... 阅读详情

相关推荐

图形界面编程成就了C++

图形界面编程成就了C++听有人说C#、VB比C++好是因为做界面方便还算傻得可爱,听有人说用C++做数值计算而不屑于做界面可就对不起咱C++的恩人了。这我可要说道说道。想当年C++刚出江湖,名门出身,自立门派,想抢Objective C老大的位置割据一方。但名门出身的混混也还是混混,论OO不够Objective C或SmallTalk的水准,论效率没有C的干净利索,结果折腾半天没人看得起。时至

Dev in Nightmare 1万+

C++,C#,Java,Python实现简单的图形用户界面的区别和方法

C++,C#,Java,Python实现简单的图形用户界面的区别和方法 C++: 在Windows上,可以用Windows编程或者MFC编程来实现图形用户界面,在Windows编程中,Winmain()是入口函数,windows.h是主要的头文件。它包含了其他的Windows头文件,定义了Windows的所有数据类型,数据结构,常量符号和函数原型说明。 MFC作为C++语言与Windows的接口,...

qq_44284002的博客 2207

Java - C++之MFC的TCP通讯

在服务端与客户端数据通讯时,我们是通过处理器中的通道进行通讯,这块Netty的知识不再过多说明。暂且告一段落。提示这里对文章进行总结例如以上就是今天要讲的内容。https//csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/其它-JavaMFC通讯-业务需求描述图-1.jpghttpshttpshttpshttpshttpshttpshttps。...

. 971

java消息处理机制_Java.awt & MFC消息处理机制

一,MFC消息处理机制WINDOWS 消息的种类:1、标准WINDOWS消息:这类消息是以WM_为前缀,不过WM_COMMAND例外。 例如: WM_MOVE、WM_QUIT等。2、命令消息:命令消息以WM_COMMAND为消息名。在消息中含有命令的标志符ID,以区分具体的命令。由菜单,工具栏等命令接口对象产生。3、控件通知消息:控件通知消息也是以WM_COMMAND为消息名。由编辑框、列表框和子...

weixin_39930671的博客 366

基于OpenCV与MFC实现鼠标键盘控制截图工具

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉与机器学习软件库,广泛应用于图像和视频处理领域。它支持多种编程语言(如C++、Python、Java)和多个操作系统(如Windows、Linux、macOS)。在开始图像处理之前,需先配置好OpenCV环境。以Python为例,可通过以下命令安装OpenCV:安装完成后,可以使用以下代码验证是否成功导入OpenCV:import cv2输出版本号表示安装成功。

weixin_42613360的博客 1058

别再死记公式了!用HFSS/CST手把手教你仿真一个2.4GHz WiFi的PIFA天线(附参数调试技巧)

本文详细介绍了使用HFSS和CST仿真软件设计2.4GHz WiFi PIFA天线的全流程,包括建模准备、分步操作指南和参数调试技巧。通过可视化结果和实战案例,帮助工程师快速掌握天线设计的关键参数优化方法,提升辐射性能和工作效率。

weixin_31682031的博客 331

图书管理系统mfc+sql_Java Swing MySQL图书管理系统

Java Swing MySQL图书管理系统这是一个使用swing框架写的图形界面图书管理系统,使用的数据库为mysql。程序中实现了登录和对数据库图书类别表和图书表的增删查改功能,图书类别表的字段有:类别id、类别名称、类别描述,图书表的字段有:图书id、图书名称、图书作者、图书价格、图书描述、图书类别id。运行效果:在图书管理界面和类别管理界面中,可以通过修改表格中的内容直接修改数据库中的内容...

weixin_39761558的博客 287

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5788

java .net MFC QT事件处理机制

java事件处理机制 1 开发自定义事件类。 public class PropertyEvent extends EventObject {    public PropertyEvent(){} } 2 定义监听者接口。 public interface PropertyListener extends EventListener {    public void prop

开发者说 2428

配置 NVIDIA RTX 5090 + sm_120 + flashattention,已跑通一个大模型 ~~

本文介绍了在Ubuntu 22.04系统下为NVIDIA RTX 50系显卡搭建深度学习环境的完整流程。重点包括:1)安装适配50系显卡(sm_120架构)的CUDA 12.9驱动和Toolkit,需注意禁用系统自带驱动;2)配置环境变量解决nvcc命令识别问题;3)通过源码编译方式安装支持sm_120的PyTorch nightly版本(cu129),解决官方二进制包不兼容问题。整个过程涉及显卡驱动安装、CUDA环境配置、PyTorch适配等关键步骤,并提供了详细的验证方法和常见问题解决方案。文中特别强调

qq_36674060的博客 6156

经典损失函数——均方误差(MSE)和交叉熵误差(CEE)的python实现

损失函数(loss function)用来表示当前的神经网络对训练数据不拟合的程度。这个损失函数有很多,但是一般使用均方误差和交叉熵误差等。 1.均方误差(mean squared error) 先来看一下表达式: 用于将的求导结果变成,是神经网络的输出,是训练数据的标签值,k表示数据的维度。 用python实现: def MS...

Answer3664的博客 1万+

MFC实例:[4] List Control 控件实例

MFC实例:[4] List Control 控件实例

司徒荆的博客 2万+

(实测可用)STM32L431RCT6开发板-实验1 跑马灯实验

一、开发板平台简介: 1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 3166

MFC实例:[5] ListBox 列表框控件实例

MFC实例:[4] ListBox 列表框控件实例

司徒荆的博客 4892

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

100天精通Python(爬虫篇)——第118天:selenium自动化操作浏览器基础大总结

一、Selenium框架环境搭建 1. 下载模块 2. 安装浏览器驱动WebDriver 二、基础操作 1. 打开浏览器 2. 无界面模式 3. 元素定位 4. 元素操作 5. 前进后退 6. 执行js 7.页面等待 隐式等待(常用) 显式等待(了解) 三、进阶操作 1. 使用代理ip 2. 修改请求头 3. 隐藏指纹特征.....................

努力让自己发光,对的人才能迎着光而来 10万+

Qt和MFC的比较

在当今基于C++的图形界面开发领域,能与Qt相抗衡的只有MFC。MFC是微软公司的基础类库,自然得天独厚,比如开发深层次的Windows应用远超Qt,但Qt也有杀手锏,那就是跨平台。这两点大家一目了然,下面我们再来比较一下它们的其他特点。 (1)开发速度就整体而言,MFC可能会快捷一些,因为Windows平台的开发工具大多很智能,因为立足于Windows的开发人群很广,从菜鸟到专业人士(开发人员一多,技术参考就多,周围可以咨询问题的人就多)。相比较而言,Qt基于Linux,可用的开发工具不多,而且这些工具

肖邦的夜曲的专栏 1万+

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6513

c++mfc编写实验_零基础学Windows窗口图形界面编程(不用MFC),菜鸟学完变身高手,敢与专业媲美...

又一门新的计算机课上线啦!什么课?看下面视频(以下视频是本课第一讲)用什么语言我们声明一下(这个在我们课上也跟同学强调):不要为用什么语言掐架!那是初学者的行为,为高手所不为。第二,我们这门课讲的不是C++,而是最底层windows原理,API函数。我们学的是最核心的编程。这个学会了,用什么语言都是一样的。本课,我们只是用C++作为寄主语言,或者说,以C++为例,如此而已。这些观点在本课...

weixin_30696613的博客 975

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++编写界面程序用什么框架_视频:1小时学会用C++编写Windows窗口图形界面程序,不用MFC...

今日介绍编写Windows窗口图形界面程序的准备工作:创建模板。大约30分钟,你就会啦。不用MFC说明:不用MFC,这是和很多其他课程、很多教科书不同的。我们采用的方式是:使用Windows API。通过这种方式,使用C++编写Windows窗口图形界面程序,上手将非常容易!1小时就学会噢而使用MFC,你不觉得它很臃肿吗?很费事吗?不好学吗?……这就是不用MFC的原因。本视频分为使用VC...

weixin_39801202的博客 393

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入浅出MFC

最近一两年都在搞Java,C++逐渐生疏了。现在换工作又重新搞起了C++。其实学了多种语言后,就会发现语言真的没那么重要。基础的东西,如算法、数据结构、文件操作、进程、线程、同步机制,都是超出语言而存在的。即便具体到实现代码,也是相差无几。 最近忧心忡忡,工作多年,接触太多技术,可都没有深入和系统。一定要横刀立马,誓要作出成绩。 MFC早已是弃子,但《深入浅出MFC》仍旧是如此经典,以至于超出MF...

月寒日暖的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java的效率和qt的效率_MFC与QT在读取文件效率的对比

系统win10,由于需要读取多个文件的内容比较,循环次数较多,将MFC与QT在读取文件方面进行对比,各读取一个17000行左右文件,按行读取1.MFC读取CStdioFile file;CString filePath;CString strText = _T("");CString s;nt row = 0;long st = GetTickCount64();m_path.GetWindowT...

weixin_39840153的博客 800
上一篇: 给博客签上CC协议
下一篇: 《程序员的呐喊》读书笔记(二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值