【转】基于虚拟化技术的病毒和木马分析系统——视频

视频内容为2015年9月24日提交至第八届全国信息安全大赛的作品,当时三位评选老师对该作品均作出了积极评价并其中两位教师给予推荐;但结果却没有进入决赛,这期间的种种或许只有我们当时的团队能体会到。

总体来说,这个作品是第一个让我们如此用心的作品,是一个值得纪念的一个作品,作品制作过程中发生很多事情,让我们学到很多,也促进了团队之间彼此的友谊。

看到大彬哥发的这篇文章,感受颇多。

 

附,当时团队成员列表:

2012级 计算机应用技术(信息安全方向) 李文彬

2013级 计算机应用技术 鞠涛

2014级 电子信息工程 侯珍凯

2014级 计算机科学与技术 李翔

(排名不分先后,仅依照年级)

大彬哥原文

使用Python搭建一个简单的Web Sever

from bottle import *

@route('/')
def home():

  return '<center>'+'Hello World'+ '</center>'

run(host ='0.0.0.0',port = 8000)

【原】Oracle12C卸载办法—Windows

下面的Windows系统下的Oracle 12C的卸载步骤。

第一步:关闭所有的Oracle服务

第二步:找到自己的Oracle的安装目录,我的是:B:\oracle_db\product\12.1.0\dbhome_1\deinstall\ 里面有一个deinstall.bat bat脚本,里面包含了Oracle的自动卸载步骤。(bat脚本的内容这里就不贴出来了。用管理权限运行)

 

第三步:运行bat脚本。出现如下,请耐心等待

第四步:直到出现如下画面,按照要求输入“.”按enter键,继续操作。

第五步:出现如下界面。按要求键入“Y”。Enter键继续。

第六步:出现如下界面,按要求键入数据库名。这里我的数据库是“orcl” 。按Enter

第七步:出现如下,按要求输入“Y”。

第八步,出现如下界面。按要求输入“1”。

第九步:输入“y”继续操作。指定数据库默认“ASM”。

第十步:出现如下界面,每一步都是直接键入Enter即可。

第十一步:询问是否继续,需要调制中文输入法,输入“是”即可。然后耐心等待

至此,Oracle已经卸载完成。

稀里糊涂的就卸载完成了。如果中途出现问题没有卸载成功,可用管理人员权限运行bat脚本重新试一下。

【原】Windows 安装Oracle数据库

  • 最近准备研究一下Oracle数据库。做了一个安装步骤图文详解。(其实也是数据库课的作业~~~~(>_<)~~~~)
  • 首先是一些准备工作
  • Oracle数据库下载。

首先去官网下载Oracle安装程序:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

我选择的是Oracle12C Edition 版本

  • 解压下载的文件
  • 运行exe文件

  • 安装第一步,直接运行setup文件会出现安装前的准备

  • 配置安全更新。(可以填写上电子邮件地址,以便接受一些邮件推送)

注:以上图示中箭头所指的位置的勾选一定要取消。

  • 安全选项,直接选择默认创建和配置一个数据库(安装完数据库管理软件后,系统会自动创建一个数据库实例)。

  • 接下来根据需要选择安装桌面类还是服务器类,这里是在Windows10上测试安装,所以选择的是桌面类

  • 下面选择系统用户,我在这里创建一个Oracle用户

  • 这里选择Oracle基目录(路径不要出现中文路径),版本默认就行,口令是登陆的口令。

  • 接下来可能会提示密码强度不够,直接默认跳过或者选择“是”即可。
  • 先决条件检查,安装程序会检查软硬件系统是否满足,安装此Oracle版本的最低要求。 直接下一步就OK 了。

  • 概要 安装前的一些相关选择配置信息。 可以保存成文件 或 不保存文件直接点完成即可。

  • 然后会安装产品,提示进度,自动安装,无需操作。

  • 数据库管理软件文件及dbms文件安装完后,会自动创建安装一个实例数据库默认前面的orcl名称的数据库。

  • 数据库创建完成之后,系统默认是把所有账户锁定不可用(sys和system账户除外),可以点击右面的口令管理,将常用的Scott用户解锁。进去之后将Scott用户的锁定√取消输入口令即可。这里不做操作。

  • 安装完成,关闭即可。

  • 这里使用sqlplus登陆测试。登陆成功

以上便是Oracle 12C Edition 64位安装过程。

博主第一次学习Oracle数据库,如有不足还请见谅。

【转】给嵌入式工程师的一封信,请注意查收!

最近经常有用人单位打来电话,问我这有没有嵌入式Linux方面的开发人员,他们说他们单位急需要懂得在嵌入式Linux环境下的软件开发人员,我回答说,现在每年毕业的大学生那么多,还招不到合适的软件开发人员吗?他跟我说,毕业大学生虽然多,但大部分都能力不够,不能达到他们的工作的要求。


该公司HR的一句话说出来我们现在的大学教学和大学生就业的现状:一方面每年那么多大学生毕业找不到合适的工作,另一方面很多用人单位和企业又找不到合适的人才。造成这种现象最基本的原因是学校教育和社会需求的严重脱节。

造成很多嵌入式专业的学生在毕业后,还是很难达到用人单位的要求最主要的原因在于高校在嵌入式教学方面重理论和轻实践,很多嵌入式专业的老师也没有实际的工作经验,这样培养出的学生可能让他讲起来头头是道,但是让他去真正编写,调试一个应用程序就傻眼了,不知道从何下手,因为他们在学校的学习可能从来就没有老师带着他们实际调试过嵌入式程序,也没有机会让你去调试嵌入式应用程序,那些看起来非常不错的嵌入式实验箱大部分时间都躺在实验室睡大觉,只有在上实验课的时候搬出来让大家看两眼,摸两下,还没有弄明白怎么回事,又要收到实验室睡大觉去了。这样的教学模式,如何能培养出一名合格的嵌入式工程师呢?出现企业找不到合适的人,大学毕业生找不到合适的工作也就不奇怪了。

 

嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术。

 

现在很多同学也意识到了学校培养模式和社会需求脱节问题,有一部分同学也先行行动起来,开始注重培养自己的实际动手能力,培养自己实际分析问题,解决问题的问题,培养自己在嵌入式专业实际编程和调试程序的能力。但是嵌入式专业不同于其他学科,嵌入式专业是一门综合性非常强,涉及知识面非常广的学科,对于初学者来说,面对那么多教程、课本,那么多知识点,往往不知道从何处下手,不知道哪些是重点,哪些不是重点,这些知识点之间有什么关联,一脸的茫然,然后东一榔头,西一棒子,折腾了几个月甚至大半年后,还是找不着学习嵌入式的方向,还徘徊在嵌入式开发的大门之外。

 

那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学习经历和多年的嵌入式Linux教学经验,谈谈自己对嵌入式学习的一些想法和意见,希望对大家有所帮助。

 

一、练好基本功

 

嵌入式系统专业是综合了计算机硬件技术,计算机软件技术以及电子电路技术的一门综合学科,所涉及的内涵和知识非常广泛,包括:数字电路,模拟电路,计算机组成原理,单片机基础,C语言基础,操作系统,数据结构,编译原理,计算机控制,计算机网络等知识。

 

在真正学习嵌入式开发之前,首先要打好基础。其中最重要的是C语言基础、数字电路、计算机组成原理三门课程。对于C语言,至少能单独编写调试一个3 ~ 500行的程序,能够了解C语言的基本语法规则,基本语句的使用,理解指针概念并能灵活使用各种指针。

 

计算机组成原理要能理解组成一个计算机系统的几大部件,计算机系统的结构,理解系统总线,理解处理器和计算机外部设备的关系,处理器和计算机外设是如何协调工作完成某一项功能的,计算机软件和硬件是如何分工协作完成某一项任务的,理解软件是通过寄存器来控制硬件的。

 

数字电路,模拟电路要了解其基本原理个概念,能看懂简单模拟、数字电路原理图。理解数字电路中的寄存器,时序的概念,能看懂芯片手册和时序图。对于其他基础课程,重点要理解其中的一些基本概念,如何使用等等。

 

对于电子,自动化,通信,计算机类专业的学生,在大二、大三开设的专业基础或专业课程中基本包含了以上的大部分课程。因为缺乏实践,可能学得不是很深入,但是一些基本的概念和基本知识应该还是有所了解,针对一些薄弱环节,自己稍微加强学习一下,基本上已经具备了学习嵌入式开发的基础。在嵌入式基本功学习阶段,最重要的是C语言和单片机基础,最好是能用C语言开发一个小的单片机程序,例如用C语言实现单片机和PC的串口通信,用C语言控制LED等显示,用C语言控制数码管显示等小程序。在这个期间需要的学习工具就是单片机51学习开发板。

 

二、嵌入式Linux应用开发

 

嵌入式开发基础知识学习完后,这时候你已经有了一定的嵌入式开发基础了,可以进行基于单片机的嵌入式系统设计了。单片机编程本身也是属于嵌入式编程,但是在这里我们只是把单片机开发当作嵌入式系统开发的基础,不把单片机开发作为真正的嵌入式系统开发,在这里我们的嵌入式系统开发是指在带有操作系统的嵌入式平台上的应用和驱动开发,特别指在嵌入式Linux平台上的开发。

 

单片机开发在很早以前是非常热门的,现在在一些比较简单的系统上单片机也用的非常广泛,随着硬件的成本不断降低,在一些比较复杂的嵌入式设备一般都采用嵌入式Linux操作系统,在嵌入式Linux平台上进行开发,这样可以极大的提高嵌入式开发效率,提高系统的稳定性和可靠性,降低开发成本。由于Linux是一个开源的操作系统,你可以通过阅读Linux内核来理解内核的实现机制,如果有需要,你甚至可以通过修改内核源码来提高系统的性能;同时,全球参与Linux开发的队伍非常庞大,网上有大量的嵌入式Linux开发资料和源代码,很多你需要实现的功能在网上基本都能找到相关源码,参考一下别人写的源码,这样可以极大的提高自己的工作效率和技术能力,近几年,随着参与Linux开发的人越来越多,Linux系统的稳定性、实时性有了很大的提高,Linux系统无论在服务器上还是嵌入式设备平台上都应用越来越广泛,现在包括华为、中兴、朗讯的各大通信巨头都开始把自己设备的底层平台从vxworks操作系统迁移到Linux系统,可以说嵌入式Linux是嵌入式技术发展一个方向,是嵌入式技术的一面旗帜。基于以上原因,我的建议是学嵌入式开发,就学嵌入式Linux开发,相对于wince等其他的嵌入式平台,你可以真正学到更多的东西,学到嵌入式技术的精髓,同时他又符合嵌入式产业发展的方向,不容易被日新月异的技术发展所淘汰。

 

