聚集网(jujiwang.com) - 收录免费分类目录信息软文发布网址提交
免费加入

mainwin32 与 .NET 的对比:优缺点分析 (mainwindow是什么程序)

文章编号:10617时间:2024-09-28人气:


mainwin32

前言

MainWin32 和 .NET 都是流行的 Windows 开发框架。MainWin32 是一种基于 C 语言的底层框架,而 .NET 是一种基于托管代码的现代框架。开发者在选择合适的框架时须权衡多种因素。本文将对 MainWin32 和 .NET 进行对比分析,帮助开发者做出明智决策。

优缺点对比

MainWin32

优点:性能出色:MainWin32 是一个底层框架,提供了对 Windows API 的直接访问,这使其具有出色的性能。高控制性:开发者拥有对底层代码的完全控制,这使得他们可以创建高度定制的应用程序。低系统开销:MainWin32 的系统开销很低,使其非常适合开发轻量级和资源受限的应用程序。缺点:学习曲线陡峭:MainWin32 需要开发者对 Windows API 有深入的了解,学习曲线陡峭。代码复杂度高:MainWin32 需要开发者手动管理内存和资源,这可能导致代码复杂度较高。缺乏现代功能:MainWin32 缺乏某些现代功能,例如集成的垃圾回收和类型安全。

.NET

优点:易于使用:.NET 是一种托管框架,提供了直观的语法和简化的开发体验。高效开发:.NET 集成了各种库和工具,使开发者能够快速高效地开发应用程序。丰富的功能:.NET 提供了广泛的功能,例如垃圾回收、类型安全和跨平台支持。缺点:性能较低:与 MainWin32 相比,.NET 的性能较低,因为它需要额外的步骤来管理托管代码。系统开销较高:.NET 具有较高的系统开销,因为它需要运行时环境和垃圾回收器。许可费用:虽然 .NETFramework 是免费的,但 Visual Studio 等开发工具需要付费许可。

适用场景

适合使用 MainWin32 的场景:需要高性能和低系统开销的应用程序需要高度定制的应用程序需要对底层代码有完全控制的应用程序适合使用 .NET 的场景:需要快速开发和易于维护的应用程序需要跨平台支持的应用程序需要现代功能的应用程序

结论

MainWin32 和 .NET 都是适用于 Windows 开发的强大框架。在选择合适的框架时,开发者应考虑应用程序的特定要求和制约因素。MainWin32 提供了出色的性能和控制度,而 .NET 提供了易于使用和丰富的功能。通过权衡优缺点并考虑适用场景,开发者可以做出明智的决策,以选择最适合其项目需求的框架。

vb.net怎么确定一个pid是否存在?

正好我写个一个函数封装在DLL里了,代码是这样的:

检查进程是否运行 要检查的进程名 Public Function CheckProcessByName(ByVal ProcessName As String) As BooleanDim MgmtClass As New ManagementClass(Win32_Process)Dim rtnVal As Boolean = FalseDim mo As New ManagementObject()For Each mo In ()If mo(Name)()() = () ThenrtnVal = TrueEnd IfNextReturn rtnValEnd Function知道PID的话: 返回所有窗口句柄 Public Function ListAllProcessesHandle() As StringDim sb As New StringBuilder()Dim p As New Process()For Each p In (.)TryIf > 0 (句柄: + () + )End IfCatchEnd TryNextReturn ()End Function 窗口隐藏进程总有吧,函数调用的参数是进程名,不是窗口名。函数是自己写的没有调用API

c语言中,在main函数一开始定义了 int i;后来又在for语句中有int i 这样的语句,为什么编译时出错。

