--------------------------------------------------------------------------------
杨连贺
在计算机软件技术中,人机界面已经发展成为一个重要的分支。在MIS开发中,人机界面的重要性尤为突出。笔者根据多年从事MIS开发的经验,浅谈一下MIS类软件人机界面设计时应遵循的原则。
一、前言
随着计算机软硬件技术的发展,人机界面的重要性与日俱增。一些专家指出:"对于用户,人机界面就是系统本身。"在计算机发展的早期,受计算速度、存储容量等条件的限制,用户一味追求运行速度与所占空间,致使程序员在开发软件时不得不绞尽脑汁,考虑如何使所开发的软件运行速度快、占用内存/外存小,故程序员在开发软件时无不把主要精力放在软件内部算法与数据结构上。
然而时过境迁,硬件技术的飞速发展,使计算速度与存储容量不再成为软件开发人员所担心的问题,用户关心的主要问题是能否比较容易地使用软件。换言之,人们的着眼点在于软件的易用性,而易用与否主要取决于人机界面的优劣。众所周知,在当今的硬件与软件环境下,一个MIS软件没有很好的界面设计就不能算是成功。因为不管它内部有多么精巧的技术,只要用户不愿意使用它,它的优越性就得不到发挥,它的价值和作用也无从谈起。
正因如此,人机界面研究已经从过去的从属地位上升为一个专门的领域,国内外均有很多学者从事这方面的研究。Windows*作系统的日臻完善,更给人机界面技术以强有力的支持。
二、MIS人机界面设计的基本原则
1.以通信功能作为界面设计的核心
人机界面的关键是使人与计算机之间能够准确地交流信息。一方面,人向机器输入时应当尽量采取自然的方式;另一方面,机器向人传递的信息必须准确,不致引起误解或混乱。另外,不要把内部的处理、加工与人机界面混在一起(人机界面程序只是通信),以免互相干扰,影响速度。
MIS设计时,针对每一个功能,都要按照"I-P-O"的模块化思想,使输入、处理与输出"泾渭分明",充分体现人机界面的通信功能。这样设计出来的程序不但不易出错,而且易于维护,即使有了错误也很容易加以改正。
报表打印是MIS必备的功能之一,而且打印之前常常需要计算。毕其功于一役并非明智之举。尽管这样做或许会节省一些运行时间,但对以后的维护极为不利。计算与打印分开设计,固然会增加一些时空开销,但考虑到可维护性,付出这一代价是完全值得的。
2.界面必须始终一致
一致的人机界面不致增加用户的负担,让用户始终用同一种方式思考与*作。最忌讳的是每换一个屏幕用户就要换一套*作命令与*作方法。
Windows下的应用软件之所以倍受青睐,与其界面的一致性不无关系。例如,以问号图标表示帮助,以磁盘图标表示存盘,以打印机图标表示打印,等等。
3.界面必须使用户随时掌握任务的进展情况
人机界面应该能够告诉用户软件运行的进度。特别是在需要较长时间的等待时,必须让用户了解工作进展情况,如已经完成了百分之几等。切不可让用户面对一个没有反应的屏幕,以致怀疑是否出现了死机现象。
目前,Windows下的应用软件无论大小,其安装程序几乎均做到了这一点。开发MIS软件时,这一点很值得借鉴。
4.界面必须能够提供帮助
决不可以认为使用程序的用户都是专家,无需提供帮助。有关的提示、信息、说明应该放在随手可得的位置。
一个优秀的MIS软件应该提供在线求助功能,甚至提供使用向导,这无疑会给用户带来极大的方便。使用超链接技术将使求助功能锦上添花。在多媒体环境下,以语音提示作为*作向导,不会干扰屏幕信息,是一个极佳的选择。
5.宁可让程序多干,不可让用户多干
多数MIS软件的数据输入量较大。对于一些相对固定的数据,不应让用户频频输入(特别是汉字),而应让用户用鼠标轻松选择。例如,人事管理系统中的"文化程度"系相对固定的数据,其值一般取"小学"、"初中"、"高中"、"大专"、"大本"、"硕研"、"博研"等。录入这类数据之前,MIS软件应在相应位置弹出一个列表框,待用户以鼠标点击,而不应让用户每次都输入这些汉字。
汉字输入与西文输入的状态切换虽说是举手之劳,但频繁进行状态切换令人颇感厌烦。若能够在程序中实现自动切换,无疑是深受用户欢迎的。
MIS软件开发完毕后,交付给用户使用时,开发人员往往要求用户记录软件的出错情况。这不能不说是强人所难,因为此举增加了用户的额外负担。开发者应编写一个错误实时记录程序,自动记录何日、何时、何程序出了何种错误。
总之,所开发的MIS在使用过程中,应使用户的数据输入量降至最低限度,同时使用户的干预尽量少。实践证明,用户干预愈少,MIS系统的满意程度愈高。
6.输入画面尽可能接近实际
如果某个电算会计软件的凭证录入画面是表格式的,一屏可录入多条记录,而且与实际凭证一模一样,甚至连颜色都无异,用户在终端上录入凭证,仿佛用笔在纸上填写凭证,那么,一种亲切感会油然而生。试想,哪个用户不愿意使用呢?相反,如果一屏只能录一条记录,录入一条凭证要*作数屏,那么结果是可想而知的。
7.具有较强的容错功能
误*作、按键连击等均有可能导致数据误录。巧妙地进行程序设计,可以避免此类因素造成的错误。例如,录入学生成绩时,我们可以对其范围进行限定,使用户无法输入0-100以外的数据;录入学生年龄时,不妨根据实际情况将范围限制在15-20之间。
三、人机界面设计中的矛盾及解决办法
设计人机界面时,经常会遇到灵活性与一致性的权衡问题。原则上,对某一软件来说,用户的思维方式应当是一致的,*作与控制的方式也应当是一致的。只有这样,才能减轻用户使用软件的困难,使用户不知不觉地进入统一的思维框架,从而正确地、顺利地应用这个软件。但这只是问题的一个方面。另一方面的问题是,用户是多种多样的,它们有各自的习惯与爱好,应当让他们有一定的灵活性,能够自由地选择某些功能的*作方式。
例如,出于方便,有人喜欢使用箭头键选择下拉菜单中列出的某项功能,有人则偏偏习惯于使用快捷键,因为它们非常快捷。设计软件时,我们不妨使"鱼与熊掌"兼得。
再如,对于人机界面的色彩,有人从提高工作效率着眼,喜欢鲜艳悦目的彩色界面;有人则则从保护视力出发,宁愿要黑白的。开发MIS软件时,程序员不妨给用户选择颜色的余地。
四、结束语
在MIS软件的开发中,人机界面的重要性已经提到议事日程上来,其优劣已是衡量软件质量的重要标准之一。
界面打造全记录 界面打造全记录
□作者:Daka 原转ChinaUI
一个新的界面产生真不容易啊,这个项目是我进现在这个公司遇到的最重要的一个项目,项目组的艰辛换来的是一个全新产品的诞生。
我作为这个项目最早的成员之一,把这次的软件界面开发经历和大家侃侃。
一.大事记
2001年7月25日
虽然外面是炎炎酷暑,不过办公室里面却是一个舒适凉爽的地方,但还是按耐不住寂寞,只有看看杂志来协调前几天紧张工作的心情。想不到就这一天起我开始了一直持续至今的一个重要产品的开发工作……
我们项目组就从这一天成立了,为基金管理公司开发一套大型的综合平台。公司里很重视这个项目,也第一次把用户界面放在一个很高的高度看待……说真的我一直抱怨公司在产品用户界面上不够重视,这次到是一个不错的表现机会。
对了!我要提一下我们小组的人员构成:项目经理(1人)、用户界面(我拉:)1人)、程序员(3人其中有一个要负责版本控制)、数据库(1人)、助理(1人——组里唯一的女性,这个很重要哦:))
当然这是一开始的状况,前期筹备工作嘛,从开始的到随后的2、3个月我们都在做一些资料收集和研究的工作,当然也包括在用户界面上的探讨,随后就有新人陆续加入,人数在12人小组的规模上稳定下来。
2001年7月29日
总的来说用户需求从量上说是很庞大的,而我们的用户大都是些对电脑软件*作并不精通的财经研究人员,所以我的任务就是要开发出在庞大功能机制的基础上的一个*作方便的用户界面。
下面是我最先画的一个结构草图(用CorelDraw做的,不过我觉得还是用Microsoft Visio最方便):
在思路上还是很明显沿着网站界面的设计套路,因为事实上这个产品就是一个基于IE内核的软件,界面开发模式和做WEB页面是一样的。
此主题相关图片如下:2001年7月31日
这是第一个界面草图方案(使用软件为Photoshop):
此主题相关图片如下:此主题相关图片如下:没想到吧,和微软的网站差不错的布局,其实就是仿造拉。但大家都不怎么满意。我设计这个界面的初衷是要定下基本的排版,这样的排版到是可以了,不过大家想多花点时间探索点新的东西出来……,项目进度嘛……暴雪公司不是也老跳票嘛。
2001年9月3日
我重新整理了思路,这第二个方案草图:
此主题相关图片如下:此主题相关图片如下:这样的布局是我在第一次的思维技术上的衍生,我比较满意颜色的运用,但界面布局太乱了,不断的修改……
此主题相关图片如下:2001年9月3日
一切都在进展中……
此主题相关图片如下:此主题相关图片如下:2001年11月12日
当然少不了用户登入界面,参照了MSN explorer:
此主题相关图片如下:2002年3月5日
界面样式已经完全确定了,各个栏目不断加入:
此主题相关图片如下:此主题相关图片如下:二.经验谈
关于图标
图标主要是用Photoshop做的合成效果,不过我还是倾心完全的原创图标,可项目进度不允许我这么做,因为人员太少了,我不得不做很多和UI没关系的事情。看看我的图标集中营吧:
此主题相关图片如下:还尝试过用3D软件做图标,不过最后没有采用,我用的是Rhino,大家用过吗?
此主题相关图片如下:产品标志设计
此主题相关图片如下:开发软件
1.下面这个是产品功能拓扑,用的软件是Microsoft Visio,是我根据我们的产品设计书画的(细节看不清楚就对了,商业机密哦)。这个工作太重要了,能上我们在UI设计时有依可寻,并始终掌握全局。
此主题相关图片如下:2.界面开发:Photoshop、dreamwaver;版本控制:Microsoft Visual SourceSafe 6.0
此主题相关图片如下:此主题相关图片如下:三.成品
控制功能图
此主题相关图片如下:内建帮助系统
做产品帮助的工作量非常大,是一个很细心的活,这个帮助是我做的,做的时候真叫伤脑筋伤体力啊!
此主题相关图片如下:产品宣传页
用Illustrator做的,好处就是可以同时发布PDF和印刷品,不过我Illustrator用的不怎么样,Coreldraw我满行的不过不能用做PDF输出,可惜呀。
此主题相关图片如下:产品网站
这网站做的不怎么样,拿不出手,不过再“傻”也是产品宣传的一部分,大家就将就吧。
此主题相关图片如下:此主题相关图片如下:这次就先写这么多了,这应该是我做的第一个比较完整的软件UI,我觉得我的基本功不行,做出来的东西还很稚嫩。更希望有些视觉效果能用3D软件来实现。希望大家多多指点。
界面设计测试规范界面设计测试规范
界面测试
界面测试(红鬃野马)作者:flowingice
我在工作中总结了一些有关界面设计与测试的规范,与大家共享。 界面设计与测试规则
界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的*作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而且设计良好的界面由于需要具有艺术美的天赋而遭拒绝。
目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。
1:易用性:
按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确*作。
易用性细则:
1):完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。
2):完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。
3):按功能将界面划分局域块,用Frame框括起来,并要有功能说明或标题。
4):界面要支持键盘自动浏览按钮功能,即按Tab键的自动切换功能。
5):界面上首先应输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。
6):同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
7):分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab
8):默认按钮要支持Enter及选*作,即按Enter后自动执行默认按钮对应*作。
9):可写控件检测到非法输入后应给出说明并能自动获得焦点。
10):Tab键的顺序与控件排列顺序要一直,目前流行总体从上到下,同时行间从左到右的方式。
11):复选框和选项框按选择几率的高底而先后排列。
12):复选框和选项框要有默认选项,并支持Tab选择。
13):选项数相同时多用选项框而不用下拉列表框。
14):界面空间较小时使用下拉框而不用选项框。
15):选项数叫少时使用选项框,相反使用下拉列表框。
16):专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。
2: 规范性:
通常界面设计都按Windows界面的规范来设计,即包含“菜单条、工具栏、工具厢、状态栏、滚动条、右键快捷菜单”的标准格式,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具厢。
规范性细则:
1):常用菜单要有命令快捷方式。
2):完成相同或相近功能的菜单用横线隔开放在同一位置。
3):菜单前的图标能直观的代表要完成的*作。
4):菜单深度一般要求最多控制在三层以内。
5):工具栏要求可以根据用户的要求自己选择定制。
6):相同或相近功能的工具栏放在一起。
7):工具栏中的每一个按钮要有及时提示信息。
8):一条工具栏的长度最长不能超出屏幕宽度。
9): 工具栏的图标能直观的代表要完成的*作。
10):系统常用的工具栏设置默认放置位置。
11):工具栏太多时可以考虑使用工具厢。
12):工具厢要具有可增减性,由用户自己根据需求定制。
13):工具厢的默认总宽度不要超过屏幕宽度的1/5。
14): 状态条要能显示用户切实需要的信息,常用的有:
目前的*作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一*作需要的时间较长,还应该显示进度条和进程提示。
15):滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。
16):状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。
17):菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。
18):菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。
19):右键快捷菜单采用与菜单相同的准则。
3:帮助设施:
系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。
帮助设施细则:
1):帮助文档中的性能介绍与说明要与系统性能配套一致。(我们的系统帮助文档都是系统的祖先时期的说明,让人困惑)。
2):打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。
3):*作时要提供及时调用系统帮助的功能。常用F1。
4):在界面上调用帮助时应该能够及时定位到与该*作相对的帮助位置。也就是说帮助要有即时针对性。
5):最好提供目前流行的联机帮助格式或HTML帮助格式。
6):用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。
7):如果没有提供书面的帮助文档的话,最好有打印帮助的功能。
8 ):在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。
4:合理性:
屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。
合理性细则:
1):父窗体或主窗体的中心位置应该在对角线焦点附近。
2):子窗体位置应该在主窗体的左上角或正中。
3):多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。
4):重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。
5):错误使用容易引起界面退出或关闭的按钮不应该放在易点位置。横排开头或最后与竖排最后为易点位置。
6):与正在进行的*作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)。
7):对可能造成数据无法恢复的*作必须提供确认信息,给用户放弃选择的机会。
8):非法的输入或*作应有足够的提示说明。
9): 对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。
10):提示、警告、或错误说明应该清楚、明了、恰当。
5:美观与协调性:
界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。
美观与协调性细则:
1): 长宽接近黄金点比例,切忌长宽比例失调、或宽度超过长度。
2): 布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。
3): 按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置。
4): 按钮的大小要与界面的大小和空间要协调。
5): 避免空旷的界面上放置很大的按钮。
6):放置完控件后界面不应有很大的空缺位置。
7): 字体的大小要与界面的大小比例协调, 通常使用的字体中宋体9-12较为美观,很少使用超过12号的字体。
8): 前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常用色考虑使用Windows界面色调。
9): 如果使用其他颜色,主色要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。
10): 大型系统常用的主色有"#E1E1E1"、"#EFEFEF"、"#C0C0C0"等。
11): 界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。
12): 如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。
13):对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。
14): 通常父窗体支持缩放时,子窗体没有必要缩放。
15):如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。
6:菜单位置:
菜单是界面上最重要的元素,菜单位置按照按功能来组织。
菜单设测试细则:
1):菜单通常采用“常用--主要--次要--工具--帮助”的位置排列,符合流行的Windows风格。
2):常用的有“文件”、“编辑”,“查看”等,几乎每个系统都有这些选项,当然要根据不同的系统有所取舍。
3):下拉菜单要根据菜单选项的含义进行分组,并切按照一定的规则进行排列,用横线隔开。
4): 一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。
5): 没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。
6): 如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。
7): 菜单深度一般要求最多控制在三层以内。
8): 对常用的菜单要有快捷命令方式,组合原则见8。
9):对与进行的*作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式——即只有需要的菜单才显示——最好。
10):菜单前的图标不宜太大,与字高保持一直最好。
11):主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。
12):主菜单数目不应太多,最好为单排布置。
。7:独特性:
如果一味的遵循业界的界面标准,则会丧失自己的个性.在框架符合以上规范的情况下,设计具有自己独特风格的界面尤为重要。尤其在商业软件流通中有着很好的迁移默化的广告效用。
1):安装界面上应有单位介绍或产品介绍,并有自己的图标。
2):主界面,最好是大多数界面上要有公司图标。
3):登录界面上要有本产品的标志,同时包含公司图标。
4):帮助菜单的“关于”中应有版权和产品信息。
5):公司的系列产品要保持一直的界面风格,如背景色、字体、菜单排列方式、图标、安装过程、按钮用语等应该大体一致。
8:快捷方式的组合
在菜单及按钮中使用快捷键可以让喜欢使用键盘的用户*作得更快一些 在西文Windows及其应用软件中快捷键的使用大多是一致的。
菜单中:
1):面向事务的组合有:
Ctrl-D 删除 ;Ctrl-F 寻找 ;Ctrl –H替换;Ctrl-I 插入 ;Ctrl-N 新记录 ;Ctrl-S 保存 Ctrl-O 打开。
2):列表:
Ctrl-R ,Ctrl-G定位;Ctrl-Tab下一分页窗口或反序浏览同一页面控件;。
3):编辑:
Ctrl-A全选;Ctrl-C 拷贝;Ctrl-V 粘贴;Ctrl-X 剪切;Ctrl-Z撤消*作;Ctrl-Y恢复*作。
4)文件*作:
Ctrl-P 打印;Ctrl-W 关闭。
5):系统菜单
Alt-A文件;Alt-E编辑;Alt-T工具;Alt-W窗口;Alt-H帮助。
6):MS Windows保留键:
Ctrl-Esc 任务列表 ;Ctrl-F4 关闭窗口; Alt-F4 结束应用;Alt-Tab 下一应用 ;Enter 缺省按钮/确认*作 ;Esc 取消按钮/取消*作 ;Shift-F1 上下文相关帮助 。
按钮中:
可以根据系统需要而调节,以下只是常用的组合。
Alt-Y确定(是);Alt-C取消;Alt-N 否;Alt-D删除;Alt-Q退出;Alt-A添加;Alt-E编辑;Alt-B浏览;Alt-R读;Alt-W写。
这些快捷键也可以作为开发中文应用软件的标准,但亦可使用汉语拼音的开头字母。
9:安全性考虑:
在界面上通过下列方式来控制出错几率,会大大减少系统因用户人为的错误引起的破坏。开发者应当尽量周全地考虑到各种可能发生的问题,使出错的可能降至最小。如应用出现保护性错误而退出系统,这种错误最容易使用户对软件失去信心。因为这意味着用户要中断思路,并费时费力地重新登录,而且已进行的*作也会因没有存盘而全部丢失。
安全性细则:
1):最重要的是排除可能会使应用非正常中止的错误。
2):应当注意尽可能避免用户无意录入无效的数据。
3):采用相关控件限制用户输入值的种类。
4):当用户作出选择的可能性只有两个时,可以采用单选框。
5):当选择的可能再多一些时,可以采用复选框,每一种选择都是有效的,用户不可能输入任何一种无效的选择。
6):当选项特别多时,可以采用列表框,下拉式列表框。
7):在一个应用系统中,开发者应当避免用户作出未经授权或没有意义的*作。
8):对可能引起致命错误或系统出错的输入字符或动作要加限制或屏蔽。
9):对可能发生严重后果的*作要有补救措施。通过补救措施用户可以回到原来的正确状态。
10):对一些特殊符号的输入、与系统使用的符号相冲突的字符等进行判断并阻止用户输入该字符。
11):对错误*作最好支持可逆性处理,如取消系列*作。
12):在输入有效性字符之前应该阻止用户进行只有输入之后才可进行的*作。
13):对可能造成等待时间较长的*作应该提供取消功能。
14):特殊字符常有;;’”><,`‘:“[”{、\|}]+=)-(_*&&^%$#@!~,.。?/还有空格。
15):与系统采用的保留字符冲突的要加以限制。
16):在读入用户所输入的信息时,根据需要选择是否去掉前后空格。
17):有些读入数据库的字段不支持中间有空格,但用户切实需要输入中间空格,这时要在程序中加以处理。
10:多窗口的应用与系统资源:
设计良好的软件不仅要有完备的功能,而且要尽可能的占用最底限度的资源。
1): 在多窗口系统中,有些界面要求必须保持在最顶层,避免用户在打开多个窗口时,不停的切换甚至最小化其他窗口来显示该窗口。
2):在主界面载入完毕后自动卸出内存,让出所占用的WINDOWS系统资源。
3):关闭所有窗体,系统退出后要释放所占的所有系统资源 ,除非是需要后台运行的系统。
4):尽量防止对系统的独占使用。
一个自定义类,用于大规模的字符串连接,如拼接SQL语句。用流技术实现的,很好呦!!一个自定义类,用于大规模的字符串连接,如拼接SQL语句。用流技术实现的,很好呦!!
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace SuperString
{
/// <summary>
/// 创 建 者: superhood
/// 内容描述: 增强字符串类
/// </summary>
public class CSuperString
{
/// <summary>
/// 功能简述: 运算符重载
/// </summary>
/// <param name="Left">左参数</param>
/// <param name="Right">右参数</param>
/// <returns>文本类</returns>
public static CSuperString operator + (string Left,CSuperString Right)
{
byte[] btyLeft = Encoding.Default.GetBytes(Left);//返回左参数数组
byte[] btyRight = new Byte[Right.iLength];//返回右参数数组
Right.iTextLength += Left.Length;//设置右参数文本长度
Right.iLength = btyLeft.Length + btyRight.Length;//设置右参数字节长度
Right.memStrm.Position = 0;//将右参数流位置置0
Right.memStrm.Read(btyRight,0,btyRight.Length);//将右参数数据读出
Right.memStrm.Position = 0;//将右参数流位置置0
Right.memStrm.Write(btyLeft,0,btyLeft.Length);//将字符串(字节数组)写入右参数
Right.memStrm.Write(btyRight,0,btyRight.Length);//将右参数原有信息写回(加在左参数字符串后)
return Right;//返回右参数
}
/// <summary>
/// 功能简述: 运算符重载
/// </summary>
/// <param name="Left">左参数</param>
/// <param name="Right">右参数</param>
/// <returns>文本类</returns>
public static CSuperString operator + (CSuperString Left,string Right)
{
byte[] btyRight = Encoding.Default.GetBytes(Right);//将右参数(字符串)转换为字节数组
Left.memStrm.Position = Left.iLength;//设置左参数流的位置
Left.memStrm.Write(btyRight,0,btyRight.Length);//将右参数字符串写入流
Left.iTextLength += Right.Length;//设置左参数文本长度
Left.iLength += btyRight.Length;//设置左参数字节长度
return Left;//返回左参数
}
/// <summary>
/// 功能简述: 运算符重载
/// </summary>
/// <param name="Left">左参数</param>
/// <param name="Right">右参数</param>
/// <returns>文本类</returns>
public static CSuperString operator + (CSuperString Left,CSuperString Right)
{
byte[] btyRight = new Byte[Right.iLength];//声明字节数组(右参数)
Right.memStrm.Position = 0;//将右参数流位置置0
Right.memStrm.Read(btyRight,0,btyRight.Length);//将右参数(字符串)转换为字节数组
Left.memStrm.Position = 0;//将左参数流位置置0
Left.memStrm.Write(btyRight,0,btyRight.Length);//将右参数字符串写入流
Left.iTextLength += Right.iTextLength;//设置左参数文本长度
Left.iLength += Right.iLength;//设置左参数字节长度
return Left;//返回左参数
}
/// <summary>
/// 功能简述: 流中有效字节长度
/// </summary>
private int iLength = 0;
/// <summary>
/// 功能简述: 流中文本长度
/// </summary>
private int iTextLength = 0;
/// <summary>
/// 功能简述: 内存流
/// </summary>
private MemoryStream memStrm;
/// <summary>
/// 功能简述: 构造函数
/// </summary>
public CSuperString()
{
memStrm = new MemoryStream();//初始化流
}
/// <summary>
/// 功能简述: 构造函数
/// </summary>
/// <param name="DefaultLength">默认长度(以字节为单位)</param>
public CSuperString(int DefaultLength)
{
memStrm = new MemoryStream(DefaultLength);//初始化流
}
/// <summary>
/// 功能简述: 属性,字节长度
/// </summary>
public int Length
{
get
{
return iLength;
}
}
/// <summary>
/// 功能简述: 属性,文本长度
/// </summary>
public int TextLength
{
get
{
return iTextLength;
}
}
/// <summary>
/// 功能简述: 属性,流长度
/// </summary>
public int Capacity
{
get
{
return memStrm.Capacity;
}
set
{
if (value >= iLength)
memStrm.Capacity = value;
else
memStrm.Capacity = iLength;
}
}
/// <summary>
/// 功能简述: 向类中添加字符串
/// </summary>
/// <param name="Date"></param>
public void AddString (string Date)
{
byte[] btyDate = Encoding.Default.GetBytes(Date);//字符串转换为字节数组
memStrm.Position = iLength;//设置流的位置
memStrm.Write(btyDate,0,btyDate.Length);//将字符串写入流
iTextLength += Date.Length;//设置文本长度
iLength += btyDate.Length;//设置字节长度
}
/// <summary>
/// 功能简述: 返回文本
/// </summary>
/// <returns>返回字符串</returns>
public override string ToString()
{
memStrm.Position = 0;//设置流的位置
byte[] btyDate = new byte[iLength];//声明字节数组
memStrm.Read(btyDate,0,iLength);//将流内容读入数组
return Encoding.Default.GetString(btyDate);//将字节数组转换为字符串并返回
}
/// <summary>
/// 功能简述: 将字符串写入文件
/// </summary>
/// <param name="FileName">文件名</param>
public void WriteToFile(string FileName)
{
FileStream strm = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.Write);//初始化文件流
//判断流长度用来确定流中是否有冗余信息
if (memStrm.Length > iLength)
{//有
memStrm.Position = 0;//设置流的位置
byte[] btyDate = new byte[iLength];//声明字节数组
memStrm.Read(btyDate,0,iLength);//将流内容读入数组
strm.Write(btyDate,0,iLength);//将流内容写入文件
}
else
{//没有
memStrm.WriteTo(strm);//将流中文本写入文件
}
strm.Close();//关闭文件
}
/// <summary>
/// 功能简述: 将字符串写入流
/// </summary>
/// <param name="strm">流</param>
public void WriteToStream(Stream strm)
{
//判断流长度用来确定流中是否有冗余信息
if (memStrm.Length > iLength)
{//有
memStrm.Position = 0;//设置流的位置
byte[] btyDate = new byte[iLength];//声明字节数组
memStrm.Read(btyDate,0,iLength);//将流内容读入数组
strm.Write(btyDate,0,iLength);//将数组内容写入另一流
}
else
{//没有
memStrm.WriteTo(strm);//将流中文本写入另一流
}
}
/// <summary>
/// 功能简述: 清除流
/// </summary>
public void Clear()
{
iLength = 0;//将流字节长度设为0
iTextLength = 0;//将流文本长度设为0
}
}
}
掌握 C#掌握 C#
2003年1月15日
摘要:John Kennedy 将向您介绍如何使用 Visual Studio .NET 和 .NET Framework 向 Pocket PC 应用程序中添加菜单和控件,以帮助您进一步掌握 C# 技术。
应该说,从 C/C++ 发展到 C#,进而到 Microsoft .NET Framework,对于习惯使用 C/C++ 的程序员来说是一次小小的打击。换句话说,C# 编程将带来翻天覆地的变化,不仅要完成范例转换,还要完成程序模型的重建以及其他各种令人难以捉摸的词组转变。但是,随着新一年的到来,不正是学习新编程语言的好时机吗?
我现在实在是抽不出时间教您如何使用 C# 进行编程。至于您打算如何学习这种语言完全取决于您的个人习惯。例如,我相信有些人一定喜欢那种纯理论式的学习方法,手捧一本看似优秀实则枯燥乏味的教科书,书中尽是些晦涩难懂的语言示例。我并不喜欢这种方法。我喜欢通过编写应用程序,并将编译器错误消息作为指南来学习语言。如果您也喜欢这种方法,建议您选择 Mickey Williams 撰写的《Microsoft Visual C# .NET》(Microsoft Press 出版,ISBN 0-7356-1290-0)。尽管这部著作不是针对 Pocket PC 撰写的,但其中包含了优秀的 C# 语言速成课程,以及 .NET Framework 主要功能的使用方法。您会发现其中的许多内容都与 Pocket PC 有关,这将成为您学习的良好开端。学习 C# 不一定象您想象的那么困难,通过该书中的具体示例,您很快便会掌握如何将各种功能组合成应用程序。
菜单的用途当您完成 C# 编程的“Hello world”阶段后,最好再添加一些用户交互。这样您就可以快速编写条件代码,以便执行多个任务。此外,快速掌握 Pocket PC Framework 实现中提供的许多用户界面控件也是十分必要的。毕竟,用户界面是用户最常见到的。
对程序员来说,菜单也很有用。我喜欢在开发时保留一个菜单,用于启动当前正在测试的代码。可使用菜单作为调用某些程序内部工作的快捷方式。一切运行正常后,我可以删除此菜单(如果更巧妙一点,可使用条件代码使此菜单仅在“调试”模式出现)。
如果您能够访问 .NET Framework 精简版(如果无法访问,您很快便会看到下一版本的 Visual Studio® .NET),可以使用新的项目向导,创建默认的 C# 智能设备可编程 PC 应用程序来分享其中的乐趣。然后我们将添加一个菜单 - 只需使用 Visual Studio IDE 即可轻松实现。事实上,最新版本的 Visual Studio 提供了一个更新的设计器,要创建菜单,只需将菜单对象从工具箱拖放到窗体上即可。然后,只需输入要显示的文本。
图 1:添加菜单就象系鞋带一样简单。只需拖放,键入,然后单击。真是太容易了!
要输入一些实际代码,只需双击菜单项本身即可。随即进入窗体的代码视图中,其中显示了菜单选项将执行的功能。在以下示例中,我添加了一行使程序退出的代码。尽管这样做不符合应用程序的 Pocket PC 模型(该模型不退出应用程序,而是隐藏它,然后在需要时再显示),但我认为在开发时能够终止应用程序是很有用的。如果稍有不慎,则每次将新代码下载到设备(模拟设备或实际设备)时,现有代码都会妨碍新代码的运行。因此,用一种快速方法关闭正在运行的程序是非常方便的。
static void Main()
{
Application.Run(new Form1());
}
private voic menuItem2_Click(object sender, System.EventArgs e)
{
Application.Exit();
}
}
添加简单控件编写自己的应用程序时,很快就需要添加一些供用户使用的控件。控件是物理开关和按钮的软件实现。在考虑添加控件时,您会觉得我们花大量时间生成开关和按钮的虚拟表示形式,是件很有意思的事情。以单选按钮为例,它是一种外观类似小圆坑的互斥控件,此类控件以 20 世纪 70 年代的汽车收音机(上面安装了粗大的机械开关,用于选择无线电台,现在已经完全淘汰)为模型,至今仍用于软件中。
不管怎样,我介绍了太多的软件哲学(我想这是深受《Microserfs》的作者 Douglas Copeland 和《The Design of Everyday Things》的作者 Donald A. Norman 的影响,建议您也读读这两本书)。下面让我们来谈谈技术,.NET Framework 包含一个抽象的 Control 类,从中可以派生出各种 UI 控件。按钮、列表框、组合框、单选按钮、复选框等,均从此类派生。甚至窗体本身(即作为应用程序基础的窗口),也是从 Control 类派生的。
您关心这些内容吗?很可能并不关心,因为您只需再次从 UI 设计器中执行拖放操作,将所需的控件放入主窗体中即可。当然,在界面设计以外,您还需要进行一些编程工作,这就是我们下面要介绍的内容。
需要一个漂亮的窗体吗?程序很少只以一个窗口或窗体的形式出现。大多数程序会弹出对话框、状态框、消息框和其他一些供用户查看的信息显示。即使在空间有限的 Pocket PC 屏幕上,也有必要向其中添加多个信息“层”。
在应用程序中添加新窗体很简单。从 Visual Studio .NET IDE 中,选择 Project(项目),单击右键,然后选择 Add(添加)和 Add Windows Form(添加 Windows 窗体)。您将看到下面显示的窗口,然后只需选择一个提示性的名称即可。
图 2:要在项目中添加一个新窗体吗?这很简单。使用此窗体在现有 Windows 窗体中添加一个新的派生窗体。
这个新窗体将作为项目中的另一个窗体。当然,每个窗体都可以按照设计格式或代码格式查看。默认情况下,新窗体从不被实例化。启动应用程序时,实际只调用并显示默认窗体。换句话说,如果您在程序中添加了新的窗体,则可以自行决定是否打开它。如果不打开,它将只作为一种资源存在,没有人会看见它。
下面是一种打开新窗体的方法。将按钮拖到第一个窗体(默认名称为 Form1),双击该按钮,创建在用户单击它时调用的代码。现在,请添加以下代码,调用并显示新窗体:
MyNewForm mynewformForm = new MyNewForm ();
mynewformForm.ShowDialog();
我在这里使用的是 ShowDialog() 方法,但如果您要创建无模式窗口(在 Pocket PC 编程中并非最佳做法),您也可以使用 Show() 方法。无模式窗口以某种方式悬浮,在应用程序继续运行之前无需关闭该窗口。工具选项板就是一个很好的示例。但在 Pocket PC 的小屏幕上,这种窗口只会使屏幕变得混乱,而没有多大用处。
将值传递到其他窗体中的控件在实际操作(而不是那些深奥的代码示例)中,您很可能要向新打开的窗体中发送信息,然后获得一些响应信息。
假设您要求用户在文本框中输入字符串。您可能需要预先加载一个包含某些现有文本的文本框,允许用户对其进行编辑,然后检索新的文本。
让我们演示一下如何通过更改文本标签来设置控件值。事件序列如下:
创建包含控件(但不显示此控件)的窗体的新实例。 更改与控件文本标签相对应的属性。 显示窗体。 假设我们已经在新窗体中添加了 label1 文本标签,我们可以使用如下代码完成以上所有操作:
MyNewForm mynewformForm = new MyNewForm ();
mynewformForm.label1.Text = "Hello World";
mynewformForm.ShowDialog();
唯一要记住的是,默认情况下 label1 属性是私有属性,因此,主窗体中的代码将看不到它。为解决此问题,我使用 Properties(属性)对话框将其设置为 Public,结果运行良好。
图 3:新窗体创建完毕。您可以看到,我添加了一个用于关闭此窗体的按钮。
注意:窗体的大小并不重要,因为 Pocket PC 总是将其扩展到整个屏幕。如果要创建一个对话框形式的新窗体,还应该为用户提供关闭它的方法,例如一个附加了以下代码的新按钮:
private void button1_Click(object sender, System.EventArgs e)
{
this.Close();
}
除非出现错误,否则新窗体的右上角将出现一个关闭按钮,用户单击它便可关闭窗体。
想要加一些选项卡吗?我要讨论的是那些小选项卡,使用它们可以访问一个对话框中存储的多个页面。如果应用程序有许多需要用户完成的设置,这些选项卡会非常有用。
在您“大肆”使用选项卡之前,我想请您先考虑一下为什么程序会有如此多的选项。要知道 Pocket PC 可不是台式计算机,它是一种便携式电脑,我们真的需要在上面放置如此多的选项、控件和开关吗?
如果您确信需要所有这些控件(别担心,我相信您确实需要),那么使用选项卡控件可能比较合适。看到添加选项卡控件是如此简单时,我感到非常高兴,因为所有复杂工作都不需要您亲自去做。就象将一组单独的窗体合并成一个窗体一样。
以下是在程序中添加选项卡控件的步骤。您可以将新控件拖至添加的每个新选项卡中,使其便于组织和操作。
将选项卡控件拖到窗体的上方。看到了吗?我曾告诉过您这很简单。 在 Properties(属性)窗口的 TabPages 上单击,以显示 Tab 控件的各种设置。 使用 TabPage Collection Editor(选项卡集合编辑器)添加并重命名新的选项卡。每个选项卡都类似一个空白窗体,可以向其中添加控件。 将每个选项卡视为窗体,并将控件放在合适的位置。Pocket PC 将自动显示所有这些选项卡和控件。这真是再简单不过了。 图 4:TabPage Collection Editor(选项卡集合编辑器)有一个长标题和许多设置,但是使用起来十分简单。
图 5:这就是 TabPage 控件在 Pocket PC 设备上的外观。很整洁吧?现在您可以添加多个选项卡了,但愿您的用户坐在颠簸的公共汽车上使用这些选项卡时不会怨声载道。
一切尽在掌握之中希望您已经了解,在 Pocket PC 应用程序中添加一些 UI 控件其实很简单。我正在忙着建立一个数据库,其中很多是 Pocket PC 开发人员使用 C# 实现时遇到的难题,几个月之后,我将向您展示这一成果。当您遇到问题时,可随时写信给我,我将向 Microsoft 的专家组请教这些问题。总之,我们将尽量使您平稳过渡到 C#。