有了嵌入式开发的基础,又知道了我们为什么要学习嵌入式Linux开发,那我们就要开始动手开始学习了,那如何开始学习嵌入式Linux开发,从哪里开始着手呢?

 

很多同学这时候就开始买Linux书籍,从图书馆借了一大堆关于Linux的书:什么《Linux使用基础教程》、《Linux源码深度分析》、《Linux情景分析等》、 《Linux高级使用指南》等等。结果抱着这些图书看了10天半个月还是不知所云,当初学习的激情慢慢就消退了,最后不了了之,终究没有进入嵌入式开发大门。究其原因,是因为没有找到合适学习嵌入式开发的方法,做任何事情都有方法可循,找对了学习方法往往就能事半功倍;否则就可能是事倍功半,甚至劳而无功。接下来我先分析一下同学们的几种常见的嵌入式Linux学习误区,然后提出一种比较合适的嵌入式Linux学习方法。

 

误区一、全身投入学习桌面或服务器版本Linux系统

 

很多想学嵌入式Linux 的同学经常问我,我不会Linux系统,怎么学习嵌入式Linux开发,于是他们就花费了大量的精力和时间去研究学习桌面版本Linux系统的使用,什么redhat 、federo,、ubuntu等等都用过,如何配置Linux,Linux的各种使用命令都背的滚瓜烂熟,Linux各种服务器的配置,还原备份各种操作非常熟悉,以为这样就学会了嵌入式Linux开发。其实这是一个学习嵌入式Linux开发的误区。

 

Linux桌面环境只是嵌入式Linux的一个开发工具,开发环境而已。我们的目标不是学习Linux服务器的配置和使用,Linux服务器的高级配置和使用那是另外一个领域,不属于嵌入式Linux讨论的范畴。我们进行嵌入式Linux开发,只是把Linux桌面环境当作一个工具,在Linux桌面环境下运行嵌入式Linux开发工具,例如gcc 编译器,make工具来开发我们的嵌入式Linux应用程序而已,对于嵌入式开发工程师来说,没有必要花费那么多的精力和时间去研究Linux桌面版和服务器的应用,只要能了解最基本的操作即可。现在的桌面Linux系统的图形化界面做的也相当好,跟window具有相同的易用性能,例如ubuntu很多操作都可以在图形界面下完成,就没有必要去记每个Linux命令了。熟悉Linux桌面系统的使用和基本操作命令,安排1~2天时间学习基本就可以掌握了。

 

误区二、直接阅读Linux内核源代码

 

很多想学Linux,在连Linux是什么东西,一点都还不会使用的情况下去就阅读Linux内核源代码,花了大量时间去阅读《Linux源码深度分析》、《Linux情景分析等》等书。这样的结果很可能就是看的头昏眼花,不知所云,最后只能放弃了。这也是同学们学习嵌入式linux的一个误区,在有一定嵌入式Linux开发基础后,带着一定的目的去阅读Linux源代码,这样可以极大的提高你的技术能力,但是你在没有任何基础,对Linux一点都不了解的情况下就去阅读Linux内核源代码,无异于以卵击石,最后只能是撞个头破血流。

 

以上分析了同学们学习嵌入式linux 开发的2个误区,那么如何正确的嵌入式linux开发呢?

 

做任何事情都有一个循序渐进的过程,学习嵌入式Linux也一样。在有了一定的嵌入式开发基础后,学习嵌入式Linux开发比较适合的切入点是从嵌入式Linux应用程序开发开始,即暂时先不去关心嵌入式硬件平台,不去关心Linux的底层驱动,先把精力集中在现有的嵌入式Linux平台上进行嵌入式Linux应用程序设计开发。学习嵌入式Linux开发绝不是看看书就可以学好的,需要多实践,编程调试。因为嵌入式开发不同于普通的基于PC机或服务器的应用程序开发,嵌入式开发的应用程序是要烧写到嵌入式板卡或开发板上运行的,所以首先你要给自己购买一块开发板。

 

有了开发板后,先后开始学习嵌入式Linux开发环境搭建、嵌入式Linux开发模型、Linux内核移植和文件系统、嵌入式Linux应用程序移植、嵌入式Linux多进程,多线程应用程序设计、嵌入式Linux网络编程,如果对嵌入式数据库或图形软件开发有兴趣的,可以进一步学习嵌入式Linux数据库开发或基于QT的嵌入式Linux图形应用软件设计。每学一章节都要通过相关实验来验证你从书上学到的东西,同时提高自己编写代码,调试程序的能力。这个过程根据不同学员的基础不同,大概要花上1 ~ 2个月时间。学完这些课程后,你就有了在现有的嵌入式Linux平台上进行应用程式设计开发的能力,到一些嵌入式软件公司去,能够胜任在现有的嵌入式Linux平台上进行上层的应用程序开发工作。但是目前你还不能进行嵌入式Linux系统和驱动的开发,也就是说,你现在只能在一个已经构建好的嵌入式Linux平台上进行应用程序开发,而自己还没有能力根据实际需要去重新构建一个嵌入式Linux平台。要让自己有能力根据实际需要重新构建一个嵌入式Linux软硬件平台,这时候就需要进行下一阶段的学习了,即嵌入式Linux系统和驱动开发。

 

三、嵌入式Linux系统和驱动开发

 

有了嵌入式Linux平台上开发应用程序的基础,你已经对Linux的功能、Linux对应用程序提供的接口和系统调用有了一定的了解,知道如何利用Linux提供的功能来进行应用程序开发,知道如何来使用设备驱动来进行应用程序设计,有了这些知识后,你就可以更深入的去学习Linux系统原理和基于Linux驱动的开发,Linux内核的裁剪,文件系统构,bootloader等等底层的知识了。

 

想要更深入学习嵌入式Linux系统和驱动开发,要学的内容非常多包括计算机软件、硬件、操作系统知识。这时候你可以参照以下的学习思路,因为嵌入式Linux系统和驱动的开发,和底层硬件联系非常紧密,所以首先我们从学习了解嵌入式硬件开始,包括:ARM体系架构、S3C2440微处理器接口设计、时钟系统、LCD屏接口、存储控制器及系统的存储空间分配、NAND FLASH接口和NOR FLASH接口等。对嵌入式系统硬件有了一定的了解后,接下来就可以开始学习bootloader了,理解bootloader的概念,功能,和原理,重点掌握U-BOOT的使用和移植。接下来就开始学习嵌入式Linux内核机制,分析嵌入式Linux源码组成、内核的模块机制、内核进程管理、内存管理机制、Linux的中断系统、Linux内核的移植等。有了内核的基础,就可以学习嵌入式Linux设备驱动开发了,重点掌握字符设备驱动开发,LCD屏设备驱动开发、触摸屏设备驱动开发、USB设备驱动开发,网卡设备驱动开发。学完这些知识点并通过相关实验验证后,嵌入式Linux系统和驱动的开发就算掌握了差不多了,能够胜任绝大部分基于Linux平台的驱动开发工作了。学完这些知识点,根据学员的不同情况,一般需要花三个月到半年时间。通过这一阶段的学习,你在嵌入式Linux开发领域已经算是有了一定的功底,已经不再被人称为菜鸟了,已经进入嵌入式Linux开发高手行列了。

 

四、更上一层楼

 

深入理解了嵌入式内核和驱动开发,这时候写个什么驱动对你已经没有什么问题了,开发过程中一些基本问题都难不倒你了。这时你可能想优化一下系统的性能,比如实时性,提高系统的启动速度,或者优化系统的内存管理机制,要达到修改内核核心机制的境界,你就需要去深入去研读Linux内核源码了,参考《Linux源码深度分析》、《Linux情景分析等》等Linux源码分析的书籍,深入理解Linux各部分的实现机制和原理,以及可能存在的问题。你只有在深入理解现有代码和实现机制的基础上,才能提出更好的改进方案。如果你能达到这个境界,那你已经是高手中的高手,可以笑傲群雄了。

 

以上是笔者结合自己的嵌入式学习经历和嵌入式培训经验总结的一些嵌入式学习方法和步骤,这只是笔者对嵌入式学习的一些看法,希望对那些有兴趣学习嵌入式Linux又不知道从哪开始学的同学们有所帮助。当然,每个人的基础,各方面的情况都不一样,每个人都有自己适合的学习方式,本文章总结的一些学习方法和思路仅供参考。

 

万丈高楼平地起,心动不如行动,有志从事嵌入式开发的同学不要再犹豫了,赶紧拿出实际行动,好好学习,为实现自己的伟大梦想而努力奋斗吧!
转自《嵌入式资讯精选》
转自电子发烧友论坛的一封精华帖,原文链接:http://bbs.elecfans.com/jishu_936861_1_1.html
如本文存在转载问题,请邮件联系删帖:houzhenkai@houzhenkai.com

【转】[环境部署] 腾讯云win2008搭建pptp VPN的简单步骤

这里转载了一篇腾讯云论坛里的关于win2008搭建PPTP VPN的教程,以帮助那些苦苦追寻却不得结果的少年们O(∩_∩)O~~

 

腾讯云win2008搭建pptp VPN的简单步骤
本文以一台腾讯云新安装的win08系统为例进行简单的截图步骤展示。
这台云服务器CVM的配置简单如截图所示:
1.png

 

新安装好的OS,进入系统,首先添加角色
2.png

 

勾选添加网络策略和访问服务
3.png

 

如图勾选需要的角色服务
4.png

 

安装完成后,依次点击开始-管理工具-路由与远程访问工具
5.png

 

如图在服务器上右键,选择“配置并启动路由和远程访问服务”

 

6.png

 

因为是单网卡机器,所以选择自定义配置
7.png

 

选择VPN访问和NAT。
8.png

 

9.png

 

10.png

 

11.png

 

12.png

 

向导安装完成之后,配置添加VPN连接客户机所用的地址池。
13.png

此处也可以配置dhcp动态池,此处省略了,测试过也是可以的。

