㈠ 可视化编程
可视化编程,亦即可视化程序设计:以“所见即所得”的编程思想为原则,力图实现编程工作的可视化,即随时可以看到结果,程序与结果的调整同步
可视化编程是与传统的编程方式相比而言的,这里的“可视”,指的是无须编程,仅通过直观的操作方式即可完成界面的设计工作,是目前最好的Windows应用程序开发工具
可视化编程语言的特点主要表现在两个方面:一是基于面向对象的思想,引入了控件的概念和事件驱动;二是程序开发过程一般遵循以下步骤,即先进行界面的绘制工作,再基于事件编写程序代码,以响应鼠标、键盘的各种动作
可视化编程十问1
什么是可视化程序设计?可视化(Visual)程序设计是一种全新的程序设计方法,它主要是让程序设计人员利用软件本身所提供的各种控件,像搭积木式地构造应用程序的各种界面
2
可视化程序设计有哪些优点?可视化程序设计最大的优点是设计人员可以不用编写或只需编写悔瞎则很少的程序代码,就能完成应用程序的设计,这样就能极大地提高设计人员的工作效率
3
能够进行可视化程序设计的语言有哪些?能进行可视化程序设计的语言很多,比较常用的有微软的VisualBasic、VisualC++、中文VisualFoxpro、Borland公司的Delphi等
4
可视化程序设计中有哪些基本概念?主要的几个基本概念有表单、组件、属性、事件、方法等
5
什么是表单(Form)?表单是指进行程序设计时的窗口,我们主要是通过在表单中放置各种部件(如命令按钮、复选框、单选框、滚动条等)来布置应用程序的运行界面
6
什么是组件?所谓组件,就是组成程序运行界面的各种部件,如:命令按钮、复选框、单选框、滚动条等
7
什么是属神慎性?属性就是组件的性质
它说明组件在程序运行的过程中是如何显示的、组件的大小是多少、显示在何处、是否可见、是否有效8
属性可以分成哪几类?属性可分成三类,设计属性:是在进行设计时就可发挥作用的属性;运行属性:这是在程序运行过程中才发挥作用的属性;只读属性:是一种只能查看而不能改变的属性
9
什么是事件?事件就是对一个组件的操作
如用鼠标点击一个命令按钮,在这里,点击鼠标就称为一个事件(Click事件)
10
什么是方法?方法就是某个事件发生后要执行的具体操作,类似以前的程序
例如当我们用鼠标单击“退出”命令按钮时,程序就会通过执行一条命令而结束运行,命令的执行过程就叫方法
面向对象程序设计1.历史回顾1967年挪威计算中心的KistenNygaard和OleJohanDahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言
20世纪70年代初,PaloAlto研究中心的AlanKay所在的研究小组开发出Smalltalk语言,之后又开发出Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它对后来出现的面向对象语言,如Object-C,C,Self,Eiffl都产生了深远的影响
随着面向对象语言的出现,面向对象程序设计也就应运而生且得到迅速发展
之后,面向对象不断向其他阶段渗透,1980年GradyBooch提出了面向对象设计的概念,之后面向对象分析开始
1985年,第一个商用面向对象数据库问世
1990年以来,面向对象分析、测试、度量和管理等研究都得到长足发展
实际上,“对象”和“对象的属性”这样的概念可以追溯到20世纪50年代初,它们首先出现于关于人工智能的早期着作中
但是出现了面向对象语言之后,面向对象思想才得到了迅速的发展
过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,直到面向对象语言
汇编语言出现后,程序员就避免了直接使用0-1,而是利用符号来表示机器指令,从而更方便地编写程序;当程序规模继续增长的时候,出现了Fortran、C、Pascal等高级语言,这些高级语言使得编写复杂的程序变得容易,程序员们可以更好地对付日益增加的复杂性
但是,如果软件系统达到一定规模,即使应用结构化程序设计方法,局势仍将变得不可控制
作为一种降低复杂性的工具,面向对象语言产生了,面向对象程序设计也随之产生
2.面向对象程序设计的基本概念面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性碧棚、消息传递
通过这些概念面向对象的思想得到了具体的体现
1)对象对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体
2)类类是具有相同类型的对象的抽象
一个对象所包含的所有数据和代码可以通过类来构造
3)封装封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性
对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限
4)继承继承是让某个类型的对象获得另一个类型的对象的特征
通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性
5)多态多态是指不同事物具有不同表现形式的能力
多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度
6)动态绑定绑定指的是将一个过程调用与相应代码链接起来的行为
动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式
7)消息传递对象之间需要相互沟通,沟通的途径就是对象之间收发信息
消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息
消息传递的概念使得对现实世界的描述更容易
3.面向对象语言一个语言要称为面向对象语言必须支持几个主要面向对象的概念
根据支持程度的不同,通常所说的面向对象语言可以分成两类:基于对象的语言,面向对象的语言
基于对象的语言仅支持类和对象,而面向对象的语言支持的概念包括:类与对象、继承、多态
举例来说,Ada就是一个典型的基于对象的语言,因为它不支持继承、多态,此外其他基于对象的语言还有Alphard、CLU、Euclid、Mola
面向对象的语言中一部分是新发明的语言,如Smalltalk、Java,这些语言本身往往吸取了其他语言的精华,而又尽量剔除他们的不足,因此面向对象的特征特别明显,充满了蓬勃的生机;另外一些则是对现有的语言进行改造,增加面向对象的特征演化而来的
如由Pascal发展而来的ObjectPascal,由C发展而来的Objective-C,C,由Ada发展而来的Ada95等,这些语言保留着对原有语言的兼容,并不是纯粹的面向对象语言,但由于其前身往往是有一定影响的语言,因此这些语言依然宝刀不老,在程序设计语言中占有十分重要的地位
4.面向对象程序设计的优点面向对象出现以前,结构化程序设计是程序设计的主流,结构化程序设计又称为面向过程的程序设计
在面向过程程序设计中,问题被看作一系列需要完成的任务,函数(在此泛指例程、函数、过程)用于完成这些任务,解决问题的焦点集中于函数
其中函数是面向过程的,即它关注如何根据规定的条件完成指定的任务
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问
每个函数都可以具有它们自己的局部数据
下图显示了一个面向过程程序中函数和数据的关系
图1面向过程程序设计中函数和数据的关系示例这种结构很容易造成全局数据在无意中被其他函数改动,因而程序的正确性不易保证
面向对象程序设计的出发点之一就是弥补面向过程程序设计中的一些缺点:对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变
下图显示了一个面向对象程序中对象与函数和数据的关系
图2面向对象程序设计中函数和数据的关系示例比较面向对象程序设计和面向过程程序设计,还可以得到面向对象程序设计的其他优点:1)数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰;2)通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度;3)结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程;4)通过对对象的辨别、划分可以将软件系统分割为若干相对为独立的部分,在一定程度上更便于控制软件复杂度;6)以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统;7)通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级
面对对象的程序设计方法在数据输入模块内部设计中,采用面向对象的设计方法
[6]面向对象的基本概念如下:对象:对象是要研究的任何事物
从一本书到一家图书馆,单的整数到整数列庞大的数据库、极其复杂的自动化工厂、航天飞机都可看作对象,它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件
对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一独立整体
从程序设计者来看,对象是一个程序模块,从用户来看,对象为他们提供所希望的行为
在对内的操作通常称为方法
类:类是对象的模板
即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为
类是在对象之上的抽象,对象则是类的具体化,是类的实例
类可有其子类,也可有其它类,形成类层次结构
消息:消息是对象之间进行通信的一种规格说明
一般它由三部分组成:接收消息的对象、消息名及实际变元
面向对象主要特征:封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性
封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的
封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象
继承性:继承性是子类自动共享父类之间数据和方法的机制
它由类的派生功能体现
一个类直接继承其它类的全部描述,同时可修改和扩充
继承具有传递性
继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)
类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复
继承不仅支持系统的可重用性,而且还促进系统的可扩充性
多态性:对象根据所接收的消息而做出动作
同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性
利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法
例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同
多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应
在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性
综上可知,在面对对象方法中,对象和传递消息分别表现事物及事物间相互联系的概念
类和继承是是适应人们一般思维方式的描述范式
方法是允许作用于该类对象上的各种操作
这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和类的继承性
通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性,从而构成了面向对象的基本特征
面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学
对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象
而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式
所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统
按照BjarneSTroustRUP的说法,面向对象的编程范式:l决定你要的类;2给每个类提供完整的一组操作;3明确地使用继承来表现共同点
由这个定义,我们可以看出:面向对象设计就是“根据需求决定所需的类、类的操作以及类之间关联的过程”
面向对象设计方法的特点和面临的问题面向对象设计方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换
这是面向对象设计方法最主要的特点和成就
面向对象设计方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法
但是同原型方法一样,面向对象设计方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用面向对象设计方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题
所以面向对象设计方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法
㈡ 如何用Delphi编写自己的可视化控件
可视化控件(Visual Component)实际上就是一个类(class) 要编写一个类 可以直接在* pas文件中编写 但是要编写控件 则必须使橘陆陆用包(package) 从File菜单中选择New 新建一个Package 这就是存放和安装控件用的包 然后单击Package窗口中的Add按钮 添加一个元件(Unit)在弹出的对话框最上方选择New Component 因为一个控件的所有属性 方法 事件不可能都由自己编 所以就需要选择祖先类(或者叫做 父类 或 基类 ) 然后再在其上面添加自己的属性 方法 事件 在Ancestor type后的下拉框中选择所需的祖先类 由于编写可视化控件必须要画图 所以选择TGraphicControl作为祖先类 再在Class Name框中输入新控件(类)的名称 一般以 T 开头 Palette Page是用来选择新控件在Delphi的窗口中的控件页面名称 例如 Standard 这个可以自己取 在Unit File Name中添好新控件文件的路径及文件名 单击OK按钮 新的控件便加入了 现在可以为该控件编写代码了
下面以编写一个可以自定义图片的滚动条为例 说明编写可视化控件的方法 按照上面的方法 选择TGraphicControl为祖先类 新控件的名称是TPigHorizontalScroller (小猪水平滚动条) 选择好文件路径和文件名后 单击OK按钮 开始编写代码
每一个控件 都会被创建(Create)和删除(Destroy) 所以必须首先编写这两个过程 对于控件中的每一个过程 都必须在前面先定义 然后再在后面编写 定义的过程或属性有三种 (1)在private后定义的是属于控件圆顷内部使用的 使用该控件的人无法看到 (2)在protected后定义的一般是看不到的 只在别人使用该控件作为祖先类编写其它控件时才可见 (3)在public后定义的只允许别人在程序中调用 (4)在published后定义的可以在属性窗口(Object Inspector)中看到 由于创建和删除过程除了在编程过程中建立控件时自动执行外 还可能在程序运行过程中动态创建控件时被调用 所以把它定义在public后⑴ (该序号表示次步骤在所附源程序中的代码的位置 下同)现在也许还不知到应该在这两个过程中编写什么 如何去编 我们在下面将会讲到
我们首先为这个控件添加一些属性 我们定义一个Max属性用于设置或读取滚动条的最大值 因为在程序中一般不直接使用属性 所以要定义一个变量 和该属性对应起来 一边修改或读取其值 因为它只在控件内部使用 所以我们把它定义在private后⑵ (一般与属性相关联的变量都以 F 开头 例如FMax)定义好变量后 再定义属性 这个属性需要再Object Inspector窗口中可见 所以把它定义再published后⑶ 定义的语法是
property <属性名>:<类型> read <读取该属性时对应的变量> write <写入该属性时对应的变量或过程>
其它的变量和属性也类似的定义(例如Min最小值 Value当前值等) 下面我们定义几个属性和变量 用于设置滚动条的图片(因为图片变量比较特殊 所以单独讲一下) 我们把LeftButtonUpPicture(向左按钮图片) LeftButtonDownPicture(向左按钮按下图片)等定义为TBitmap类型(一定要定义相对应的变量)
大家一定注意到了 在所附的源程序中悉橡 定义这几个属性时 read后所指定的读取属性时对应的变量是F… 而write后指定的写入该属性时对应的不是一个变量 而是一个Set…之类的东西 这是一个自定义的过程 作为该功能的过程的定义为
procere <过程名>(Value: <被设置的属性的值的类型>)
因为执行写入该类属性的时候需要做其它的事情 所以不能光用一个变量来处理 应该用一个过程来处理 这中过程一般定义在protected后 在该类过程中 使用一个在⑷处这样一个语句来给TBitmap类型的变量来赋值 这是由于该类型的变量不能直接赋值而采用的
定义完这些TBitmap类型的变量的属性后 上面讲的create过程和destroy过程中就需要编写代码了 因为TBitmap也是一个类 所以在create过程中必须创建⑸ 在destroy过程中必须释放掉(free)⑹ 这里⑺所指的inherited语句是用于指明该过程是从祖先类类中继承来的 (这个一定不能掉)
因为我们编写的是可视化控件 所以必须在控件上画图 我们这个控件的祖先类TGraphicControl中封装有一个Canvas(画布)对象 我们可以直接使用它来画图 如果你对画布的使用还不太熟悉 最好去找一本书来看一看
下面要做的工作就是画图了 如何在控件上画图呢?祖先类TGraphicControl中有一个Paint事件 当控件需要重画时便会自动触发 我们现在要做的就是要为这个事件编写一段程序 首先在protected后定义一个Canvas对象 由于它是祖先类中已有的 所以不需要加任何说明⑻ 我们将使用这个对象来画图 接着 就要定义一个Paint过程 编写绘制控件的代码 先在public后定义Paint过程 由于它是由祖先类触发的 而不是由用户调用的 所以后面必须加上override 否则 该控件将会由于Paint过程永远不会被调用而不成为可视化控件⑼ 下面我们就来编写Paint过程的代码⑽
该文章所附的源程序的Paint过程中的T_Height等变量是用来保存滚动条中按钮 滑块等的大小的 这部分程序和普通的Application中的程序差别不大 大部分都是对画布进行操作 相信大家一看就明白 值得注意的是下面对FAutoSize变量的判断⑾ FAutoSize是和该控件的属性AutoSize相关联的布尔型变量 是用来设置这个控件的大小是否随图片的大小而变化的 注意 在控件的代码中 一般都不直接调用属性 而是使用与其相对应的的变量
程序编到这里 就算是终于给自己的新控件做了一个外型了 不过它还不能滚动 现在我们来编写鼠标事件 让我们能够操纵它 鼠标事件的过程的定义和Paint过程很相似 只是后面要加上参数说明⑿ 鼠标事件分为MouseDown MouseMove和MouseUp三个 在定义后面都要加上override 接下来在后面编写它的代码 注意 这里的鼠标事件是Mouse… 而不是通常的OnMouse… 可是在⒀处的定义是干什么用的呢?这里的事件定义 都是给用户使用的 也就是说 当使用该控件时 会在Object Inspector中的Event页面中显示出来
这些鼠标事件的代码也非常简单 判断鼠标的坐标 在画布上画出相应的图片等 并同时触发相应的事件 值得注意的是 在调用自定义事件时 都要先用⒁处的这样一个语句来判断用户是否已经为该事件编写代码 这一点非常重要 否则会调用出错
大家注意到了 刚才所调用的事件都是自定义的 定义的方法也很简单 和定义属性差不多 只是类型时TNotifyEvent罢了
TNotifyEvent是默认事件 其定义为
TNotifyEvent = procere(Sender: TObject)
如果你要定义另外形式的事件 就必须这样 先在type后编写
<事件类型名称> = procere(<参?gt;:<类型>)
例如
TCustomEvent = procere(a: Integer; b:String);
然后在public后定义
<事件名称>:<事件类型名称>
例如
AnEvent: TCustomEvent;
看完这些 这整个程序你应该理解了吧 如果编译或运行出错 注意检查以下几点
(1)create和destroy过程中是否有inherited语句 (2)TBitmap类型的变量create和free了没有 (3)过程前有没有控件名 例如 TPigHorizontalScroller MoseMove
判断鼠标是否进入或离开控件的方法
定义如下的过程
procere MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;procere MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
lishixin/Article/program/Delphi/201311/8448
㈢ 怎样用c语言在vc上编写可视化
用API函数来编程,完全可以实现可视化的应用。
#include <windows.h>悄派
#include "resource.h"
#define _UNICODE
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("CommonDlg") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_MYICON)) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = MAKEINTRESOURCE(IDM_MYMENU) ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("CommonDlg"), // window caption
WS_OVERLAPPEDWINDOW, //启锋贺 window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, //基腊 program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
HBRUSH hbrush ;
CHOOSECOLOR cc ; //颜色对话框结构
static COLORREF rgbColorDlg, rgbFontDlg ;
static COLORREF acrCustClr[16];
CHOOSEFONT cf; // 字体对话框结构
static LOGFONT lf; // 逻辑字体的结构
static HFONT hfont, hfontPrev;
OPENFILENAME ofn; // 打开、另存为对话框结构
static TCHAR szFile[MAX_PATH]; //存储路径、文件名的缓冲区
static TCHAR szFilter[] = TEXT ("Common Dialog Files (*.CDF)\0*.cdf\0")
TEXT ("文本文件 (*.TXT)\0*.cdf\0")
TEXT ("All Files (*.*)\0*.*\0\0") ;
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_FILE_OPEN: // 创建"打开"通用对话框
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = szFilter ;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 创建对话框,若对话框结束后返回TRUE,则将ofn的lpstrFile域中返回
// 文件名复制到缓冲区szFile
if (GetOpenFileName(&ofn) == TRUE)
{
strcpy(szFile, ofn.lpstrFile );
MessageBox(hwnd, szFile, "打开完毕", MB_OK | MB_ICONINFORMATION) ;
}
return 0 ;
case IDM_FILE_SAVE: // 创建"另存为"通用对话框
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = szFilter ;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrDefExt = TEXT(".cdf") ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 创建对话框,若对话框结束后返回TRUE,则将ofn的lpstrFile域中返回
// 文件名复制到缓冲区szFile
if (GetSaveFileName(&ofn) == TRUE)
{
strcpy(szFile, ofn.lpstrFile );
MessageBox(hwnd, szFile, "保存完毕", MB_OK | MB_ICONINFORMATION) ;
}
return 0;
case IDM_FILE_EXIT:
PostMessage(hwnd, WM_QUIT, wParam, lParam);
return 0 ;
case IDM_SET_FONT: // 创建"字体"通用对话框
ZeroMemory(&cf, sizeof(CHOOSEFONT)) ;
cf.lStructSize = sizeof (CHOOSEFONT);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbFontDlg ;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
// 对话框结束返回若为TRUE,则以返回的字体信息创建逻辑字体
if (ChooseFont(&cf)==TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
rgbFontDlg = cf.rgbColors;
}
InvalidateRect(hwnd, NULL, TRUE) ;
return 0 ;
case IDM_SET_COLOR: // 创建"颜色"通用对话框
ZeroMemory(&cc, sizeof(CHOOSECOLOR));
cc.lStructSize = sizeof(CHOOSECOLOR);
cc.hwndOwner = hwnd;
cc.lpCustColors = (LPDWORD) acrCustClr;
cc.Flags = CC_FULLOPEN ;
if (ChooseColor(&cc) == TRUE)
{
rgbColorDlg = cc.rgbResult;
hbrush = CreateSolidBrush(rgbColorDlg);
SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)hbrush);// 改变客户区的颜色
}
InvalidateRect(hwnd, NULL, TRUE) ;
return 0 ;
}
break;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect(hwnd, &rect) ;
if(rgbColorDlg != 0)
SetBkColor(hdc, rgbColorDlg);
if(hfont != 0 )
{
SelectObject(hdc, hfont);
SetTextColor(hdc, rgbFontDlg);
}
DrawText(hdc, TEXT("通用对话框"), -1 , &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
是否能看懂
㈣ 怎么使用编程语言程序“实现可视化界面”
你说的是桌面GUI程序开发吧,目前来说,用c语言来做桌面GUI程序开发的不多,主要做底层开发,下面我主要介绍一下c++和Python主流的做桌面GUI开发的一些框架和库,主要如下:
c++开发GUI
1.第一个比较经典的框架了,相信大部分初学c++的GUI开发的人都学过,微软自己推出
的开发框架,在vc,vs中经常用到,微软基础类库MFC,封装了底层WindowsAPI,可以明显降低开发人员的工作量,但是只能在windows平台下使用,不具有跨平台性,而且就目前来说,灵活性不是很高,过程设计的有些繁琐:
2.Qt,这是一个跨平台的c++图形用户开发框架,易学易用,很快就能上手,相对于MFC来说,学起来能更快一些,比较简单,自带的QtDesigner可以更快的设计用户界面,更灵活,也更方便:
python开发GUI
1.第一个就是python自带的Tkinter包,基本可以满足小的GUI程序的开发,但是资料比较少,开发起来也不够灵活:
2.就是wxPython,这个包的功能相对于Tkinter来说,功能能更强大一些,也能灵活一些,网上的教程和例子也挺多的:
3.最后就是PyQt,这个是Qt提供给python的一个接口包,专门为了python开发GUI程序,功能很强大也很灵活,只要你有一定的Qt基础,很快就能掌握:
其实python还有许多开发GUI程序的包,像kivy,pygame等,都可以开发GUI程序,我这里就不赘述了,感兴趣的话可以到官网搜搜相关资料和文档,挺多的。
桌面GUI程序开发,其实几乎每门主流语言都有对应的框架歼腊禅或包直接来用,我这里就大概介绍了c++和python两种语言常用的框架和局闹包,像C#,java等,都有对应的包或类直接可以调用使用,开发起来GUI程序也很快,我这里就不详细介绍了,可以到网上搜搜相关教程和例子,希望以上分享的内容能对你有所帮助吧氏尘。
㈤ 如何可视化编辑这个exe程序
1、可视化编辑exe?你是指修改各个控件的相对位置或者文本框的内容?这个要看情况,如果该软件编程的时候没有对资源文件进行加密之类处理,那就可以用pe修改工具强行打开(这种可以直接打开的软件极为罕见,记得零几年的时候还可以看到)
2、如果你说可视化编枣郑辑exe,同时还要芹李修改嫌岩迟功能性代码(例如添加其他功能),既然你说钱不是问题,你直接去找开发人员买代码算了,反汇编根本不可能达到完全可逆的地步(任何人说能够做到那一定是骗人,编译、链接是有损耗的)。
3、PEid已经很久没有更新了,检测新软件的时候,通常需要开启核心扫描才能查找软件壳或者编译软件
㈥ rust语言怎么编写可视化界面
1、直接写在rust语言程序没岁轿里,适合编程使用。
2、使用input函数,运行程序时输入。
3、做成可视化枯肆界面,然后让雀裂程序获得。
㈦ 想用C语言编写一个有可视化的界面,有按钮,有输入框的程序
可以用MFC做界面,在Visual C++新建》项目》MFC AppWizard(exe)》dialog based》下面都默认,就能建立一个MFC工程。可以添加控件,控件响应的原理与VB中的类似,建议你找本MFC的教材仔细了解其原理
㈧ 如何用C语言写出可视化程序
可以。。有专门的接口,函数运闭,api,,。。
但现在基本上不用它来写可视化程序,,,十分费劲。。需要了解的东西也更多。。
而写写
控制台的程卖隐序还可以。。。。
就像我们熟知的
ping
程序中悄厅就可以。。用c来写。。。(好像就是它写的吧。。呵呵。。