C++编码规范.doc_第1页
C++编码规范.doc_第2页
C++编码规范.doc_第3页
C++编码规范.doc_第4页
C++编码规范.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编程规范说明(c/c+ 版)编程规范的说明An Introduction to CCoding Conventions沈阳航空航天大学 军工行业信息与安全应用实验室2013年3月 - 40 -为了提高软件开发质量,降低开发周期,增强代码的可重用性和易读性,使软件便于维护,开发人员间便于交流和协作,特总结出开发规范,以为参考。一 说明1.1 为什么要有编码规范编码规范对于程序员而言尤为重要,有以下几个原因:u 一个软件的生命周期中,80%的花费在于维护。u 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。u 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码。u 如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品。为了执行规范,每个软件开发人员必须一致遵守编码规范。每个人!1.2总体要求开发的系统具有较强的通用性、申缩性,并有较强的响音速度。同时开发过程中必须严格按照规范,以便于管理和协同开发。通用性:能适应机构变动。伸缩性:程序模块化,程序模块能进行任何组合。规范性:截面统一,原程序和SQL文件便于他人阅读。1.3版权说明本书的大部分内容取材于上海贝尔林锐博士的高质量C+/C编程指南,现整理汇编成为沈阳航空工业学院计算机学院网络信息安全实验室的内部编程规范,也可作为培训教材。二 命名规范命名应尽量使用匈牙利命名法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。变量名或函数名中使用大写字符来区分各个部分,以便于记忆和阅读。如bPatchMinute,DeleteDirInfo()。全局(包括类中的)变量用长名字,局部变量用短名字。匈牙利记法。即:前缀 + 类型 + 变量名1)格式:m_|s_|g_ type class name|struct name variable name2)解释:m_ : 类的成员变量ms_:类的静态成员变量s_ :静态全局变量g_ :普通全局变量21变量【规则2-1-1】 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。【规则2-1-2】 标识符的长度应当符合“min-length & max-information”原则。单字符的名字如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。局部变量应尽量易懂简洁,使用常见的变量,如Num, nCount, i, j ,k, n, len, pos,offset, nReadNum, index, nRet, ret,string, filename临时变量,如ltmp, ftmp, tmpStr, tempStr。【规则2-1-3】 命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。【规则2-1-4】 程序中不要出现仅靠大小写区分的相似的标识符。例如:int x, X;/ 变量x 与 X 容易混淆void foo(int x);/ 函数foo 与FOO容易混淆void FOO(float x);【规则2-1-5】 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。【规则2-1-6】 如果命名使用缩写,则应该使用通用缩写表(见附录)【规则2-1-7】变量的名字应当使用“名词”或者“形容词名词”或者“名词动词”。例如:float value;float oldValue;node objFind;【规则2-1-8】变量和参数用小写字母开头的单词组合而成。例如:BOOL bFlag;int iDrawMode;【规则2-1-9】常量全用大写的字母,用下划线分割单词。例如:const int MAX = 100;const int MAX_LENGTH = 100;【规则2-1-10】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。【建议2-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。22 宏、结构体【规则2-2-1】 宏命名、枚举名、联合名和typedef定义类型应详细,避免重复,一律为大写。例如:#defineDEL_EMPTY(a)if(a)deletea;a=NULL;#defineSUCCESS0#defineFAIL-1【规则2-2-2】 自定义消息从WM_USER开始。#defineMYAPP_MESSAGEWM_USER+0x1001【规则2-2-3】 结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数据区,必须注明其所属的进程。全局数据定义只需注意其用途。例如:typedef struct char chProductName20; char chAuthor20; unsigned long ulMaxTables; unsigned long ulUsedTables;_DBS_DATABASE;_DBS_DATABASE GdataBase;23枚举、联合、类【规则2-3-1】 枚举名加小写前缀enum,联合名加小写前缀uni。例如:typedef enum_KFILE_OPEN_MODE enumOPEN_READONLY = 0, enumOPEN_READWRITE = 1, enumCREATE_ALWAY = 3 KFILE_OPEN_MODE;typedef union _VARIANTchar unichVal;int uninVal;long unilVal;float uniftVal; VARIANT; 【规则2-3-2】 类名必须以大写C开头,代表class。后面字母反映具体含义,以清晰表达类的用途和功能为原则。接口必须以大写I开头,代表 Interface 。当名称由多个单词构成时,每一个单词的第一个字母必须大写。【规则2-3-3】以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如: Class CIndicator 【规则2-3-4】当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾。 Class CColorSetException Class CCauseExceptionAttribute 【规则2-3-5】当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾。 Class CScreenClass Class CSystemClass 【规则2-3-6】当类只用于作为其他类的基类,根据情况,以Base结尾。 Class CIndicatorBase 【规则2-3-7】如果定义的类是一个窗体,那么名字的后面必须加后缀Frm,如果是Web窗体,必须加后缀Page。Class CInheritsFrm /* Windows窗体 */Class CInheritsPage /* Web窗体 */【规则2-3-8】类力求封装好,严格区分public,private,protect等作用域,如果一个函数与本类有莫大的关系,可以作为该类的静态成员函数,不用或少用友元函数等破坏类封装性的方法和技巧。如果一些结构或宏仅与本类有关,可在类头文件中定义。24 函数【规则2-4-1】全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。例如:DrawBox();/ 全局函数box-Draw();/ 类的成员函数【规则2-4-2】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:intiMinValue;intiMaxValue;intSetValue();intGetValue();【规则2-4-2】函数命名应该见名知意。如CalcAllDataStyle(), ReadDocDataFromTime(), GetIndexInfo() 等。常见的函数:Init, OpenAll,, Create_, Get_, Set_, Read_, Load_, Write_, Start_, Stop_, Check_, Test_, Fill_, Process_, Sort_, Do_, Select_, Is_, Exist_, _Ex。【规则2-4-3】函数名第一个字母必须大写,全局函数必须以小写前缀g开头,函数名最长不得超过30个字符。【规则2-4-4】函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 如是内部函数,只要注释其定义文件名。三程序版式版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然,看得兴致勃勃。差的程序“书法”如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。31空行空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。【规则3-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。参见示例3-1(a)【规则3-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例3-1(b )/ 空行void Function1() / 空行void Function2() / 空行void Function3() / 空行while (condition)statement1;/ 空行if (condition) statement2;elsestatement3;/ 空行statement4; 示例3-1(a) 函数之间的空行 示例3-1(b) 函数内部的空行32 代码行【规则3-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。【规则3-2-2】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加。这样可以防止书写失误。int width;/ 宽度int height;/ 高度int depth;/ 深度int width, height, depth; / 宽度高度深度x = a + b;y = c + d;z = e + f;X a + b; y = c + d; z = e + f;if (width height) dosomething();if (width =”、“=”、“+”、“*”、“%”、“&”、“|”、“”这类操作符前后不加空格。【规则3-3-7】类型强制转换时,()前后不得有空格。例:可写做:(KSFile*)pFile;也可写做:(KSFile *)pFile不得写做:( KSFile* )pFile( KSFile * ) pFile【建议3-3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i10; i+)和if (a=b) & (c= 2000) / 良好的风格if(year=2000) / 不良的风格if (a=b) & (c=b&c=d) / 不良的风格for (i=0; i10; i+) / 良好的风格for(i=0;i10;i+) / 不良的风格for (i = 0; I 10; i +) / 过多的空格x = a b ? a : b; / 良好的风格x=aFunction(); / 不要写成 b - Function();示例3-3 代码行内的空格34对齐【规则3-4-1】程序的分界符和应独占一行并且位于同一列,同时与引用它们的语句左对齐。【规则3-4-2】 之内的代码块在右边数格处左对齐。嵌套的代码块 每进一套,缩进一个tab,TAB 为4个空格。void Function(int x) / program codevoid Function(int x) / program codeif (condition) / program codeelse / program codeif (condition) / program codeelse / program codefor (initialization; condition; update) / program codefor (initialization; condition; update) / program codeWhile (condition) / program codewhile (condition) / program code如果出现嵌套的,则使用缩进对齐,如: 示例3-4(a) 风格良好的对齐 示例3-4(b) 风格不良的对齐35长行拆分【规则3-5-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。【规则3-5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_longer_variable5 = very_longer_variable16) dosomething();virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix);for (very_longer_initialization; very_longer_condition; very_longer_update)dosomething();示例3-5 长行的拆分36修饰符的位置修饰符 * 和 应该靠近数据类型还是该靠近变量名,是个有争议的活题。若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针。上述写法的弊端是容易引起误解,例如:int* x, y; 此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。【规则3-6-1】应当将修饰符 * 和 紧靠变量名例如:char *name;int *x, y;/ 此处y不会被误解为指针37注释C语言的注释符为“/*/”。C+语言中,程序块的注释常采用“/*/”,行注释一般采用“/”。原则上注释要求使用中文,注释通常用于:(1)版本、版权声明;(2)函数接口说明;(3)重要的代码行或段落提示。虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例3-6。【规则3-7-1】注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。注释的花样要少。【规则3-7-2】如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。例如 i+; / i 加 1,多余的注释【规则3-7-3】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。【规则3-7-4】注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。【规则3-7-5】尽量避免在注释中使用缩写,特别是不常用缩写。【规则3-7-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。【规则3-7-8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读/* 函数介绍:* 输入参数:* 输出参数:* 返回值 :*/void Function(float x, float y, float z) if () while () / end of while / end of if示例3-6 程序的注释38类的版式类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字public、protected和private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么东西都往里扔。类的版式主要有两种方式:(1)将private类型的数据写在前面,而将public类型的函数写在后面,如示例3-7(a)。采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。(2)将public类型的函数写在前面,而将private类型的数据写在后面,如示例3-7(b)采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。【建议3-8-1】采用“以行为为中心”的书写方式。class A private:int i, j;float x, y; public:void Func1(void);void Func2(void);class A public:void Func1(void);void Func2(void); private:int i, j;float x, y; 示例3-7 (a) 以数据为中心版式 示例3-7 (b) 以行为为中心的版式【规则3-8-1】 类的成员变量在构造函数或初始化函数中应赋初值,指针在构造函数中赋NULL,析构时DEL_EMPTY它,以免内存泄露。【规则3-8-2】如果一个函数与本类有莫大的关系,可以作为该类的静态成员函数,不用或少用友元函数等破坏类封装性的方法和技巧。【建议3-8-2】如果一些结构或宏仅与本类有关,可在类头文件中定义。39函数的版式【规则3-9-1】 一个用于设置输入参数的例程应以单词set作为前缀。例如: void SetUserName(void);【规则3-9-2】 一个用来接收某个值的例程应以单词get作为前缀。例如: String GetUserName(AnsiString ATempString)【建议3-9-1】 相同类型的形参应合并在一个语句中。例如:void Foo(int Param1, Param2, Param3; String Param4);【规则3-9-3】 所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础,参数名称应以字符a为前缀。例如: void SomeProc(String aUserName ; int aUserAge);“a”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。【规则3-9-4】 形式参数按照下列顺序排序: 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。 输入参数列表应放在输出参数列表的左边。 将通用的参数放在特殊参数的左边,例如: void SomeProc(aPlanet, aContinent, aCountry, aState, aCity) 排序有可能有些例外,比如事件的处理。类型为CObject的Sender参数经常放在第一位。【规则3-9-5】 在类的成员函数内调用非成员函数时,在非成员函数名前必须加上“:”。【规则3-9-6】 函数入口参数有缺省值时,应注释说明。【规则3-9-7】 除非极其简单,否则对函数应有注释说明。内容包括:功能、入口/出口参数,必要时还可有备注或补充说明。【建议3-9-2】 当一个参数为记录型、数组类型、字符串类型或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。【建议3-9-3】 例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。310结构异常处理异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个try.finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的initializition/finalization或一个对象的constructor/destructor中进行资源的分配和释放。【规则3-10-1】 任何情形下,每一次的分配都应跟随一个try.finally。/ Delphi 示例SomeClass1 := TsomeClass.Create; SomeClass2 ;= TsomeClass.Create; try do some code finally SomeClass1.Free; SomeClass2.Free;end;SomeClass1 := TSomeClass.Create; try SomeClass2 := TsomeClass.Create; try do some code finally SomeClass2.Free; end; finally SomeClass1.Free; end;示例3-8 (a)可能造成错误 示例3-8 (b)更安全的分配过程 【建议3-10-1】 只有当在异常被触发而你想执行一些任务时才使用try.catch 。【建议3-10-2】 建议使用Trace类来把诊断信息输出到日志文件中。 程序员可以在任何希望跟踪的函数中定义一个Trace(使用统一的格式)对象,Trace类可以分别在函数的入口和出口写一条信息。Trace对象将增加附加的系统开销,但是它有助于程序员在不使用调试器的情况下找出错误。四 文件结构每个C/C+程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。C/C+程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C+程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。41版权和版本的声明版权和版本的声明位于头文件和定义文件的开头,主要内容有:(1)版权信息。(2)文件名称,标识符,摘要。(3)当前版本号,作者/修改者,完成日期。(4)版本历史信息。/ * * Copyright (c) 2006,沈阳航空工业学院计算机学院网络信息安全实验室* * All rights reserved.* * 当前版本:1.1* * 文件名称:filename.h* * 作 者:输入作者(或修改者)名字* * 创建日期:2003年2月4日* * * * 摘 要:简短说明文件功能、用途 (Comment)。* * * * 修改纪录:(modification history)* * 15sep2003,by nfs,added defines MAX_FOOS and MIN_FATS* * 15feb2002,by dnw,added routines fooGet() and fooPut();* * added check for invalid index in fooFind().* * 4feb2002,by dnw,written.*/示例4-1 版权和版本的声明42头文件的结构头文件由三部分内容组成:(1)头文件开头处的版权和版本声明(参见示例4-1)。(2)预处理块。(3)函数和类结构声明等。假设头文件名称为 graphics.h,头文件的结构参见示例4-2。【规则 4-2-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。【规则4-2-2】用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。【规则4-2-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。【规则 4-2-4】若文件用于定义和实现类,文件名与类名保持一致。【建议 4-2-1】头文件中只存放“声明”而不存放“定义”。【建议 4-2-2】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。/ 版权和版本声明见示例4-1,此处省略。#ifndefGRAPHICS_H/ 防止graphics.h被重复引用#defineGRAPHICS_H#include / 引用标准库的头文件#include “myheader.h” / 引用非标准库的头文件void Function1();/ 全局函数声明class Box / 类结构声明;#endif示例4-2 C+/C头文件的结构【规则 4-2-5】头文件中的声明推荐使用如下的顺序:对其他头文件的包含宏定义类型定义函数原型定义【规则4-2-】函数原型定义中的参数一律使用STDC的风格,即如下面的形式:extern void bootParamsShow(char *paramString);头文件中的函数原型不需要写注释,一般函数原型声明应该在一行内完成。43定义文件的结构定义文件有三部分内容:(1)定义文件开头处的版权和版本声明(参见示例4-1)。(2)对一些头文件的引用。(3)程序的实现体(包括数据和代码)。假设定义文件的名称为 graphics.cpp,定义文件的结构参见示例4-3。/ 版权和版本声明见示例1-1,此处省略。#include “graphics.h”/ 引用头文件/ 全局函数的实现体void Function1()/ 类成员函数的实现体void Box:Draw()示例4-3 C+/C定义文件的结构44 C语言文件定义规范1General Module Documentation对整个模块目的和功能的完整描述注释2Includes:包含的头文件说明3Typedefs:类型定义4Globals:全局变量定义只有那些可以在本模块外访问的变量才定义为全局变量5Locals:局部变量定义使用static关键字那些只希望在本模块内访问的变量定义为局部变量6Forward Declarations声明将在本模块内使用,而且在本模块中实现的函数/ 版权和版本声明见示例4-1,此处省略。/* includes */#include vxWorks.h#include fooLib.h/* defines */#define MAX_FOOS 112 /* max # of foo entries */#define MIN_FATS 2 /* min # of FAT copies */* typedefs */typedef struct fooMsg /* FOO_MSG */VOIDFUNCPTR func; /* pointer to function to invoke */int arg FOO_MAX_ARGS; /* args for function */ FOO_MSG;/* globals */char * pGlobalFoo; /* global foo table */* locals */LOCAL int numFoosLost; /* count of foos lost */* forward declarations */LOCAL int fooMat (list * aList, int fooBar, BOOL doFoo);FOO_MSG fooNext (void);STATUS fooPut (FOO_MSG inPar);示例4-4 c语言文件模式五 文件的组织形式(1) 一个工程往往包含很多文件(*.h,*.cpp,*.lib,资源文件等),向工程中加入文件或删除文件一定要慎重,避免把工程损坏。工程中不起作用的文件或类应删除,工程目录下的非工程文件也应该移走,以保持工程的清洁,便于工程的管理。如果工程文件很多,则应将文件归类(按模块或实现功能分类)存放。(2) 将独立性比较强的模块抽出来,做成DLL,控件或COM组件,该模块可单独编写和测试,也增强了其可重用性。(3) 一个比较大的工程应留有一定的消息接口或插件接口等。(4) 工程的版本控制要严格,版本格式为xx.xx.xx,必要时使用Build次数或日期。高版本尽量兼容低版本的用法、数据或协议。(5) 工程的编译宏定义和工程参数设置应正确,每作一个新工程时应检查工程参数是否正确。(6) 建议字节对齐方式为1字节对齐。(7) 工程文件应经常备份,备份时注明备份日期和主要增加的功能。(8) 文件名基于工程名,应能够区别不同的功能,不区分大小写,长度不多于30个字符。51 目录结构(1) 如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。(2) 例如可将头文件保存于include目录,将定义文件保存于source目录(可以是多级目录)。(3) 如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。六 界面设计规范户界面分为四大类型:对话框、单文档界面、多文档界面、其它界面。(1) 对话框要易用且简洁,字体和控件的组织搭配要得体,能简单不复杂,各控件的焦点、Tab顺序等要讲究,视应用场合要适当支持键盘。在简洁易用的前提下,力求个性化,设计得更加友好。程序各对话框的风格要保持一致。(2) 单文档和多文档界面的程序功能可以做得很强,也便于扩充和管理。其中菜单、工具栏、状态栏等设计要有特色。菜单按一定的分类弹出,必要时设计成多套菜单,在重要的窗口或区域应能弹出右键,实现常见操作。工具栏上放最常用的操作按钮,必要时动态更换按钮。状态栏显示足够多的有用信息。(3) 消息主控在Mainframe中,单文档的主控也可在View中,所有的对话框的弹出或非模态对话框的控制都在主控窗口中完成,具体的数据处理放在单独的文件中或设计成类。在App类中实现Ini读写,各数据对象的定义和析构,全局变量的赋值和初始计算,存盘退出等。各视图的OnDraw和GDI画图尽量使用内存位图的方式,以免闪烁。6.1 windows 窗体原则:仿WINDOW的标准界面窗口上控件放置用户界面中常用的元素(Item)包括各种控制(如PushButton DheckBox等) 、数据(如ListItem) 、文本。一个界面中各个元素的大小(宽与高)和摆放应做到使整个界面整齐美观,保证不影响数据的显示和输入的前提下,应遵循以下原则:(1) 在一个界面中,所有同类型的元素(如两个按钮或两个单行编辑框)应具有相同的高度,使用相同的显示字体;(2) 同一行上的元素,在不影响显示和输入时,尽量具有相同的宽度;(3) 同一列上的元素,排列时应向左对齐;(4) 同一行上的元素,排列时应向下对齐;(5) 当一个界面中的元素较多时,可以使用一条或多条横线或竖线将界面划分为几个相对独立的部分。(6) 整个界面中各元素的排列要均衡,疏密适当,同一行或同一列上的各个元素间的间隔要保持一致。对象取名各OBJECT必须要有容易理解的名字统一NAME如下COMMANDBUTTON:(Cb_表示控件的缩写)_Ok确定(&Y)_Cancel取消(&C)_Apply应用(&A)_Return返回(&R)_Print打印(&P)_Gen 生成(&G)_Query 查询(&Q)_Sort 排序(&S)_Add 新增(&A)_Insert 插入(&I)_Del 删除(&D)_Next 下一条(&N)_Prior 前一条(&P)按钮窗口中按钮分为两类:一为按钮触发的动作会影响到整个窗口的内容,如“确定”、“退出”等。这种按钮应尽量排在窗口的右侧或下侧。另一类按钮触发的动作会只会影响到窗口中某个数据域或某个显示域,这种按钮应尽量排在其受影响域的右侧或下侧。对于一个窗口的按钮,可以设置其中一个为缺省(Default)按钮。基于Windows系统的操作员可以按下“回车”或“空格”键触发缺省按钮、设置缺省按钮可以简化操作员的操作。缺省按钮可以在界面设计时指定,同时也可以在程序运行过程中动态设置。通常“确定”,“应用”设置为缺省,“取消”设置为Cancel。数据输入区(Data Entry Area)数据输入区指的是在界面中操作员输入各种数据的区域,输入区中数据排列序按从上到下、从左到右的顺序排列。对于需要一次输入多个不同项目的输入区,应将所有数据域全部排在输入区中,同时显示,不得使用滚动条。对于需要一次输入多条相同项目的输入区,可以使用垂直滚动条,但应为输入区设置足够高度,使得在大多数情况下不必使用滚动条,即可录入全部数据。在数据输入区中不得使用水平滚动条。6.2 Menu 菜单(1) 菜单必须有ToolBar(2) 菜单的热键和快捷键必须与Window98标准相同。6.3其他存盘、关闭、退出等动作的检查和确认当操作员在窗口中输入数据后选择“存盘”操作时,系统检查各种数据是否完整、合法,如果数据有误、系统给予

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论