14.png

 

15.png

至此,RRAS的配置已经完成了,接下来进入NPS配置。

16.png

 

17.png

 

18.png

 

19.png

 

20.png

 

21.png

 

22.png

 

23.png

 

24.png

 

25.png

 

26.png

 

27.png

 

28.png

客户端的设置

29.png

 

30.png

 

31.png

 

此处填写腾讯云服务器即VPN服务器的外网ip。
32.png

 

33.png

 

34.png

 

35.png

 

36.png

 

此时发现已经连上,但是却不能连接上internet,此时vpn服务器端还需要以下操作
37.png

 

右键,新增接口
38.png
39.png

 

40.png

vpn服务器端设置之后,客户端即可连上Internet。

41.png

 

42.png

 

至此,win08 pptp VPN的搭建配置已经成功,此时客户机可以通过vpn连接到腾讯云的服务器,并且可以通过VPN服务器连接上internet。
 
如转载问题,请邮件联系本人删除文章。邮件:houzhenkai@houzhenkai.com

【原】Linux搭建DNS域名服务器

首先科普一下。
域名解析:
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。(来源百度百科)
DNS的全称是Domain Name Server,一种程序,它保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。(来源百度百科)
## Centos 6 版本
首先要安装软件包
# yum install -y bind

# service named start
Starting named: [ OK ]

# vim /etc/named.conf
options {
listen-on port 53 { any; };     # IP地址改成any
listen-on-v6 port 53 { ::1; };
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
allow-query { any; }; # 改成any,允许所有
recursion yes;

dnssec-enable yes;
dnssec-validation no;        # 改成no
dnssec-lookaside auto;

/* Path to ISC DLV key */
bindkeys-file  “/etc/named.iscdlv.key”;

managed-keys-directory   “/var/named/dynamic”;
};
……
zone “test.test” IN {
type master;
file “test.test.zone”; # 文件位置   (注:此配置文件默认在/var/named/)
};

# cp  -p    /var/namednamed.localhost         test.test.zone # 创建一个临时配置文件

# vim     /var/test.test.zone           # 对配置文件进行最后修改

 $        TTL          1D
@           IN           SOA       test.test.        admin.test.test. (
0                        ;serial
1D                      ;refresh
1H                      ;retry
1W                     ;expire
3H )                    ;minimum
NS                    www.test.test.
www      A            42.96.***.***

注意域名后面的 “. ” 代表根

这样一个主域名服务器就搭建成功了

【转】visual studio开发工具的C#主流控件属性一览表