C语言是一种计算机程序设计语言。 它既有高级语言的特点,又具有汇编语言的特点。 它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。 因此,它的应用范围广泛。 C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。 它是数值计算的高级语言。 常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C等等......C语言的缺点1. C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。 2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。 从应用的角度,C语言比其他高级语言较难掌握。 [C语言指针]指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。 C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。 Java取消了指针操作,提高了安全性。 C源程序的结构特点1.一个C语言源程序可以由一个或多个源文件组成。 2.每个源文件可由一个或多个函数组成。 3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。 4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。 5.每一个说明,每一个语句都必须以分号结尾。 但预处理命令,函数头和花括号“}”之后不能加分号。 6.标识符,关键字之间必须至少加一个空格以示间隔。 若已有明显的间隔符,也可不再加空格来间隔。 学习C语言在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺,大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题,回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学的好?学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。 学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。 那么,我们如何学好《C程序设计》呢?一.学好C语言的运算符和运算顺序这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。 在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。 当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。 在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。 先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序.二.学好C语言的四种程序结构(1)顺序结构顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。 例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径 r,计算s = 3.*r*r,输出圆的面积s。 不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。 (2) 分支结构顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。 对于要先做判断再选择的问题就要使用分支结构。 分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。 分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。 分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。 程序流程图是根据解题分析所绘制的程序执行流程图。 学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。 嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。 下面我介绍几种基本的分支结构。 ①if(条件){分支体}这种分支结构中的分支体可以是一条语句,此时“”可以省略,也可以是多条语句即复合语句。 它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。 如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x;②if(条件)else这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。 如:求ax^2+bx+c=0的根分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。 其程序段如下:d=b*b-4*a*c;if(d>=0){x1=(-b+sqrt(d))/2a;x2=(-b-sqrt(d))/2a;printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);}else{r=-b/(2*a);i =sqrt(-d)/(2*a);printf(“x1=%8.4f+%8.4fi\n”r, i);printf(“x2=%8.4f-%8.4fi\n”r,i)}③嵌套分支语句:其语句格式为:if(条件1) ;else if(条件2) else if(条件3) ……else if(条件n) else 嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。 ④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if… else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。 这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。 (3)循环结构:循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即 goto循环、while循环、do –while循环和for循环。 四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。 常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。 特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。 在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。 另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与 if构成的循环,是不能用break和 continue语句进行控制的。 顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。 在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。 (4)模块化程序结构C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。 三.掌握一些简单的算法编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。 这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。 如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学C源程序的关键字---------------------------------------------------------------------------------------所谓关键字就是已被C语言本身使用, 不能作其它用途使用的字。 例如关键字不能用作变量名、函数名等由ANSI标准定义的C语言关键字共32个 :auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。 1 数据类型关键字(12个):(1) char :声明字符型变量或函数(2) double :声明双精度变量或函数(3) enum :声明枚举类型(4) float:声明浮点型变量或函数(5) int: 声明整型变量或函数(6) long :声明长整型变量或函数(7) short :声明短整型变量或函数(8) signed:声明有符号类型变量或函数(9) struct:声明结构体变量或函数(10) union:声明联合数据类型(11) unsigned:声明无符号类型变量或函数(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)(2)控制语句关键字(12个):A循环语句(1) for:一种循环语句(可意会不可言传)(2) do :循环语句的循环体(3) while :循环语句的循环条件(4) break:跳出当前循环(5) continue:结束当前循环,开始下一轮循环B条件语句(1)if: 条件语句(2)else :条件语句否定分支(与 if 连用)(3)goto:无条件跳转语句C开关语句(1)switch :用于开关语句(2)case:开关语句分支(3)default:开关语句中的“其他”分支Dreturn :子程序返回语句(可以带参数,也看不带参数)3 存储类型关键字(4个)(1)auto :声明自动变量 一般不使用(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)(3)register:声明积存器变量(4)static :声明静态变量4 其它关键字(4个):(1)const :声明只读变量(2)sizeof:计算数据类型长度(3)typedef:用以给数据类型取别名(当然还有其他作用(4)volatile:说明变量在程序执行中可被隐含地改变

关于electron-builder打包遇到的一点点问题

Electron打包一开始时出现error,去解决真的好累,报错一个接一个,而且我这和网上一些bug解决方案还有点不同,不能照抄别人的作业。

本次我使用的electron打包工具是electron-builder(以后就换其他的试试)

当然也是我学艺不精了?

打包正常流程

在说自己错误经历之前,先走一遍可以正确打包的流程吧

为了让流程看起来干净些,创建一个独立的electron项目

使用yarninit命令创建项目,注意需要写明author作者和description描述,后续打包时如果没有会出现报错

使用yarnaddelectron-D和yarnaddelectron-builder命令安装需要的程序包。安装完程序包后,在中添加运行命令和打包命令

scripts:{start:electron.,electron:build:electron-builder--win--x64},

如果yarnaddelectron-D出错,可以看看是不是和我这篇文章中的错误相似:《yarnaddelectron安装失败》?

的对比

我在之前使用vue和vuecli4创建了一款简易的小说阅读器,现在将其使用yarnbuild命令打包出来,生成了一份dist

里面的页面可以直接在浏览器中打开,就能够直接看到效果。不过现在先将此文件夹改个名字在放入electron项目中,不然的话等等会和打包出来文件夹名字重复

在同级目录下创建一个入口文件,该文件是electron所必须的程序进入文件

可以像下面这样写,这是一种较为简单的入口文件写法:

constelectron=require(electron);//控制应用生命周期的模块。const{app}=electron;//创建原生浏览器窗口的模块。const{BrowserWindow}=electron;letmainWindow;functioncreateWindow(){//创建浏览器窗口。mainWindow=newBrowserWindow({width:480,height:670});//加载应用的。(`file://${__dirname}/common/`);//启用开发工具//();}//Electron会在初始化后并准备(ready,createWindow);//当全部窗口关闭时退出。(window-all-closed,()=>{//否则绝大部分应用及其菜单栏会保持激活。if(!==darwin){();}});(activate,()=>{//绝大部分应用会重新创建一个窗口。if(mainWindow===null){createWindow();}});

现在就可以尝试使用yarnstart命令运行electron了,如果不出意外的话,会成功跳出小说阅读器界面

此时小说阅读器并没有打包

接下来,使用yarnelectron:build命令进行打包,一路顺利,没有报错,就能看到生成了一个dist文件夹

PS:在编写build去对打包进行配置,我一开始以为这是必须的,后来发现即使不写,基础打包也可以成功。

在此文件夹中,如果使用打开文件,那么将会进行安装程序,并且桌面会出现程序图标,点击即可打开项目。 此时已经是标准的桌面应用的了。

当然如果不想安装,只是想看看打包后的结果,可以打开内部的win-unpacked/,这样能跳过安装直接启动程序。

到目前为止,一个正确无误的打包流程就走完了!

项目打包遇到各种问题

那么接下来,就说说我真正的错误之路吧:

省略一些中间的步骤,直到上面所说的第四步为止,我一切都还是顺利的。

那么问题就出在第五步上,yarnelectron:build

问题1

运行此命令时,一开始还是挺顺利的,但是很快遇到了第一个问题:

?Get当遇到打包报错,肯定是哪里不会搜哪里了,发现原因还是和连接有关,根据网上找到的参考文章,可以通过先将下载下来,然后放到C:\Users\Administrator\AppData\Local\electron\Cache文件夹下。

参考文章:

同时分享一下下载包地址:

但是很尴尬的是,我Local下这并没有electron文件夹。那么能否自己创建一个然后放入呢?

答案:不行,自己创建了一个electron也没有用,后来想是不是因为我没有全局安装electron,可以把这放入项目的node_modules里,不过还是失败了,只能另辟蹊径,在中进行配置。(后面的nsis和winCodeSign也同样如此)

其实这可能和这台电脑一开始的配置有关系,因为后来我使用自己笔记本,发现Local下是存在electron和electron-builder两个文件夹的。

在下载文件到本地失败后,我采用在中进行设置electron_mirror路径的方式。

的打开路径在C:\Users\用户文件夹下,同时也可以使用cmd命令直接打开此文件:npmconfigedit

然后通过添加一句话:electron_mirror=这样包就能够成功安装了

问题2

成功解决了的问题之后,我又遇到了新的问题:

?Get这两种同样也是在中进行配置的,添加的是electron-builder-binaries_mirror的路径:

electron-builder-binaries_mirror=其实一开始我添加的是路径,但是发现会出现报错,没有这个地址,然后经过实际下载才发现nsis-3.0.4.1.7z的地址是,所以对electron-builder-binaries_mirror进行了重新设置,然后成功了

现在让我重新进行打包,发现到此,没有出现任何报错,并且打包成功了

我遇到的问题终于解决了,和网上找到的直接下载包到本地方式不同,解决方案是修改了下载源。最后我发现成功一次之后,把中的修改下载源注释掉后续打包也可以成功了?

总结

这个打包问题当时改的我心累,因为我下载到本地也还是不成功,最后修修改改,通过修改成功。 期间甚至想放弃electron-builder这种方式打包,中间我去用了一下ElectronForge。 发现这个居然输入命令要在gitbash里,并且会对你的重写,这还是算了。

现在electron打包应该还有一种electron-package的方式,不过我没有去尝试,可能也是当时对builder已经上头了,一心要解决掉这个报错。

遇到报错,努力一把,总会攻克的。(当然这个问题困了你一天以上,建议找找其他替代方案)

原文:

CMAKE_RC_COMPILER 是什么东西

cmake vs qmakeqmake 是为 Qt 量身打造的,使用起来非常方便cmake 使用上不如qmake简单直接,但复杂换来的是强大的功能内置的 out-of source 构建。 (目前QtCreator为qmake也默认启用了该功能,称:shadow build)为各种平台和场景提供条件编译可处理多个可执行文件情况,和很好配合 QtTest 工作如何选择?Using CMake to Build Qt Projects 一文中说:对简单的Qt工程,采用 qmake对复杂度超过 qmake 处理能力的,采用 cmake尽管如此,如果简单Qt的工程都不知道怎么用 cmake 构建,复杂的工程,就更不知道如何使用 cmake 了。 还是从简单的学起吧简单的 Qt 程序#include CoreApplication>#include int main(int argc, char** argv){QCoreApplication app(argc, argv);qDebug()< -O coff -i -o )endif(MINGW)SET(example_SRCS res/)SET(example_MOC_SRCS mainwindow.h widget.h)QT4_WRAP_CPP(example_MOCS ${example_MOC_SRCS})QT4_ADD_RESOURCES(example_RCC_SRCS )SET(example_SRCS ${example_SRCS} ${example_MOCS} ${example_RCC_SRCS})ADD_EXECUTABLE(example WIN32 ${example_SRCS})TARGET_LINK_LIBRARIES(example ${QT_LIBRARIES})对Qt的资源文件,使用 QT4_ADD_RESOURCES 来调用rcc进行预处理对 Windows 资源文件,直接和源文件一样,添加到列表中即可。 只是:MinGW 下仅仅这么做还不行,上面的 MinGW 块用来修复这个问题Debug 与 Releaseqmake使用 qmake 时,可以在 pro 文件内分别为两种模式设置不同的选项。 使用时,可以直接 make release 或 make debug 来编译不同的版本cmake不同于 qmake,由于 cmake 采用 out-of-source 方式。 故:建立debug release两目录,分别在其中执行cmake -DCMAKE_BUILD_TYPE=Debug(或Release)需要编译不同版本时进入不同目录执行make对生成 msvc 工程的情况, CMAKE_BUILD_TYPE 不起作用。 生成工程后使用IDE自带的模式选择。

如何看MFC程序代码

.NET

如何看MFC 程序代码 看下面内容之前,建议你学学《深入浅出MFC》,这本书强烈推荐! 现在只是做个了解。 不妨做个知识备份! 在MFC 程序中,我们并不经常直接调用Windows API,而是从MFC 类创建对象并调用属于这些对象的成员函数.也就是说MFC 封装了Windows API 你说你喜欢C++而MFC 换一种说法就是一个用C++写的一个函数库然后你来调用只不过这个类不是你写的MFC 提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp 和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。 1 封装特性:构成MFC 框架的是MFC 类库而MFC 类库又是C++的一个类库。 这些类封装WIN32 应用程序编程接口,OLE(Object Link Embed 对象链接嵌入) 特性,ODBC 和DAO 数据访问的功能。 2 继承特性:MFC 抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是 CObject 类和CCmdTarget 类,程序员可以从适当的MFC 类中派生出自己的类,实现特定的功能达到编程的目的。 3 虚拟和消息映射:MFC 是以C++为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC 仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。 但是MFC 建立了消息映射机制这样降低了内存的使用却大大提高了效率消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC 将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序.它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V 表),节省内存。 MFC 消息映射机制:将消息与消息处理函数联系起来,形成一一对应的机制。 消息映射宏声明:DECLARE_MESSAGE_MAP 定义:BEGIN_MESSAGE_MAP ON_COMMAND ON_CONTROL ON_MESSAGE END_MESSAGE_MAP MFC 主要组成部分:类、宏和全局函数。 类是MFC 中最主要的内容。 MFC 类是以层次结构方式组织起来的。 MFC 中的类分成两部分,除了一些辅助类,大多数的MFC 类是直接或间接从根类CObject 派生而来。 MFC 宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。 MFC 约定:全局函数以Afx为前缀,全局变量以afx为前缀MFC 类的层次关系CObject 项目类)-CCmdTarget(消息响应类)-{CWinThread(线程类)-CWinApp(Window 应用程序类)CDocument(文档类)CWnd(窗体类)-[CFrameWnd(框架类)CView(视图类)]}CObject 类由于MFC 中大部分类是从CObject 类继承而来的,CObject 类描述了几乎所有的MFC 类的一些公共特性,CObject 类为程序员提供了对象诊断、运行时类型识别和序列化等功能。 CCmdTarget 类由CObject 类直接派生而来,它负责将消息发送到能够响应这些消息的对象。 它是所有能进行消息映射的MFC 类的基类。 CWinApp 类在任何MFC 应用程序中有且仅有一个CWinApp 派生类的对象,它代表了程序中运行的主线程,也代表了应用程序本身。 CWinApp 类取代了WinMain()主函数在SDK 应用程序中的地位。 传统SDK 应用程序 WinMain()函数完成的工作。 现在由类CWinApp 的InitApplication(), InitInstance()和Run()三个成员函数承担。 CWnd 类由CCmdTarget 类直接派生而来,该类及其派生类的实例是一个窗口。 CWnd 类代表了MFC 中最基本的GUI 对象,它是一个功能最完善、成员函数最多的MFC 类。 CFrameWnd 类是CWnd 类的派生类,主要用来掌管一个窗口,它取代了SDK 应用程序中窗口函数 WndProc()的地位。 CFrameWnd 类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。 CDocument 类在应用程序中作为用户文档类的基类,它代表了用户存储或打开的一个文件。 CView 类是 MFC 中一个很基本的类,它作为其它MFC 视图类和用户视图派生类的基类。 从 API 编程到MFC 编程的过渡:WinMain(){初始化WNDCLASS 注册窗体结构创建窗口-应用程序类CWinApp 显示窗口消息循环}WndProc(){switch(…){case:…}- 框架窗口类CFrameWnd}MFC Object 和Windows Object 的对应关系:描述 Windows 句柄MFC Object 窗口HWND CWnd 设备上下文HDC CDC 菜单HMENU CMenu 笔HPEN CPen 刷子HBRUSH CBrush 字体HFONT CFont 位图HBITMAP CBitmap 套接字SOCKET CSocket 三、手工创建一个MFC 应用程序:注意:创建 MFC 程序,要创建一个Win32 空项目,并要选择项目属性中的在共享DLL 文件中使用MFC,然后新建我们的文件例子:在hello.h头文件中添写如下代码: class CMyApp:public CWinApp{public:virtual BOOL InitInstance();// 虚函数};class CMainWindow:public CFrameWnd{public:CMainWindow(); protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP();//声明消息映射};在源文件中添写如下代码:#include afxwin.h# myApp;BOOL CMyApp: InitInstance(){m_pMainWnd=new CMainWindow;m_pMainWnd- ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;}BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)ON_WM_PAINT()END_MESSA GE_MAP()//消息映射CMainWindow:CMainWindow()//构造函数初始化 {Create(NULL,我的第一个MFC 应用程序);//创建窗体}void CMainWindow: OnPaint(){CPaintDC dc(this);CRect rect;GetClientRect(&rect); (Hello MFC,- 1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}CWinApp 是应用程序类,在MFC 应用程序中必须从这个类派生出一个类,该派生类是MFC 应用程序的入口必须定义这个派生类的对象,并且只能有一个这个对象代表整个应用程序。 成员函数:InitInstance()功能:初始化应用程序实例和窗口实例,虚函数 CWinApp:InitInstance 必须在派生类中重写。 在InitInstance 函数中,编写初始化代码,如:创建一个窗口显示一个窗口CFrameWnd 类作用:为应用程序提供一个窗口,同时实现消息处理功能。 成员函数:Create()功能:创建窗体, 将之赋于CFrameWnd 对象上。 BOOL Create(窗口类型,窗口标题,显示风格,显示区域,符窗口句柄,菜单,扩展显示风格,上下文对象)共有8 个参数,前两个必须给出,后6 个可以默认。 MFC 应用程序的核心就是基于CWinApp 类的应用程序对象,CWinApp 提供了消息循环来检索消息并将消息调度给应用程序的窗口.我们在编写MFC 应用程序时,要包含afxwin.h,一个MFC 应用程序可以有且仅有一个应用程序对象,对象必须声明为在全局范围内有效(也就是全局对象), 以便它在程序开始时即在内存中被实例化我们的Hello MFC 的应用程序类被命名为CMyApp,它在 中用如下语句进行了实例化:CMyApp myApp; CMyApp 的类声明在hello.h 中代码如下:class CMyApp:public CWinApp{public:virtual BOOL InitInstance();};CMyApp 没有声明任何的数据成员,只是重写了一个从CWinApp 类中继承来的函数,在应用程序的生存期内InitInstance 的调用比较早,是在应用程序开始运行以后而窗口创建之前,除非InitIstance 创建一个窗口,否则应用程序是不会有窗口,这正是为什么即使最小的MFC 应用程序也必须从CWinApp 派生出一个类并重写CWinApp: InitIstance 的原因InitInstance 函数:CWinApp:InitInstance 是一个虚函数,其默认操作仅包含一条语句:return TRUE;InitInstance 是用来执行程序每次开始时都需要进行的初始化工作最好的地方在 中,CMyApp 的 InitInstance 通过实例化hello 的CMainWindow 类来创建hello 窗口,语句: m_pMainWnd=new CMainWindow;构造了一个CMainWindow 对象指针,并将其地址复制到了应用程序对象的m_pMainWnd 数据成员中,窗口创建以后,InitInstance 就会通过CMainWindow 指针调用ShowWindow 和UpdateWindow 函数显示它: m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow(); ShowWindow 和UpdateWindow 是所有窗口对象共用的CWnd 成员函数其中包括 CFrameWnd 类的对象,CMainWindow 就是从CFrameWnd 派生出来的.要从MFC 程序调用一个常规的Windows API 函数,需要在函数名称前添加一个全局运算符:例如::UpdateWindow();通过生成窗口对象并调用其Create 函数,MFC 应用程序可以创建一个窗口,在CMyApp:InitInstance 中,hello 创建了一个 CMainWindow 对象,CMainWindow 的构造函数生成在屏幕上看到的窗口: Create(NULL,我的第一个MFC 应用程序);CPaintDC dc(this);MFC 的 CPaintDC 类是从MFC 的CDC 类派生的,CDC 类封装了Windows 设备环境,以及包含了绘制到屏幕、打印机和其他设备的几十个成员函数在MFC 中如何处理消息呢?在SDK 中我们利用的是消息循环和窗口过程函数对消息进行消息处理.在 MFC 中我们用的是消息映射机制.下面是将消息映射添加到一个类中需要做的全部工作.1 通过将DECLARE_MESSAGE_MAP 语句添加到类声明中,声明消息映射.2 通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 的调用之间处理消息3 添加成员函数来处理消息1、构造 CWinApp 派生类的对象2、系统调用WinMain()3、WinMain 调用InitInstance, 在该函数中创建CFrameWnd 派生类对象,调用Create 函数创建窗口、调用 ShowWindow 函数显示窗口。 4、之后内部机制调用Run,接受用户的消息,并将消息导向默认的处理函数。 当接收到WM_QUIT 消息时,Run 内部调用 ExitInstance,退出程序。 MFC 采用消息映射(Message Map)机制取代C/C++语言中的switch-case 结构来处理消息。 消息映射:在MFC 中把消息处理函数和它所要处理的特定的消息连接起来的一种机制。 它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V 表),节省内存。 MFC 消息映射机制包括一组消息映射宏。 一条消息映射宏把一个Windows 消息和其消息处理函数联结起来。 MFC 应用程序框架提供了消息映射功能。 在类的实现源文件中用 BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。 在类定义的结尾用DECLARE_MESSAGE_MAP()宏来声明使用消息映射。



相关标签: .NETmainwindow是什么程序mainwin32的对比优缺点分析

上一篇:面向性能的mainwin32编程提升应用程序速度

下一篇:mainwin32实战教程构建健壮的Windows应用程

内容声明:

1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/e2c3fd0d53f95db33039.html,复制请保留版权链接!


温馨小提示:在您的网站做上本站友情链接,访问一次即可自动收录并自动排在本站第一位!
随机文章
提取 PDF 文本:利用解析技术获取可编辑文本数据 (提取pdf文件名)

提取 PDF 文本:利用解析技术获取可编辑文本数据 (提取pdf文件名)

PDF,便携式文档格式,是一种流行的文件格式,用于在各种设备上创建和共享文档,但是,PDF文档通常是不可编辑的,这可能会给编辑或重新使用其内容带来困难,幸运的是,有许多工具和技术可以让您提取PDF文档中的文本,从而使您可以编辑和重新使用内容,本文将探讨一些流行的PDF文本提取方法,并提供分步指南,帮助您从PDF文档中提取可编辑文本,P...。

最新资讯 2024-09-27 10:54:21

存储过程安全性:保护数据库免受潜在威胁 (存储过程安全性高吗)

存储过程安全性:保护数据库免受潜在威胁 (存储过程安全性高吗)

引言存储过程是预编译的、可重复使用的数据库对象,可以封装复杂的数据库操作,虽然它们提供了许多好处,包括可重用性、性能和代码模块化,但它们的安全性也至关重要,因为它们可以访问敏感数据并执行特权操作,在本文中,我们将深入探讨存储过程安全性,了解潜在威胁并探索最佳实践,以保护数据库免受存储过程可能带来的威胁,存储过程的潜在威胁SQL注入攻击...。

最新资讯 2024-09-26 18:59:18

在线教程:与来自世界各地的专家建立联系,获取宝贵的见解和指导

在线教程:与来自世界各地的专家建立联系,获取宝贵的见解和指导

在当今竞争激烈的商业环境中,持续学习和提高技能至关重要,在线教程为我们提供了一种方便快捷的方式,可以与来自世界各地的专家建立联系,获取宝贵的见解和指导,在线教程的优势灵活性和便利性,在线教程允许您随时随地学习,无需去教室或遵循固定的时间表,广泛的课程选择,在线平台提供各种各样的课程,从技术技能到软技能,涵盖广泛的主题,与专家直接联系,...。

技术教程 2024-09-23 08:04:05

使用 CSS过滤器提升您的网页设计:分步教程 (使用css过渡动画实现一个盒子从正方形到圆形代码)

使用 CSS过滤器提升您的网页设计:分步教程 (使用css过渡动画实现一个盒子从正方形到圆形代码)

constbox=document.querySelector,.box,box.addEventListener,mouseover,=,box.style.filter=blur,10px,box.addEventListener,mouseout,=,box.style.filter=none,使用C...。

技术教程 2024-09-15 16:21:36

服务器端编程语言在现代应用程序开发中的应用与优势 (服务器端编程语言有哪些)

服务器端编程语言在现代应用程序开发中的应用与优势 (服务器端编程语言有哪些)

服务器端编程语言简介服务器端编程语言是一种用于在服务器上运行的代码的编程语言,这些语言可用于处理应用程序的逻辑并与数据库和其他服务进行交互,与客户端编程语言,在用户设备上运行,不同,服务器端编程语言不负责用户界面或交互,服务器端编程语言的应用服务器端编程语言在现代应用程序开发中有着广泛的应用,包括,Web应用程序,处理用户请求、生成动...。

互联网资讯 2024-09-12 09:01:37

C 语言程序设计基础:初学者友好,一步一步学习 (c语言程序设计)

C 语言程序设计基础:初学者友好,一步一步学习 (c语言程序设计)

1.简介C语言是一种通用高级编程语言,由丹尼斯·里奇,DennisRitchie,于1972年开发,它是一种结构化编程语言,广泛用于开发操作系统、嵌入式系统和软件应用程序,C语言以其高效、可移植性和灵活性而闻名,它被认为是学习编程语言的坚实基础,因为它提供了对编程概念和计算机体系结构的深入理解,2.安装和配置要在计算机上使用C语言,您...。

本站公告 2024-09-10 22:45:51

解锁滚动图片的潜力:在移动和桌面设备上创造引人入胜的体验 (解锁滚动图片怎么设置)

解锁滚动图片的潜力:在移动和桌面设备上创造引人入胜的体验 (解锁滚动图片怎么设置)

滚动图片是一种交互式图形元素,允许用户通过滚动或拖动来探索图像的各种部分,它们是创建引人入胜且引人注目的移动和桌面体验的强大工具,滚动图片的优势吸引人的内容体验,滚动图片可以通过允许用户以独特而互动的方式探索图像来创建更吸引人的内容体验,提高用户参与度,滚动图片需要用户js或LocomotiveScroll,在工具中创建新的滚动图片,...。

互联网资讯 2024-09-06 22:01:26

Java trim() 函数实战技巧:应对各种字符串处理场景 (JAVATransmission)

Java trim() 函数实战技巧:应对各种字符串处理场景 (JAVATransmission)

在Java中,trim,函数是用于移除字符串两端的空白字符,包括空格、制表符和换行符,的强大工具,掌握trim,函数的各种用法和应用场景对于处理字符串至关重要,移除字符串两端的空白字符最基本的使用trim,函数是移除字符串两端的空白字符,例如,Strings=Hello,World,Stringtrimmed=s.trim,...。

互联网资讯 2024-09-06 20:50:37

用 Java 改变世界,无需昂贵的费用,尽在免费课堂中 (用java改变抖音直播间用户在线人数)

用 Java 改变世界,无需昂贵的费用,尽在免费课堂中 (用java改变抖音直播间用户在线人数)

引言Java是一种功能强大且用途广泛的编程语言,被广泛用于各种应用程序和解决方案的开发中,随着技术的不断发展,Java的作用也越来越重要,它正成为塑造我们数字世界的关键力量,Java的优势Java拥有许多优势,使其成为开发人员的首选语言,包括,平台独立性,Java遵循一次编写,随处运行的原则,使其可在各种操作系统上运行,包括Windo...。

技术教程 2024-09-05 14:42:21

校园灵异之谜:科学与玄学之间的较量,探索未知的境界 (校园灵异之谜在线观看)

校园灵异之谜:科学与玄学之间的较量,探索未知的境界 (校园灵异之谜在线观看)

校园,一个充满了青春与活力的场所,却也流传着许多灵异传说,这些传说往往令人毛骨悚然,但又让人难以抗拒,它们究竟是科学现象还是玄学迷信,本文将带你探索校园灵异之谜的真相,科学解释对于校园灵异事件,科学家们给出了以下解释,光学错觉,昏暗的环境、闪烁的灯光以及阴影的移动都会产生光学错觉,让人误认为看到了鬼魂,声音错觉,老建筑物中的管道声、风...。

互联网资讯 2024-09-04 02:57:09

南京碎尸案:惨绝人寰的细节曝光 (南京碎尸案破了吗)

南京碎尸案:惨绝人寰的细节曝光 (南京碎尸案破了吗)

2022年10月28日南京碎尸案于2022年7月21日发生,是一起令人发指的凶杀案,该案的犯罪嫌疑人洪某因涉嫌故意杀人罪已被警方逮捕,案件经过2022年7月21日,南京警方接到报警称,在某小区内发现一名被肢解的女性尸体,经过调查,警方确定受害人系28岁的李某某,经过缜密侦查,警方很快锁定犯罪嫌疑人洪某,并于当日将其抓获,经审讯,洪某对...。

互联网资讯 2024-09-03 05:13:46

移动数据打不开deviantart怎么办 (移动数据打不开怎么办)

移动数据打不开deviantart怎么办 (移动数据打不开怎么办)

建议进行以下操作,1.检查手机网络连接是否稳定,建议更换无线网络尝试,2.更新软件版本尝试,3.点击手机应用程序,设定,应用程序管理器,已下载,选择出现问题的应用,清除数据4.将数据备份,联系人,短信,图片等,,恢复出厂设置重新安装尝试5.更新下手机系统版本,美图丨一些寻找无水印图片的个人经验对于大部分动漫迷来说,平时都喜欢收集图片,...。

技术教程 2024-09-02 01:53:59