这里详细的介绍了各控制属性的详细中文介绍
1、窗体
1、常用属性
(1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。
(2) WindowState属性: 用来获取或设置窗体的窗口状态。 取值有三种: Normal (窗体正常显示)、 Minimized
(窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示)。
(3)StartPosition属性:用来获取或设置运行时窗体的起始位置。

(4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字。
(5)Width属性:用来获取或设置窗体的宽度。
(6)Height属性:用来获取或设置窗体的高度。
(7)Left属性:用来获取或设置窗体的左边缘的x坐标(以像素为单位)。
(8)Top属性:用来获取或设置窗体的上边缘的y坐标(以像素为单位)。
(9)ControlBox属性:用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控制框。值为true
时将显示控制框,值为false时不显示控制框。
(10)MaximizeBox属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮。值
为 true时显示最大化按钮,值为false时不显示最大化按钮。
(11)MinimizeBox 属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮。值
为 true时显示最小化按钮,值为false时不显示最小化按钮。
(12)AcceptButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Enter 键时就相
当于单击了窗体上的该按钮。
(13)CancelButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Esc 键时就相当
于单击了窗体上的该按钮。
(14)Modal 属性:该属性用来设置窗体是否为有模式显示窗体。如果有模式地显示该窗体,该属性值为
true;否则为 false。当有模式地显示窗体时,只能对模式窗体上的对象进行输入。必须隐藏或关闭模式窗
体(通常是响应某个用户操作),然后才能对另一窗体进行输入。有模式显示的窗体通常用做应用程序中
的对话框。
(15)ActiveControl属性:用来获取或设置容器控件中的活动控件。窗体也是一种容器控件。
(16)ActiveMdiChild属性:用来获取多文档界面(MDI)的当前活动子窗口。
(17)AutoScroll 属性:用来获取或设置一个值,该值指示窗体是否实现自动滚动。如果此属性值设置为
true,则当任何控件位于窗体工作区之外时,会在该窗体上显示滚动条。另外,当自动滚动打开时,窗体
的工作区自动滚动,以使具有输入焦点的控件可见。
(18)BackColor属性:用来获取或设置窗体的背景色。
(19)BackgroundImage属性:用来获取或设置窗体的背景图像。
(20)Enabled 属性:用来获取或设置一个值,该值指示控件是否可以对用户交互作出响应。如果控件可

以对用户交互作出响应,则为 true;否则为false。默认值为true。
(21)Font属性:用来获取或设置控件显示的文本的字体。
(22)ForeColor属性:用来获取或设置控件的前景色。
(23)IsMdiChild属性:获取一个值,该值指示该窗体是否为多文档界面(MDI)子窗体。值为 true时,
是子窗体,值为false时,不是子窗体。
(24)IsMdiContainer 属性:获取或设置一个值,该值指示窗体是否为多文档界面(MDI)中的子窗体的
容器。值为true时,是子窗体的容器,值为false时,不是子窗体的容器。
(25)KeyPreview属性:用来获取或设置一个值,该值指示在将按键事件传递到具有焦点的控件前,窗体
是否将接收该事件。值为true时,窗体将接收按键事件,值为false时,窗体不接收按键事件。
(26)MdiChildren属性:数组属性。数组中的每个元素表示以此窗体作为父级的多文档界面(MDI)子窗
体。
(27)MdiParent属性:用来获取或设置此窗体的当前多文档界面(MDI)父窗体。
(28)ShowInTaskbar属性:用来获取或设置一个值,该值指示是否在Windows任务栏中显示窗体。
(29)Visible属性:用于获取或设置一个值,该值指示是否显示该窗体或控件。值为true
时显示窗体或控件,为 false时不显示。
(30)Capture属性:如果该属性值为true,则鼠标就会被限定只由此控件响应,不管鼠标是否在此控件的
范围内。
2、常用方法
下面介绍一些窗体的最常用方法。
(1)Show方法:该方法的作用是让窗体显示出来,其调用格式为:
窗体名.Show();
其中窗体名是要显示的窗体名称。
(2)Hide方法:该方法的作用是把窗体隐藏出来,其调用格式为:
窗体名.Hide();
其中窗体名是要隐藏的窗体名称。
(3)Refresh方法:该方法的作用是刷新并重画窗体,其调用格式为:
窗体名.Refresh();
其中窗体名是要刷新的窗体名称。
(4)Activate方法:该方法的作用是激活窗体并给予它焦点。其调用格式为:
窗体名.Activate();
其中窗体名是要激活的窗体名称。
(5)Close方法:该方法的作用是关闭窗体。其调用格式为:
窗体名.Close();
其中窗体名是要关闭的窗体名称。
(6)ShowDialog方法:该方法的作用是将窗体显示为模式对话框。其调用格式为:
窗体名.ShowDialog();
3.常用事件
(1)Load事件:该事件在窗体加载到内存时发生,即在第一次显示窗体前发生。
(2)Activated事件:该事件在窗体激活时发生。
(3)Deactivate事件:该事件在窗体失去焦点成为不活动窗体时发生。
(4)Resize事件:该事件在改变窗体大小时发生。
(5)Paint事件:该事件在重绘窗体时发生。
(6)Click事件:该事件在用户单击窗体时发生。

(7)DoubleClick事件:该事件在用户双击窗体时发生。
(8)Closed事件:该事件在关闭窗体时发生。

文本框类控件

2、Label 控件
1、常用属性:
(1)Text属性:用来设置或返回标签控件中显示的文本信息。
(2)AutoSize 属性:用来获取或设置一个值,该值指示是否自动调整控件的大小以完整显示其内容。取
值为 true时,控件将自动调整到刚好能容纳文本时的大小,取值为false时,控件的大小为设计时的大小。
默认值为false。
(3)Anchor 属性:用来确定此控件与其容器控件的固定关系的。所谓容器控件指的是这样一种情况:往
往在控件之中还有一个控件,例如最典型的就是窗体控件中会包含很多的控件,像标签控件、文本框等。
这时称包含控件的控件为容器控件或父控件,而父控件称为子控件。这时将遇到一个问题,即子控件与父
控件的位置关系问题,即当父控件的位置、大小变化时,子控件按照
什么样的原则改变其位置、大小。Anchor属性就规定了这个原则。
对于 Anchor 属性,可以设定 Top、Bottom、Right、Left 中的任意几
种,设置的方法是在属性窗口中单击Anchor属性右边的箭头,将会
出现如图 9-6 的窗口,通过它可设置 Anchor 属性值。图 9-6 中选中
变黑的方位即为设定的方位控制,即图中所示的为 Left、Right、
Bottom。此时,如果父窗口变化,子窗口将保证其左边缘与容器左边
的距离、上边缘与容器上边的距离、底边与容器底边的距离等不变,
效果如图9-7 所示。
可见随着窗体的大小变
化, Label控件也会随着
变 。 而 不 变 的 则 是
Archor中所规定的边
缘与相应的父控件边缘
的距离。
(4)BackColor属性:
用来获取或设置控件的背景色。当该属性值设置为 Color.Transparent 时,标签将透明显示,即背景色不再
显示出来。
(5)BorderStyle 属性:用来设置或返回边框。有三种选择:
BorderStyle.None 为无边框(默认),BorderStyle.FixedSingle 为固
定单边框,BorderStyle.Fixed3D 为三维边框。
(6)TabIndex属性:用来设置或返回对象的Tab键顺序。
(7)Enabled 属性:用来设置或返回控件的状态。值为 true 时允
许使用控件,值为 false 时禁止使用控件,此时标签呈暗淡色,一
般在代码中设置。图9-8 边框效果图
另外,标签还具有Visible、ForeColor、Font等属性,具体含义请参考窗体的相应属性。

3、TextBox 控件
1、主要属性:
(1)Text属性:Text属性是文本框最重要的属性,因为要显示的文本就包含在Text属性中。默认情况下,
最多可在一个文本框中输入2048个字符。如果将MultiLine属性设置为true,则最多可输入32KB 的文本。
Text属性可以在设计时使用【属性】窗口设置,也可以在运行时用代码设置或者通过用户输入来设置。可
以在运行时通过读取Text属性来获得文本框的当前内容。
(2)MaxLength 属性:用来设置文本框允许输入字符的最大长度,该属性值为 0 时,不限制输入的字符
数。
(3)MultiLine 属性:用来设置文本框中的文本是否可以输入多行并以多行显示。值为 true 时,允许多行
显示。值为false时不允许多行显示,一旦文本超过文本框宽度时,超过部分不显示。
(4)HideSelection属性:用来决定当焦点离开文本框后,选中的文本是否还以选中的方式显示,值为true,
则不以选中的方式显示,值为 false将依旧以选中的方式显示。
(5)ReadOnly属性:用来获取或设置一个值,该值指示文本框中的文本是否为只读。值为 true时为只读,
值为 false时可读可写。
(6)PasswordChar 属性:是一个字符串类型,允许设置一个字符,运行程序时,将输入到 Text 的内容全
部显示为该属性值,从而起到保密作用,通常用来输入口令或密码。
(7) ScrollBars属性: 用来设置滚动条模式, 有四种选择: ScrollBars.None (无滚动条), ScrollBars.Horizontal
(水平滚动条),ScrollBars.Vertical(垂直滚动条),ScrollBars.Both(水平和垂直滚动条)。
注意:只有当MultiLine属性为true时,该属性值才有效。在WordWrap属性值为true时,
水平滚动条将不起作用
(8)SelectionLength属性:用来获取或设置文本框中选定的字符数。只能在代码中使用,值为0 时,表示
未选中任何字符。
(9)SelectionStart属性:用来获取或设置文本框中选定的文本起始点。只能在代码中使用,第一个字符的
位置为0,第二个字符的位置为1,依此类推。
(10)SelectedText 属性:用来获取或设置一个字符串,该字符串指示控件中当前选定的文本。只能在代
码中使用。
(11)Lines:该属性是一个数组属性,用来获取或设置文本框控件中的文本行。即文本框中的每一行存放
在 Lines数组的一个元素中。
(12)Modified:用来获取或设置一个值,该值指示自创建文本框控件或上次设置该控件的内容后,用户
是否修改了该控件的内容。值为true表示修改过,值为 false表示没有修改过。
(13)TextLength属性:用来获取控件中文本的长度。
(14)WordWrap:用来指示多行文本框控件在输入的字符超过一行宽度时是否自动换行到下一行的开始,
值为 true,表示自动换到下一行的开始,值为false表示不自动换到下一行的开始。
2、常用方法:
(1)AppendText方法:把一个字符串添加到文件框中文本的后面,调用的一般格式如下:
文本框对象.AppendText(str)
参数 str是要添加的字符串。
(2)Clear方法:从文本框控件中清除所有文本。调用的一般格式如下:
文本框对象.Clear()该方法无参数。
(3)Focus方法:是为文本框设置焦点。如果焦点设置成功,值为 true,否则为false。调用的一般格式如
下:
文本框对象.Focus()该方法无参数。

(4)Copy方法:将文本框中的当前选定内容复制到剪贴板上。调用的一般格式如下:
文本框对象.Copy()该方法无参数。
(5)Cut方法:将文本框中的当前选定内容移动到剪贴板上。调用的一般格式如下:
文本框对象.Cut()该方法无参数。
(6)Paste方法:用剪贴板的内容替换文本框中的当前选定内容。调用的一般格式如下:
文本框对象.Paste()该方法无参数。
(7)Undo 方法:撤销文本框中的上一个编辑操作。调用的一般格式如下:
文本框对象.Undo()该方法无参数。
(8)ClearUndo方法:从该文本框的撤销缓冲区中清除关于最近操作的信息,根据应用
程序的状态,可以使用此方法防止重复执行撤销操作。调用的一般格式如下:
文本框对象.ClearUndo()该方法无参数。
(9)Select方法:用来在文本框中设置选定文本。调用的一般格式如下:
文本框对象.Select(start,length)
该方法有两个参数,第一个参数start用来设定文本框中当前选定文本的第一个字符的位
置,第二个参数length用来设定要选择的字符数。
(10)SelectAll方法:用来选定文本框中的所有文本。调用的一般格式如下:
文本框对象.SelectAll()该方法无参数。
3、常用事件:
(1)GotFocus事件:该事件在文本框接收焦点时发生。
(2)LostFocus事件:该事件在文本框失去焦点时发生。
(3)TextChanged事件:该事件在Text属性值更改时发生。无论是通过编程修改还是用户交互更改文本框
的 Text属性值,均会引发此事件。

4、RichTextBox控件
RichTextBox是一种既可以输入文本、 又可以编辑文本的文字处理控件, 与TextBox控件相比, RichTextBox
控件的文字处理功能更加丰富, 不仅可以设定文字的颜色、 字体, 还具有字符串检索功能。 另外, RichTextBox
控件还可以打开、编辑和存储.rtf格式文件、ASCII文本格式文件及Unicode编码格式的文件。
1、常用属性
上面介绍的 TextBox 控件所具有的属性,RichTextBox 控件基本上都具有,除此之外,该控件还具有一些
其他属性。
(1)RightMargin属性:用来设置或获取右侧空白的大小,单位是像素。通过该属性可以设置右侧空白,
如希望右侧空白为50像素,可使用如下语句:
RichTextBox1.RightMargin=RichTextBox1.Width-50;
(2)Rtf属性:用来获取或设置RichTextBox控件中的文本,包括所有RTF格式代码。可以使用此属性将
RTF格式文本放到控件中以进行显示,或提取控件中的RTF格式文本。此属性通常用于在RichTextBox控
件和其他RTF源(如 MicrosoftWord或 Windows写字板)之间交换信息。
(3)SelectedRtf 属性:用来获取或设置控件中当前选定的 RTF 格式的格式文本。此属性使用户得以获取
控件中的选定文本,包括RTF格式代码。如果当前未选定任何文本,给该属性赋值将把所赋的文本插入到
插入点处。如果选定了文本,则给该属性所赋的文本值将替换掉选定文本。
(4)SelectionColor属性:用来获取或设置当前选定文本或插入点处的文本颜色。
(5)SelectionFont属性:用来获取或设置当前选定文本或插入点处的字体。
2、常用方法

前面介绍的 TextBox 控件所具有的方法,RichTextBox 控件基本上都具有,除此之外,该控件还具有一些
其他方法。
(1)Redo方法:用来重做上次被撤销的操作。调用的一般格式如下:
RichTextBox对象.Redo()
该方法无参数。
(2)Find方法:用来从RichTextBox控件中查找指定的字符串。经常使用的调用格式如下:
[格式1]:
RichTextBox对象.Find(str)
[功能]:在指定的“RichTextBox”控件中查找文本,并返回搜索文本的第一个字符在控件内的位置。如果
未找到搜索字符串或者str参数指定的搜索字符串为空,则返回值为1。
[格式2]:
RichTextBox对象.Find(str,RichTextBoxFinds)
[功能]:在“RichTextBox 对象”指定的文本框中搜索 str 参数中指定的文本,并返回文本的第一个字符在
控件内的位置。如果返回负值,则未找到所搜索的文本字符串。还可以使用此方法搜索特定格式的文本。
参数RichTextBoxFinds指定如何在控件中执行文本搜索,其取值及其含义如表9-4 所示。

[格式3]:
RichTextBox对象.Find(str,start,RichTextBoxFinds)
[功能]:这里Find方法与前面的格式2 基本类似,不同的只是通过设置控件文本内的搜索起始位置来缩小
文本搜索范围,start参数表示开始搜索的位置。此功能使用户得以避开可能已搜索过的文本或已经知道不
包含要搜索的特定文本的文本。如果在options参数中指定了RichTextBoxFinds.Reverse值,则 start参数的
值将指示反向搜索结束的位置,因为搜索是从文档底部开始的。
(3)SaveFile方法:用来把RichTextBox中的信息保存到指定的文件中,调用格式有以下三种。
[格式1]:
RichTextBox对象名.SaveFile(文件名);
[功能]:将 RichTextBox控件中的内容保存为RTF格式文件中。
[格式2]:
RichTextBox对象名.SaveFile(文件名,文件类型);
[功能]:将 RichTextBox控件中的内容保存为“文件类型”指定的格式文件中。
[格式3]:
RichTextBox对象名.SaveFile(数据流,数据流类型);
[功能]:将 RichTextBox控件中的内容保存为“数据流类型”指定的数据流类型文件中。
其中,文件类型或数据流类型的取值及含义如表9-5所示。
(4)LoadFile方法:使用LoadFile方法可以将文本文件、RTF文件装入RichTextBox控件。主要的调用格
式有以下三种。
[格式1]:
RichTextBox对象名.LoadFile(文件名);

[功能]:将RTF格式文件或标准ASCII文本文件加载到RichTextBox控件中。
[格式2]:
RichTextBox对象名.LoadFile(数据流,数据流类型);
[功能]:将现有数据流的内容加载到RichTextBox控件中。
[格式3]:
RichTextBox对象名.LoadFile(文件名,文件类型);
[功能]:将特定类型的文件加载到RichTextBox控件中。
注意:文件类型和数据流格式见表9-5。

5、NumericUpDown 控件
【Windows 窗体】控件组中的 NumericUpDown 控件看起来像是一个文本框与一对用户可单击以调整值的
箭头的组合。可以通过单击向上和向下按钮、按向上和向下箭头键来增大和减小数字,也可以直接输入数
字。单击向上箭头键时,值向最大值方向增加;单击向下箭头键时,值
向最小值方向减少。该控件在工具箱中的图标为 。
该控件的样式如图9-13所示。
1、常用属性:
(1)DecimalPlaces:获取或设置该控件中显示的小数位数。
(2)Hexadecimal:获取或设置一个值,该值指示该控件是否以十六进制格式显示所包
含的值。
(3)Increment:获取或设置单击向上或向下按钮时,该控件递增或递减的值。
(4)Maximum:获取或设置该控件的最大值。
(5)Minimum:获取或设置该控件的最小值。
(6)Value:获取或设置该控件的当前值。
与 TextBox控件一样,NumericUpDown控件的常用事件有:ValueChanged、GotFocus、LostFocus等。
按钮类控件
6、Button 控件
Button控件又称按钮控件,是 Windows应用程序中最常用的控件之一,通常用它来执行命令。如果按钮具
有焦点,就可以使用鼠标左键、Enter键或空格键触发该按钮的Click事件。通过设置窗体的AcceptButton
或 CancelButton 属性,无论该按钮是否有焦点,都可以使用户通过按 Enter 或 Esc 键来触发按钮的 Click
事件。一般不使用 Button 控件的方法。Button 控件也具有许多如 Text、ForeColor 等的常规属性,此处不
再介绍,只介绍该控件有特色的属性。以后介绍的控件也采用同样的方法来处理。
1、常用属性

(1)DialogResult属性:当使用ShowDialog方法显示窗体时,可以使用该属性设置当用户按了该按钮后,
ShowDialog方法的返回值。值有:OK、Cancel、Abort、Retry、Ignore、Yes、No等。
(2)Image属性:用来设置显示在按钮上的图像。
(3)FlatStyle属性:用来设置按钮的外观。其取值及含义如表9-7 所示。

2、常用事件:
(1)Click事件:当用户用鼠标左键单击按钮控件时,将发生该事件。
(2)MouseDown事件:当用户在按钮控件上按下鼠标按钮时,将发生该事件。
(3)MouseUp事件:当用户在按钮控件上释放鼠标按钮时,将发生该事件。

7、GroupBox 控件
GroupBox控件又称为分组框,它在工具箱中的图标是 。该控件常用于为其他控件提供可
识别的分组,其典型的用法之一就是给RadioButton控件分组。可以通过分组框的Text属性为分组框中的
控件向用户提供提示信息,如图 9-14 所示。设计时,向GroupBox 控件中添
加控件的方法有两种:一是直接在分组框中绘制控件;二是把某一个已存在
的控件复制到剪贴板上,然后选中分组框,再执行粘贴操作即可。位于分组
框中的所有控件随着分组框的移动而一起移动,随着分组框的删除而全部删
除,分组框的Visible属性和Enabled属性也会影响到分组框中的所有控件。
分组框的最常用的属性是Text,一般用来给出分组提示。

8、RadioButton控件
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供
两个或多个互斥选项,即在一组单选钮中只能选择一个,如图9-14所示。
1、常用属性:
(1)Checked属性:用来设置或返回单选按钮是否被选中,选中时值为true,没有选中时值为false。
(2)AutoCheck 属性:如果 AutoCheck 属性被设置为 true(默认),那么当选择该单选按钮时,将自动清
除该组中所有其他单选按钮。对一般用户来说,不需改变该属性,采用默认
值(true)即可。
(3)Appearance 属性:用来获取或设置单选按钮控件的外观。当其取值为 Appearance.Button 时,将使单
选按钮的外观像命令按钮一样:当选定它时,它看似已被按下。当取值为 Appearance.Normal 时,就是默
认的单选按钮的外观。
(4)Text属性:用来设置或返回单选按钮控件内显示的文本,该属性也可以包含访问键,即前面带有“&”
符号的字母,这样用户就可以通过同时按Alt键和访问键来选中控件。
2、常用事件:

(1)Click事件:当单击单选按钮时,将把单选按钮的Checked属性值设置为true,同时发生Click事件。
(2)CheckedChanged事件:当Checked属性值更改时,将触发CheckedChanged事件。

9、CheckBox 控件
CheckBox控件的常用属性如下。
(1)TextAlign属性:用来设置控件中文字的对齐方式,有9种选择,如图9-16 所示。
从上到下、从左至右分别是:ContentAlignment.TopLeft、ContentAlignment.TopCenter、
ContentAlignment.TopRight、ContentAlignment.MiddleLeft、ContentAlignment.MiddleCenter、
ContentAlignment.MiddleRight、ContentAlignment.BottomLeft、ContentAlignment.BottomCenter
和 ContentAlignment.BottomRight。该属性的默认值为ContentAlignment.MiddleLeft,即文字左
对齐、居控件垂直方向中央。
(2)ThreeState属性:用来返回或设置复选框是否能表示三种状态,如果属性值为true时,表示可以表示
三种状态—选中、没选中和中间态(CheckState.Checked、CheckState.Unchecked
和 CheckState.Indeterminate),属性值为false时,只能表示两种状
态——选中和没选中。
(3)Checked属性:用来设置或返回复选框是否被选中,值为true时,表示复选框被选中,值为false时,
表示复选框没被选中。当ThreeState属性值为true时,中间态也表示选中。
(4)CheckState 属性:用来设置或返回复选框的状态。在 ThreeState 属性值为 false 时,取值有
CheckState.Checked或CheckState.Unchecked。在ThreeState属性值被设置为True时,CheckState还可以取
值 CheckState.Indeterminate,在此时,复选框显示为浅灰色选中状态,该状态通常表示该选项下的多个子
选项未完全选中。
CheckBox控件的常用事件有Click和CheckedChanged等,其含义及触发时机与单选按钮
完成一致。
列表类控件
10、ListBox 控件
ListBox 控件又称列表框,它在工具箱中的图标为,它显示一个项目列表供用户选择。在列表框中,用户
一次可以选择一项,也可以选择多项。
1、常用属性:
(1) Items属性: 用于存放列表框中的列表项,
是一个集合。通过该属性,可以添加列表项、
移除列表项和获得列表项的数目。
(2)MultiColumn 属性:用来获取或设置一
个值,该值指示ListBox是否支持多列。值
为 true 时表示支持多列,值为 false 时不支持
多列。当使用多列模式时,可以使控件得以显
示更多可见项,如图9-19 所示。
(3)ColumnWidth 属性:用来获取或设置多
列 ListBox控件中列的宽度。
(4)SelectionMode属性:用来获取或设置在ListBox控件中选择列表项的方法。当 SelectionMode属性设
置为 SelectionMode.MultiExtended 时,按下 Shift 键的同时单击鼠标或者同时按 Shift 键和箭头键之一(上
箭头键、下箭头键、左箭头键和右箭头键),会将选定内容从前一选定项扩展到当前项。按 Ctrl 键的同时
单击鼠标将选择或撤销选择列表中的某项;当该属性设置为 SelectionMode.MultiSimple 时,鼠标单击或按- 11 –

空格键将选择或撤销选择列表中的某项;该属性的默认值为SelectionMode.One,则只能选择一项。
(5)SelectedIndex属性:用来获取或设置ListBox控件中当前选定项的从零开始的索引。如果未选定任何
项,则返回值为1。对于只能选择一项的ListBox控件,可使用此属性确定ListBox中选定的项的索引。如
果 ListBox 控件的 SelectionMode 属性设置为 SelectionMode.MultiSimple 或 SelectionMode.MultiExtended,
并在该列表中选定多个项,此时应用SelectedIndices来获取选定项的索引。
(6)SelectedIndices。该属性用来获取一个集合,该集合包含 ListBox 控件中所有选定项的从零开始的索
引。
(7)SelectedItem属性:获取或设置ListBox中的当前选定项。
(8)SelectedItems属性:获取 ListBox控件中选定项的集合,通常在ListBox控件的SelectionMode属性值
设置为SelectionMode.MultiSimple或SelectionMode.MultiExtended(它指示多重选择ListBox)时使用。
(9)Sorted属性:获取或设置一个值,该值指示ListBox控件中的列表项是否按字母顺序排序。如果列表
项按字母排序,该属性值为true;如果列表项不按字母排序,该属性值为false。默认值为false。在向已排
序的 ListBox控件中添加项时,这些项会移动到排序列表中适当的位置。
(10)Text 属性:该属性用来获取或搜索 ListBox 控件中当前选定项的文本。当把此属性值设置为字符串
值时,ListBox 控件将在列表内搜索与指定文本匹配的项并选择该项。若在列表中选择了一项或多项,该
属性将返回第一个选定项的文本。
(11)ItemsCount属性:该属性用来返回列表项的数目。
2、常用方法:
(1)FindString方法:用来查找列表项中以指定字符串开始的第一个项,有两种调用格式。
[格式1]:
ListBox对象.FindString(s);
[功能]:在“ListBox 对象”指定的列表框中查找字符串 s,如果找到则返回该项从零开始的索引;如果找
不到匹配项,则返回ListBox.NoMatches。
[格式2]:
ListBox对象.FindString(s,n);
[功能]:在 ListBox 对象指定的列表框中查找字符串 s,查找的起始项为n+1,即 n 为开始查找的前一项的
索引。如果找到则返回该项从零开始的索引;如果找不到匹配项,则返回ListBox.NoMatches。
注意:FindString 方式只是词语部分匹配,即要查找的字符串在列表项的开头,便认为是匹配的,如果要
精确匹配,即只有在列表项与查找字符串完全一致时才认为匹配,可使用FindStringExact方法,调用格式
与功能与FindString基本一致。
(2)SetSelected方法:用来选中某一项或取消对某一项的选择,调用格式及功能如下。
[格式]:
ListBox对象.SetSelected(n,l);
[功能]:如果参数 l 的值是 true,则在 ListBox 对象指定的列表框中选中索引为 n 的列表项,如果参数l 的
值是 false,则索引为n 的列表项未被选中。
(3)Items.Add方法:用来向列表框中增添一个列表项,调用格式及功能如下。
[格式]:
ListBox对象.Items.Add(s);
[功能]:把参数s添加到“listBox对象”指定的列表框的列表项中。
(4)Items.Insert方法:用来在列表框中指定位置插入一个列表项,调用格式及功能如下。
[格式]:
ListBox对象.Items.Insert(n,s);
[功能]:参数n代表要插入的项的位置索引,参数 s代表要插入的项,其功能是把s插入到“listBox对象”
指定的列表框的索引为n的位置处。

(5)Items.Remove方法:用来从列表框中删除一个列表项,调用格式及功能如下。
[格式]:
ListBox对象.Items.Remove(k);
[功能]:从 ListBox对象指定的列表框中删除列表项s。
(6)Items.Clear方法:用来清除列表框中的所有项。其调用格式如下:
ListBox对象.Items.Clear();
该方法无参数。
(7)BeginUpdate方法和EndUpdate方法:这两个方法均无参数,调用格式分别如下:
ListBox对象.BeginUpdate();
ListBox对象.EndUpdate();
这两个方法的作用是保证使用 Items.Add 方法向列表框中添加列表项时,不重绘列表框。即在向列表框添
加项之前,调用BeginUpdate方法,以防止每次向列表框中添加项时都重新
绘制 ListBox 控件。完成向列表框中添加项的任务后,再调用 EndUpdate 方法使 ListBox 控件重新绘制。
当向列表框中添加大量的列表项时,使用这种方法添加项可以防止在绘制 ListBox 时的闪烁现象。一个例
子程序如下:
publicvoidAddToMyListBox()
{listBox1.BeginUpdate();
for(intx=1;x<5000;x++) { listBox1.Items.Add("Item"+x.ToString()); } listBox1.EndUpdate(); } ListBox控件常用事件有Click和 SelectedIndexChanged,SelectedIndexChanged事件在列表框中改变选中项 时发生。 11、ComboBox 控件 ComboBox 控件又称组合框,在工具箱中的图标为。默认情况下,组合框分两个部分显示:顶部是一个允 许输入文本的文本框,下面的列表框则显示列表项。可以认为ComboBox就是文本框与列表框的组合,与 文本框和列表框的功能基本一致。与列表框相比,组合框不能多选,它无 SelectionMode 属性。但组合框 有一个名为DropDownStyle的属性,该属性用来设置或获取组合框的样式,其取值及含义如表9-10所示。 组合框的各种样式如图9-22 所示, 左边的组合框能够通过文本框输入文本, 中间的组合框则不能输入文本, 只能选择列表项。 12、CheckedListBox 控件 CheckedListBox控件又称复选列表框,它扩展了ListBox控件,它几乎 能完成列表框可以完成的所有任务,并且还可以在列表项旁边显示复 选标记。两种控件间的其他差异在于,复选列表框只支持 DrawMode.Normal,并且复选列表框只能有一项选定或没有任何选定。此处需要注意一点:选定的项是指 窗体上突出显示的项,已选中的项是指左边的复选框被选中的项。复选列表框的样式如图9-23所示。 除具有列表框的全部属性外,它还具有以下属性。 (1)CheckOnClick属性:获取或设置一个值,该值指示当某项被选定时 是否应切换左侧的复选框。如果立即切换选中标记,则该属性值为true; 否则为false。默认值为false。 (2)CheckedItems 属性:该属性是复选列表框中选中项的集合,只代表 处于CheckState. Checked或CheckState.Indeterminate状态的那些项。 该集 合中的索引按升序排列。 (3)CheckedIndices 属性:该属性代表选中项(处于选中状态或中间状 态的那些项)索 引的集合。 PictureBox控件的使用 13、PictureBox 控件的使用 PictureBox 控件又称图片框,常用于图形设计和图像处理应用程序,在该控件中可以加载的图像文件格式 有:位图文件(.Bmp)、图标文件(.ICO)、图元文件(.wmf)、.JPEG 和.GIF 文件。下而仅介绍该控件的 常用属性和事件。 1、常用属性: (1)Image属性:用来设置控件要显示的图像。把文件中的图像加载到图片框通常采用以下三种方式。 设计时单击Image属性,在其后将出现【…】按钮,单击该按钮将出现一个【打开】对话框,在该对话框 中找到相应的图形文件后单击【确定】按钮。产生一个Bitmap类的实例并赋值给Image属性。形式如下: Bitmapp=newBitmap(图像文件名); pictureBox对象名.Image=p; 通过 Image.FromFile方法直接从文件中加载。形式如下: pictureBox对象名.Image=Image.FromFile(图像文件名); (2)SizeMode属性:用来决定图像的显示模式。 14、Timer 控件 Timer 控件又称定时器控件或计时器控件,在工具箱中的图标是 ,该控件的主要作用是按一定的 时间间隔周期性地触发一个名为Tick的事件, 因此在该事件的代码中可以放置一些需要每隔一段时间重复 执行的程序段。在程序运行时,定时器控件是不可见 的。 1、常用属性: (1)Enabled 属性:用来设置定时器是否正在运行。值为 true 时,定时器正在运行,值为 false 时,定时 器不在运行。 (2)Interval属性:用来设置定时器两次Tick事件发生的时间间隔,以毫秒为单位。如它的值设置为500, 则将每隔0.5秒发生一个Tick事件。 2、常用方法: (1)Start方法:用来启动定时器。调用的一般格式如下: Timer控件名.start(); 该方法无参数。 (2)Stop方法:用来停止定时器。调用的一般格式如下: Timer控件名.stop(); 该方法无参数。 3、常用事件: 定义器控件响应的事件只有Tick,每隔Interval时间后将触发一次该事件。 15、ProgressBar控件和 TrackBar控件 1.ProgressBar控件 ProgressBar 控件又称进度条控件,它在工具栏中的图标为 ,该控件在水平栏中显示适当长度 的矩形来指示进程的进度。当执行进程时,进度条用系统突出显示颜色在水平栏中从左向右进行填充。进 程完成时,进度栏被填满。当某进程运行时间较长时,如果没有视觉提示,用户可能会认为应用程序不响 应,通过在应用程序中使用进度条,就可以告诉用户应用程序正在执行冗长的任务且应用程序仍在响应。 ProgressBar控件的常用属性如下。 (1)Maximum属性:用来设置或返回进度条能够显示的最大值,默认值为100。 (2)Minimum属性:用来设置或返回进度条能够显示的最小值,默认值为0。 (3)Value属性:用来设置或返回进度条的当前位置。 (4)Step属性:用来设置或返回一个值,该值用来决定每次调用PerformStep 方法时, Value属性增加的 幅度。例如,如果要复制一组文件,则可将 Step 属性的值设置为 1,并将 Maximum 属性的值设置为要复 制的文件总数。在复制每个文件时,可以调用PerformStep方法按Step属性的值增加进度栏。 ProgressBar控件的常用方法如下。 (1)Increment方法:用来按指定的数量增加进度条的值,调用的一般格式如下: progressBar对象.Increment(n); 其功能是把“progressBar对象”指定的进度条对象的Value属性值增加n,n为整数。调用该方法之后,若 Value属性大于Maximum属性的值,则 Value属性值就是Maximum值,若Value属性小于Minimum属性 值,则 Value属性值就是Minimum值。 (2)PerformStep方法:用来按step属性值来增加进度条的Value属性值,调用的一般格式如下: progressBar对象.PerformStep(); 该方法无参数。例如,下列程序段是一个显示复制多个文件的进度的进度条使用方法。 privatevoidCopyWithProgress(string[]filenames) {pBar1.Visible=true; pBar1.Minimum=1; pBar1.Maximum=filenames.Length; pBar1.Value=1; pBar1.Step=1; for(intx=1;x<=filenames.Length;x++) {if(CopyFile(filenames[x-1])==true) { pBar1.PerformStep(); } } } ProgressBar控件能响应很多事件,但一般很少使用。 2.TrackBar控件 TrackBar 控件又称滑块控件、跟踪条控件,它在工具箱中的图标是“ ” 。该控件主要用于在 大量信息中进行浏览,或用于以可视形式调整数字设置。TrackBar控件有两部分:缩略图(也称为滑块) 和刻度线。缩略图是可以调整的部分,其位置与 Value 属性相对应。刻度线是按规则间隔分隔的可视化指 示符。跟踪条控件可以按指定的增量移动,并且可以水平或者垂直排列。 TrackBar控件的常用属性如下。 (1)Maximum属性:用来获取或设置TrackBar控件可表示的范围上限,即最大值。 (2)Minimum属性:用来获取或设置TrackBar控件可表示的范围下限,即最小值。 (3)Orientation属性:用来获取或设置一个值,该值指示跟踪条是在水平方向还是在垂 直方向。 (4)LargeChange属性:用来获取或设置一个值,该值指示当滑块长距离移动时应为Value属性中加上或 减去的值。 (5)SmallChange属性:用来获取或设置当滑块短距离移动时对Value属性进行增减的值。 (6)Value属性:用来获取或设置滑块在跟踪条控件上的当前位置的值。 (7)TickFrequency属性:用来获取或设置一个值,该值指定控件上绘制的刻度之间的增量。 (8)TickStyle 属性:用来获取或设置一个值,该值指示如何显示跟踪条上的刻度线。 TrackBar控件的常用事件是ValueChanged,该事件在TrackBar控件的Value属性值改变时发生。 16、HScrollBar 控件和 VScrollBar控件的使用 滚动条(ScrollBar)是大部分Windows应用程序中都具有的控件,是 Windows界面的 一种常见元素,通常分为水平滚动条(HscrollBar)和垂直滚动条(VscrollBar)。HScrollBar 在工具箱中的图标是,VScrollBar控件在工具箱中的图标是。这两 个控件主要用于在应用程序或控件中水平或垂直滚动,以方便在较长的列表中或大量信息中 转移。 1、常用属性: (1)Minimum和 Maximum属性:与TrackBar控件的同名属性基本相同。 (2)Value属性:用于设置或返回滑块在滚动条中所处的位置,其默认值为0。当滑块 的位置值为最小值时,滑块移到水平滚动条的最左端位置,或移到垂直滚动条的顶端位置。 当滑块的位置值为最大值时,滑块移到水平滚动条的最右端位置或垂直滚动条的底端位置。 (3)SmallChange和LargeChange属性:这两个属性主要用于调整滑块移动的距离。其 中 SmallChange属性用于控制当鼠标单击滚动条两边的箭头时,滑块滚动的值,即 Value属性 增加或减小的值。而LargeChange属性则控制当用鼠标直接单击滚动条时滑块滚动的值。当 用户按下PageUp键或PageDown键或者在滑块的任何一边单击滚动条轨迹时,Value属性将 按照 LargeChange属性中设置的值进行增加或减小。 2、常用事件: (1)Scroll事件:该事件在用户通过鼠标或键盘移动滑块后发生。 (2)ValueChanged事件:该事件在滚动条控件的Value属性值改变时发生。 滚动条的使用方法与TrackBar控件基本一致,此处不再赘述。 对话框类控件 17、OpenFileDialog 控件 OpenFileDialog控件又称打开文件对话框,主要用来弹出Windows中标准的【打开文件】 对话框。该控件在工具箱中的图标为 。 OpenFileDialog控件的常用属性如下。 (1)Title属性:用来获取或设置对话框标题,默认值为空字符串("")。如果标题为空字符串,则系统将 使用默认标题: “打开” 。 (2)Filter属性:用来获取或设置当前文件名筛选器字符串,该字符串决定对话框的【另存为文件类型】 或【文件类型】框中出现的选择内容。对于每个筛选选项,筛选器字符串都包含筛选器说明、垂直线条(|) 和筛选器模式。不同筛选选项的字符串由垂直线条隔开,例如: “文本文件(*.txt)|*.txt|所有文件(*.*)|*.*” 。 还可以通过用分号来分隔各种文件类型,可以将多个筛选器模式添加到筛选器中,例如: “图像文件 (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG; *.GIF|所有文件(*.*)|*.*” 。 (3)FilterIndex属性:用来获取或设置文件对话框中当前选定筛选器的索引。第一个筛选器的索引为1, 默认值为1。 (4)FileName 属性:用来获取在打开文件对话框中选定的文件名的字符串。文件名既包含文件路径也包 含扩展名。如果未选定文件,该属性将返回空字符串("")。 (5)InitialDirectory属性:用来获取或设置文件对话框显示的初始目录,默认值为空字符串("")。 (6)ShowReadOnly属性:用来获取或设置一个值,该值指示对话框是否包含只读复选框。如果对话框包 含只读复选框,则属性值为true,否则属性值为false。默认值为false。 (7)ReadOnlyChecked属性:用来获取或设置一个值,该值指示是否选定只读复选框。如果选中了只读复 选框,则属性值为true,反之,属性值为false。默认值为false。 (8)Multiselect属性:用来获取或设置一个值,该值指示对话框是否允许选择多个文件。如果对话框允许 同时选定多个文件,则该属性值为true,反之,属性值为false。默认值为false。 (9)FileNames属性:用来获取对话框中所有选定文件的文件名。每个文件名都既包含文件路径又包含文 件扩展名。如果未选定文件,该方法将返回空数组。 (10)RestoreDirectory属性:用来获取或设置一个值,该值指示对话框在关闭前是否还原当前目录。假设 用户在搜索文件的过程中更改了目录,且该属性值为 true,那么,对话框会将当前目录还原为初始值,若 该属性值为 false,则不还原成初始值。默认值为 false。OpenFileDialog 控件的常用方法有两个:OpenFile 和 ShowDialog方法,本节只介绍ShowDialog方法,该方法的作用是显示通用对话框,其一般调用形式如 下: 通用对话框对象名.ShowDialog(); 通用对话框运行时,如果单击对话框中的【确定】按钮,则返回值为 DialogResult.OK;否则返回值为 DialogResult.Cancel。其他对话框控件均具有ShowDialog方法,以后不再重复介绍。 18、SaveFileDialog 控件 SaveFileDialog 控件又称保存文件对话框,主要用来弹出 Windows 中标准的【保存文件】对话框。该控件 在工具箱中的图标为 。 SaveFileDialog 控件也具有 FileName、Filter、FilterIndex、InitialDirectory、Title 等属性,这些属性的作用 与 OpenFileDialog对话框控件基本一致,此处不再赘述。 需注意的是:上述两个对话框只返回要打开或保存的文件名,并没有真正提供打开或保存文件的功能,程 序员必须自己编写文件打开或保存程序,才能真正实现文件的打开和保存功能。 19、FontDialog 控件 FontDialog控件又称字体对话框,主要用来弹出Windows中标准的【字体】对话框。该控件在工具箱中的 图标为 。字体对话框的作用是显示当前安装在系统中的字体列表,供用户进行选择。下面 介绍字体对话框的主要属性。 (1)Font属性:该属性是字体对话框的最重要属性,通过它可以设定或获取字体信息。 (2)Color属性:用来设定或获取字符的颜色。 (3)MaxSize属性:用来获取或设置用户可选择的最大磅值。 (4)MinSize属性:用来获取或设置用户可选择的最小磅值。192VisualC#.NET应用教程 (5)ShowColor属性:用来获取或设置一个值,该值指示对话框是否显示颜色选择框。如果对话框显示颜 色选择框,属性值为true,反之,属性值为false。默认值为false。 (6)ShowEffects 属性:用来获取或设置一个值,该值指示对话框是否包含允许用户指定删除线、下划线 和文本颜色选项的控件。如果对话框包含设置删除线、下划线和文本颜色选项的控件,属性值为 true,反 之,属性值为false。默认值为true。 20、ColorDialog控件 ColorDialog 控件又称颜色对话框,主要用来弹出 Windows 中标准的【颜色】对话框。该控件在工具箱中 的图标为 。颜色对话框的作用是供用户选择一种颜色,并用 Color 属性记录用户选择- 18 - 的颜色值。下面介绍颜色对话框的主要属性。 (1)AllowFullOpen属性:用来获取或设置一个值,该值指示用户是否可以使用该对话框定义自定义颜色。 如果允许用户自定义颜色,属性值为true,否则属性值为false。默认值为true。 (2)FullOpen 属性:用来获取或设置一个值,该值指示用于创建自定义颜色的控件在对话框打开时是否 可见。值为true时可见,值为 false时不可见。 (3)AnyColor 属性:用来获取或设置一个值,该值指示对话框是否显示基本颜色集中可用的所有颜色。 值为 true时,显示所有颜色,否则不显示所有颜色。 (4)Color属性:用来获取或设置用户选定的颜色。 21、PrintDialog控件和 PrintDocument 控件 PrintDialog 控件在工具箱中的图标是 ,PrintDocument 控件在工具箱中的图标是 。使用PrintDialog控件可以显示Windows标准的【打印】对话框,在该对话框中用户可 以选择打印机、选择要打印的页及页码范围等。需要注意的是:该对话框并不负责具体的打印任务,要想 在应用程序中控制打印内容必须使用 PrintDocument 控件。关于这两个控件的详细使用方法读者可参阅相 关资料或VisualC#的帮助文件。 6.用户自定义对话框 除了可以使用Windows自带的标准对话框外,用户还可以把自己设计的窗体定义成对话框。使用自定义对 话框有以下几个要点。 (1)将窗体的FormBorderStyle属性值设置为FixedDialog。 (2)根据需要向窗体上添加控件。 (3)使用窗体的ShowDialog方法显示窗体,即显示出对话框。 22、用户自定义对话框 除了可以使用Windows自带的标准对话框外,用户还可以把自己设计的窗体定义成对话框。使用自定义对 话框有以下几个要点。 (1)将窗体的FormBorderStyle属性值设置为FixedDialog。 (2)根据需要向窗体上添加控件。 (3)使用窗体的ShowDialog方法显示窗体,即显示出对话框。 23、菜单控件 Windows 的菜单系统是图形用户界面(GUI)的重要组成之一,在 VisualC#中使用 MainMenu 控件可以很 方便地实现Windows的菜单,MainMenu控件在工具箱中的图标为 。 1.菜单的结构 图 10-9和图10-10 是典型的菜单结构。其中有文字的单个命令称菜单项,顶层菜单项是横着排列的,单击 某个菜单项后弹出的称为菜单或子菜单,它们均包含若干个菜单项,菜单项其实是 MenuItem 类的一个对 象。菜单项有的是变灰显示的,表示该菜单项当前是被禁止使用的。有的菜单项的提示文字中有带下划线 的字母,该字母称为热键(或访问键),若是顶层菜单,可通过按“ALT+热键”打开该菜单,若是某个子 菜单中的一个选项,则在打开子菜单后直接按热键就会执行相应的菜单命令。有的菜单项后面有一个按键 或组合键,称快捷键,在不打开菜单的情况下按快捷键,将执行相应的命令。在图 10-9 中,【保存文件】 菜单项是加粗显示的,该菜单项称为默认项。图10-9的【另存为】和【退出】之间有一个灰色的线条,该 线条称为分隔线或分隔符。在图 10-10 中菜单项【白色背景】前面有一个“√”号,称为选中标记,菜单 项加上选中标记表示该菜单项代表的功能当前正在起作用。 2.菜单项的常用属性 (1)Text 属性:用来获取或设置一个值,通过该值指示菜单项标题。当使用 Text 属性为菜单项指定标题 时,还可以在字符前加一个“&”号来指定热键(访问键,即加下划线的字母)。例如,若要将“File”中 的“F”指定为访问键,应将菜单项的标题指定为“&File” 。 (2)Checked属性:用来获取或设置一个值,通过该值指示选中标记是否出现在菜单项文本的旁边。如果 要放置选中标记在菜单项文本的旁边,属性值为true,否则属性值为false。默认值为false。 (3)DefaultItem 属性:用来获取或设置一个值,通过该值指示菜单项是否为默认菜单项。值为 true 时, 是默认菜单项,值为 false时,不是默认菜单项。菜单的默认菜单项以粗体的形式显示。当用户双击包含默 认项的子菜单后,默认项被选定,然后子菜单关闭。 (4)Enabled属性:用来获取或设置一个值,通过该值指示菜单项是否可用。值为true时表示可用,值为 false表示当前禁止使用。 (5)RadioCheck 属性:用来获取或设置一个值,通过该值指示选中的菜单项的左边是显示单选按钮还是 选中标记。值为true时将显示单选按钮标记,值为false时显示选中标记。 (6)Shortcut属性:用来获取或设置一个值,该值指示与菜单项相关联的快捷键。 (7)ShowShortcut 属性:用来获取或设置一个值,该值指示与菜单项关联的快捷键是否在菜单项标题的 旁边显示。如果快捷组合键在菜单项标题的旁边显示,该属性值为 true,如果不显示快捷键,该属性值为 false。默认值为true。 (8)MdiList属性:用来获取或设置一个值,通过该值指示是否用在关联窗体内显示的多文档界面(MDI) 子窗口列表来填充菜单项。若要在该菜单项中显示MDI子窗口列表,则设置该属性值为true,否则设置该 属性的值为false。默认值为false。 3.菜单项的常用事件 菜单项的常用事件主要有Click事件,该事件在用户单击菜单项时发生。 24、多窗体程序设计 Windows应用程序很少只由一个窗体组成, 一 般情况下一个应用程序均拥有很多个窗体。 C#项目刚建立时只有一个名为Form1的窗体, 要建立多窗体应用程序应首先为项目添加窗 体,添加窗体的方法如下。 (1) 单击工具栏上的按钮 或执行【项 目】→【添加Windows窗体】命令, 将会出现如图 10-17 所示的【添加新 项】对话框。 (2) 在该对话框的【模板】下面的列表框中 选中【Windows 窗体】图标,在【名称】文本框中输 入窗体名,然后单击【打开】按钮,即为应用程序添加了一个窗体。 25、MDI 应用程序设计 1.MDI应用程序的概念 在前面的章节中,所创建的都是单文档界面(SDI)应用程序。这样的程序(如记事本和画图程序)仅支 持一次打开一个窗口或文档。如果需要编辑多个文档,必须创建SDI应用程序的多个实例。而使用多文档 界面(MDI)程序(如Word和AdobePhotoshop)时,用户可以同时编辑多个文档。MDI程序中的应用程 序窗口称为父窗口,应用程序内部的窗口称为子窗口。虽 然 MDI应用程序可以具有多个子窗口, 但是每个子窗口却 只能有一个父窗口。此外,处于活动状态的子窗口最大数 目是 1。子窗口本身不能再成为父窗口,而且不能移动到 它们的父窗口区域之外。除此以外,子窗口的行为与任何 其他窗口一样(如可以关闭、最小化和调整大小等)。一个 子窗口在功能上可能与父窗口的其他子窗口不同,例如, 一个子窗口可能用于编辑图像,另一个子窗口可能用于编 辑文本,第 3 个子窗口可以使用图形来显示数据,但是所 有的窗口都属于相同的MDI父窗口。图 10-19 是一个典型 的 MDI应用程序。外面的窗口是应用程序窗口,里面的两 个小窗口是 MDI子窗口。 2.与 MDI应用程序设计有关的属性、方法和事件 常用的MDI父窗体属性如下。 (1)ActiveMdiChild属性:该属性用来表示当前活动的MDI子窗口,如果当前没有子窗口,则返回null。 (2)IsMdiContainer属性:该属性用来获取或设置一个值,该值指示窗体是否为多文档界面(MDI)子窗 体的容器,即MDI父窗体。值为true时,表示是父窗体,值为false时,表示不是父窗体。 (3)MdiChildren属性:该属性以窗体数组形式返回MDI子窗体,每个数组元素对应一个 MDI子窗体。 常用的MDI子窗体的属性有: (1)IsMdiChild属性:该属性用来获取一个值,该值指示该窗体是否为多文档界面(MDI)的子窗体。值 为 true时,表示是子窗体,值为false时,表示不是子窗体。 (2)MdiParent属性:该属性用来指定该子窗体的MDI父窗体。与MDI应用程序设计有关的方法中,一 般只使用父窗体的LayoutMdi方法,该方法的调用格式如下: MDI父窗体名.LayoutMdi(Value); 该方法用来在MDI父窗体中排列MDI子窗体,以便导航和操作MDI子窗体。参数Value决定排列方式, 取值有:MdiLayout.ArrangeIcons(所有 MDI 子窗体以图标的形式排列在 MDI 父窗体的工作区内)、 MdiLayout.TileHorizontal (所有MDI子窗口均水平平铺在MDI父窗体的工作区内)、 MdiLayout.TileVertical (所有 MDI 子窗口均垂直平铺在 MDI 父窗体的工作区内)和 MdiLayout.Cascade(所有 MDI 子窗口均层 叠在 MDI 父窗体的工作区内)。常用的 MDI 父窗体的事件是 MdiChildActivate,当激活或关闭一个 MDI 子窗体时将发生该事件。 3.菜单合并 父窗体和子窗体可以使用不同的菜单,这些菜单会在选择子窗体的时候合并。如果需要指定菜单的合并方 式,程序员可以设置每个菜单项的MergeOrder属性和MergeType属性。 (1)MergeOrder属性:用来确定当两个菜单合并时菜单项出现的顺序,具有较低 MergeOrder的菜单项会首先出现。 (2)MergeType属性:当合并的两个菜单的某些菜单项的MergeOrder属性值相等时, 使用该属性可以控制这些菜单项的显示方式。其取值及含义如表10-4所示。 26、键盘事件处理 键盘事件在用户按下键盘上的键时发生,可分为两类。第一类是KeyPress事件,当按下的键表示的是一个 ASCII 字符时就会触发这类事件,可通过它的 KeyPressEventArgs 类型参数的属性 KeyChar 来确定按下键 的 ASCII 码。使用 KeyPress 事件无法判断是否按下了修改键(例如 Shift,Alt 和 Ctrl 键),为了判断这些 动作, 就要处理KeyUp 或KeyDown事件, 这些事件组成了第二类键盘事件。 该类事件有一个KeyEventArgs 类型的参数,通过该参数可以测试是否按下了一些修改键、功能键等特殊按键信息。 1.KeyPressEventArgs类的主要属性(KeyPress事件的一个参数类型) (1)Handled属性:用来获取或设置一个值,该值指示是否处理过KeyPress事件。 (2)KeyChar属性:用来获取按下的键对应的字符,通常是该键的ASCII码。 2.KeyEventArgs类的主要属性(KeyUp和 KeyDown事件的一个参数) (1)Alt属性:用来获取一个值,该值指示是否曾按下Alt键。 (2)Control属性:用来获取一个值,该值指示是否曾按下Ctrl键。 (3)Shift属性:用来获取一个值,该值指示是否曾按下Shift键。 (4)Handled属性:用来获取或设置一个值,该值指示是否处理过此事件。 (5)KeyCode属性:以 Keys枚举型值返回键盘键的键码,该属性不包含修改键(Alt、Control和 Shift键) 信息,用于测试指定的键盘键。 (6)KeyData 属性:以 Keys 枚举类型值返回键盘键的键码,并包含修改键信息,用于判断关于按下键盘 键的所有信息。 (7)KeyValue属性:以整数形式返回键码,而不是Keys枚举类型值。用于获得所按下键盘键的数字表示。 (8)Modifiers 属性:以 Keys 枚举类型值返回所有按下的修改键(Alt、Control 和 Shift 键),仅用于判断 修改键信息。 27、鼠标事件处理 对鼠标操作的处理是应用程序的重要功能之一,在VisualC#中有一些与鼠标操作相关的事件,利用它们可 以方便地进行与鼠标有关的编程。 (1)MouseEnter事件:在鼠标指针进入控件时发生。 (2)MouseMove事件:在鼠标指针移到控件上时发生。事件处理程序接收一个MouseEventArgs类型的参 数,该参数包含与此事件相关的数据。该参数的主要属性及其含义如下。 Button属性:用来获取曾按下的是哪个鼠标按钮。该属性是MouseButtons枚举型的值, 取值及含义如下:Left(按下鼠标左按钮)、Middle(按下鼠标中按钮)、Right(鼠标右按钮)、None(没 有按下鼠标按钮)、 XButton1 (按下了第一个XButton按钮, 仅用于Microsoft智能鼠标浏览器) 和XButton2 (按下了第二个XButton按钮,仅用于 Microsoft智能鼠标浏览器) Clicks属性:用来获取按下并释放鼠标按钮的次数。 Delta属性:用来获取鼠标轮已转动的制动器数的有符号计数。制动器是鼠标轮的一个凹口。 X 属性:用来获取鼠标所在位置的x坐标。 Y 属性:用来获取鼠标所在位置的y坐标。 (3)MouseHover事件:当鼠标指针悬停在控件上时将发生该事件。 (4)MouseDown事件:当鼠标指针位于控件上并按下鼠标键时将发生该事件。事件处理程序也接收一个 MouseEventArgs类型的参数。 (5)MouseWheel事件:在移动鼠标轮并且控件有焦点时将发生该事件。该事件的事件处理程序接收一个 MouseEventArgs类型的参数 (6)MouseUp 事件:当鼠标指针在控件上并释放鼠标键时将发生该事件。事件处理程序也接收一个 MouseEventArgs类型的参数。 (7)MouseLeave事件:在鼠标指针离开控件时将发生该事件。 来源:

【原】C#利用类进行两个或者多个页面的参数传递

C# 页面跳转后传递参数的方法有好多种,下面介绍的是利用类来传递参数的一种方式。
这是我自己自定义的一个类,用来接收参数,传递参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FTPClient.Common
{
// 定义一个接受参数传递参数的类
class GetParameter
{
public static string Parameters1 = “”,Parameters2= “”, Parameters3= “”; //定义需要的全局参数。
public void SaveParameter(string parameters1 , string parameters2 , string parameters3)
{
//接受传递来的参数,通过全局变量赋值
Parameters1 = parameters1 ;
Parameters2= parameters2;
Parameters3= parameters3;

}
public static string Parameters1()
{
return Parameters1 ; //返回参数,传递地址参数1。

}
public static string Parameters2()
{
return Parameters2; //返回参数,传递参数2。
}
public static string Parameters3()
{
return Parameters3; //返回参数,传递参数3。
}
}
}

这样,我就可以在第一个页面里,使用如下代码
string parameter1 = “test1”,parameter2 = “test2”, parameter3 = “test3″; // 所需要的变量
GetParameter getparmeter = new GetParameter(); //实例化接收参数的类
getparmeter.saveparameter(parameter1 , parameter2 , parameter3 );//将参数传递到类里

在第二个页面里输出第一个页面里保存到类里面的变量

string parameter_a=””, parameter_b=””, parameter_c=”” // 定义用于接收参数的变量
parameter_a= GetParameter.parameter1; //接受类中封装的变量参数
parameter_b= GetParameter.parameter2;
parameter_c= GetParameter.parameter3;

至此,参数传递完毕。可以在新的页面里使用上个页面里的变量了。

【原】搭建Apache时重启报错(小错误集合)

在我们平时使用Apache的时候,会遇到重启,而重启经常会出现如下错误提示

Starting httpd:httpd: Could not reliably determine the server’s fully qualified doma in name, using  10.10.10.10 for ServerName

可能大多数人看到了重启成功,就没去在意这两行字是什么意思。

76c963d7-13cb-4e50-82cd-e3c35b0a0b82

 

这个问题是因为配置文件有不对的地方,而要解决这个问题,只需要更改一下配置文件即可。

vi  /etc/httpd/conf/httpd.conf

8c50cd42-e142-46c7-a7b5-f6cc52ada9cd

 

在配置文件里找到    #ServerName www.example.com:80

这一行,将这一行更改为: ServerName localhost:80

即可解决这个问题。