C_C++控制台界面编程_第1页
C_C++控制台界面编程_第2页
C_C++控制台界面编程_第3页
C_C++控制台界面编程_第4页
C_C++控制台界面编程_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、 /53C/C+控制台界面编程序资料中一部分来自互联网,作者已无法考证,另一部分来自MSDN,其余部分为本人()自己编写并重新整理、修改、增加和补充一些内容,使之更充实、完善,所有程序均在VisualStudio2005SP1中调试通过(操作系统为WindowsXPSP3),原文很多代码均有语法错误,全部作了更正,部分示例代码的功能也进行了增加,有些示例代码功能稍多,为使示例更有针对性,在保留其知识点的基础上对代码进行了精简,最后提供了自己的几个简易的程序示例,以飨读者。每一个学习C、C+的人,最先接触到的就是在控制台窗I下进行编程学习,它是一个基于文本模式的黑黑的窗口,它不涉及到复杂的人机交

2、互编程,是深入学习C、C+最直接、简单的手段。早期的开发都使用TurboC(简称TC)进行开发,在TC的库中提供了大量的用于控制台界面处理的函数,时至今口,这些涉及到C、C+标准之外的界面控制程序已经无法在在VC中编译通过了,有时候为了学习和移植早期的代码,需要将这些函数在VC中重新实现,本教程提供了这样的参考。更多的时候,用户学习编程语言最先接触的是控制台的界面,通过本教程可以深入了解界面相关的操作,对于Win32窗II界面的程序来说,基于控制台窗II的程序也有很多优点,操作简单、几乎不需要书写与界面相关的代码就能编译并生成可执行文件,这样的程序开发速度非常快,一些对于界面要求不是很高的小工

3、具用它开发,比花更多的时间去处理窗口程序的界面要划得来。从Windows2000以后,Windows操作系统中的控制台已经不再是那个古老的,只能在Windows系统划分的一块内存中模拟运行的16位程序了,现在的控制台窗II是一个与窗II程序有着相同特性的特殊窗II程序,说它特殊是它只能显示字符,而且是命令行的,但它几乎支持窗II程序的所有功能,比如多线程、网络通信、以及其它的Windows程序开发用的技术等,除了涉及到界面的东西以外,它可以完成你想要的所有功能,当然Windows的API也可以完全由它来调用。在众多C+开发工具中,由于Microsoft本身的独特优势,选用VisualC+已越来

4、越被众多学习者所接受。显然,现今如果还再把TC作为开发坏境的话,不仅没有必要,而且也不利于向Windows应用程序开发的过渡。然而,VisualC+的C+专用库却没有TC所支持的文本屏幕(控制台窗II)控制函数(相应的头文件是conio.h)o这必然给C+学习者在文本界面设计和编程上带来诸多不便。要知道,文本界面设计是一种深入学习C+、掌握交互系统的实现方法的最简单的一种手段,它不像C+的Windows图形界面应用程序,涉及知识过多。为此,本系列文章讨论在VisualStudi。开发环境中,如何编写具有美观清晰的控制台窗口界面的C+应用程序,并且只介绍输入、输出和界面相关的东西,即只涉及控制台

5、的人机交互方面,其它方面本文档并不涉及。当然,控制台的窗II也有自己的缺点,它与窗II界面的程序没有可比性。教程中所有的示例全部可以用C和C+来实现,教程中的示例为便于学习,尽量采用的是面向过程的C语言的结构,部分示例还同时C+的实现,关于这两种语言的使用,教程中不作过多讲解,这里假设读者已经具备了熟练的C、C+语言功底。对于只学习过C语言的读者,也不影响从本教程中获取想要的知识,但最后面的几个示例和小程序,有的用C+实现的,可能会给您带来不便,见谅,文中如有错误和不足之处,希望各位读者批评、指正。目录TOC o 1-5 h z HYPERLINK l bookmark0C/C+控制台界面编程

6、1 HYPERLINK l bookmark2目录2 HYPERLINK l bookmark4第一部分控制台界面编程预备知识3 HYPERLINK l bookmark6VisualStudio2005中控制台程序的类型3 HYPERLINK l bookmark8简要复习C/C+语言中控制台字符输入、输出3制表符t4回退字符b6ASCII码表8以开头的格式控制符11数据流的格式设置12 HYPERLINK l bookmark10怎样从控制台复制粘贴文字13 HYPERLINK l bookmark12将批处理bat转换为exe程序13 HYPERLINK l bookmark14在Vis

7、ualStudio2005中设置控制台程序的图标13 HYPERLINK l bookmark16重定向控制台程序的输出14 HYPERLINK l bookmark20第二部分控制台界面编程详解15概述15 HYPERLINK l bookmark22控制台文本窗I编程的一般控制步骤16 HYPERLINK l bookmark24控制台窗口操作函数16 HYPERLINK l bookmark26文本属性操作20 HYPERLINK l bookmark32文本输出22 HYPERLINK l bookmark36文本操作示例23 HYPERLINK l bookmark42滚动和移动28

8、 HYPERLINK l bookmark48光标操作30 HYPERLINK l bookmark54读取键盘信息31 HYPERLINK l bookmark78读取鼠标信息38 HYPERLINK l bookmark80结束语40 HYPERLINK l bookmark82第三部分附录41分数等级划分工具41controlio.h文件41Main.c文件44 HYPERLINK l bookmark92简易俄罗斯方块46代码Main.c文件47 HYPERLINK l bookmark120模拟实现可用鼠标、键盘控制的菜单和窗I51第一部分控制台界面编程预备知识1)VisualStu

9、dio2005中控制台程序的类型在VS2005中控制台可以支持MFC、ATL,这些内容在本教程中用不到,不用支持,所以学习本教程的时候使用空的工程就行了读者在练习的时候,使用空的工程类型即可,如果向导生成了main()主函数,那么代码可能如下:(读者最好能知道怎样通过它创建一个工程,并且知道怎样设置这个工程的字符编码方式,在VisualC+6.0默认的字符集为多字节的,VS2005中默认为人字符集,为考虑移植,代码人多数使用通用字符集来实现。)intargcf_TCHAR*argv)return0;为便于读者理解,作以下解释:C、C+中main主函数可能接收字符数组作为参数,由于VS2005支

10、持不同的字符集,所以C+标准中对所有字符处理的函数都提供了两个版本,一个为普通的接收多字节型的版本,即char型,另一个为接收大字符集的版本,一般要普通版本的函数前有前缀w”,且对名称作了细微的更改,如果需要这方面的信息可以在MSDN中查询,微软对字符处理的所有函数除了提供标准中的两个版本,至少还提供了一个通用版,可同时用于两种字符集(一般由_t”开头,且利用编译器的DEBUG宏来实现的,且不属于标准中的要求,对移植性有要求时甚用),使用大字符集编码越来越重要,读者应在学习C+的时候就应该适当接触这些内容,本教程中使用通用的字符处理函数,但会在必要的时候把对应的其它两个版本的函数注释出来。如果

11、读者不习惯于这种编程方式,请自己更改调用的字符处理函数,并设置VisualStudio2005的工程属性为使用多字节字符集上面代码中的_TCHAR是一个宏(常简写为TCHAR),当字符集为多字节时为char,当为人字符集时为wchar_t,类似的解释以后不再作解释,读者自行查阅MSDN即可。2)简要复习C/C+语言中控制台字符输入、输出C语言中的输出使用printf()实现,使用它,需要包含stdio.h头文件,而C+则除了使用兼容C的这种格式,还可以使用iostream输入输出流来实现。使用控制台输出,对于字符格式有精确的要求,所以学C语言的读者务必要牢牢掌握printf()中的格式控制符,

12、学习C+的则需要掌握流的成员函数和输出流的格式控制符,并包含iostream头文件并引入命名空间std(或所用到的成员)。学习C语言的读者,还应该掌握C语言中的其它输入、输出函数(如putchar,getchar;getch,puts,gets等),学习C+中的读者则还需要掌握字符串流以及缓冲区的刷新等操作(如endl,flush等),以便更好的掌握人机交互行为。(注意输入、输出流的控制符在头文件iomanip中,使用之前需要包含)。除此之外,还需要重点掌握C、C+中的转义字符,特别是b,n,t,八进制数或十六进制数。以上这些知识在一般的C、C+书籍中均有详细介绍,这里不再赘述,如果掌握不扎实

13、,是不可能随心所欲的操作控制台的输入输出的,但更多的时候是学会举一反三,迁移运用,下面就转义字符中的b和t进行一些详细讲解,很多人对于这两个字符根本就没有理解透彻。a)制表符t默认的控制台共可以显示80*25个文字,每一行共80个字符,共25列,除去最后一行可能因为切换中文输入法需要,至少可以有24行文字空间可以操作(注:在控制台程序中,切换输入只能用Ctrl4-空格来实现,如果对于界面要求非常严格,不允许出现滚动条和任何一丁点破坏界面的操作,那么请记住把最后一行空间留给操作系统的输入法吧,否则你完全无法释怀心里的痛)当然控制台是可以使用一些手段来使它的界面显示文字行数增大的,最多增加到多少行

14、,受计算机屏幕大小决定(后面内容会讲解)每两个制表符在控制台窗I中占据8个字符的宽度。这样,一个标准的控制台窗I】就会被分成10*25块单元,每一个单元对应一个制表位,而t的作用是从当前光标所在的位置跳到所在行最近的一个制表位开始的地方,因此,使用t所跳过的字符宽度并不是固定的,而是介于0“8个字符之间,这主要是看下一个制表位距离当前光标有多远,制表位用于多行文字在列上对齐是非常方便的,但其完美的程序取决于程序书写者对它的控制。典型的例子是输出9*9乘法表:1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=15

15、5*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*?=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81请按任意键继续#includestdafx.h”irrt_tmain(irrtargcr_TCHAR*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)_tprin(_T(%d*d=3dt)#

16、iFj,i*j);_tprintf(MnH);_tsystem(_T(pause11);return0;以上是通用字符集下的代码(即可用于两种字符集版本的代码)如果是多字节字符集可以如下书写:#inc丄udestdafx.h”#include/多了一个头文件包含irrtmain(in七argcfchar*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)printf(,%d*%d=%dt/izjzi*j);prin七f(n”);system(pause);/注总需要包會头文件stdlib.h或cstdiib(C+1!1)return0;如果是大字符集下可以这样写

17、:#include“stdafxh”irrtmain(in七argc,wchar_t*argv)for(in七i=丄;i=9;+i)for(in七j=1;j=i;+j)wprintf(LM%d*,%d=%dt,fizj,i*j);wprintf(Lnn,f);_wsystem(LHpause,f);return0;说明:#includeHstdafx.h11是用向导生成的代码,它相当于包含了两个头文件(其实还有一些其它的东西):#include#include代码中的L表示将字符或字符串转换成人字符集编码,如果不使用表示为多字节编码,使用表示根据当前工程属性的需要,要么与L的含义一样,要么相当

18、于不使用,即为通用版本,也可以写成_TEXT,它只是一个宏,在使用的时候,需要将要处理的字符串用扌舌号括起来,但L在使用时则可以不用括号。printf用于多字节字符集环境中,wprintf用于大字符集环境中,.tprintf则可以根据工程属性自动选择表示printf还是wprintf,即为通用函数,其它的函数也一样,还有三个字符串的数据类型也是一样的含义,即char,wchar_t,TCHAR,其中TCHAR为通用版本。system在头文件stdlib.h头文件中,其它两个版本则不用包含这个头文件,这个函数的功能是执行系统命令的,它能使用的系统命令在不同的电脑中不相同,如果需要查看,可以在命令

19、行窗II中输入help即可,但只列举系统提供的,这里给出两个,一个是system(pause)用于暂停执行,并显示一行文字“按任意皱键继续”,另一个是system(“cis”)用于清除窗口中的文字,其实只要是在系统目录system32卞的可执行文件都可用这个命令执行,所以用户也可以将自己需要的程序(为保证兼容性,最好是命令行的程序)拷到对应的目录中,即可利用system执行。代码中:system(pausef/);相当于c语言的:printf(、按任总键继续n);getch();或者是C+的:cout“按任总键继续”endl;/不需要ngetch();说明:VS2005中getch0相当于函数

20、.getch0代码中使用了制表符对齐,当然也可以不用制表符,那样的话,用户只能通过计算每一个表达式的文字长度,并用空格填充不够的地方,才能对齐,代码量会很人,逻辑也会变得复杂,可见合理使用制表符及转义字符可以为输出带来方便。程序中使用的是C语言的代码,典型的C+代码如下(只提供通用版的代码):int_tmain(intargcrTCHAR*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)cou七iv_T(”i)j_T(”=”)i*j_T(”t”)flush;cotrtendl;system(MpauseM);return0;输出代码中的flash是刷新缓冲区的

21、,但不向缓冲区插入任何字符,endl是在缓冲区中插入一个回车符,并刷新(注意n并不等同于endl,n是字符,可以用在任何能用字符的地方,表示换行符,而endl不是个字符,只用于流输出中,表示向流中插入一个n字符并刷新缓冲区)。这只是顺便提及一卞,如果不明白,可以复习C+基础,个人觉得学习C+的读者非常有必要精深的掌握C语言,这方面个人觉得CPrimer(蓝色的封面)很精典,另谭浩强的C语言程序设计是轻量级的C语言经典教程,C+学习开始以复习C为基础,推荐C+PrimerPlus(蓝色封面)这本书讲法讲解很完善,对C+有全面细致的学习后,可以从头到尾精细研究C+Primer(红色封面)这本书是学

22、习C+的经典之作,但初学者看起来非常吃力。b)回退字符bb可以让当前光标向后回退一个字符,下一次输出的时候,就会从当前位置输出,如果回退到的地方有文字,那么将会被覆盖(屏幕上会覆盖,如呆是在打印机上输出则前后两次输出会重叠在一起),这个字符有着非常重要的作用,在教程的后面会讲述到一个API函数,可以让光标跳转到任意位置,也可以完成b的功能,此处暂不作讲述。b典型的用途是控制输入,控制台的输入一般不受用户掌控,很容易因为输入过多的字符而导致界面被破坏,当对界面格式要求很严格的时候,不能使用普通的输入函数,除了使用系统检测键盘按键的API以外,C、C+都可以使用getch0函数,这个函数与getc

23、harO作用一样,接收一个字符,但getchO不回显到屏幕上,而且不使用缓冲区缓存多余字符,保证了用户按下任意一个按键就一定结束这个函数的调用,但getchar0则需要到按了回车或强制刷新缓冲区才行。所以利用这个函数结合b就能完成很多功能,比如删除一个字符等。这里为了更好的说明这个问题,给用户提供了一个小程序,用于输入很多个学生的成绩,最后对成绩进行分数等级划分,这个程序使用了其它的一些界面编程技术,这里不对其讲解,用户只需要阅读控制输入数值的代码,并结合界面进行观察就能理解了,具体代码见附录中的源代码分数划分工具,这里仅摘抄输入一个0-100之间的分数的代码,用到了b而且可以使用Backsp

24、ace来删除输入错误的数字。代码如下:/在控制台程序下输入一个整数/tag=l有下划线,无下划线/return-丄表示取消输入/return-2,-3表示参数不正确/return-5表示进行统计/return-4表示运行出错/n表示待输入数据的最大位数/附:这是早期初学时写的代码格式.结构均很糟糕,用户根据I勺己的经验进行改写,特别/是返回值,使用枚举更合理;错误处理使用断言更合理,程序结构应再进行模块化,使逻辑/更清楚;变虽名命名毫无意义;代码风格和格式比较杂乱等。此处不再进行旧代码的更改,n/接贴在文档中,只求能说清楚问题即可。/如果移植到VS2005中请注意代码的字符集为多字节,读者也可

25、以将其改写为大字符集,即通/用字符集intGetlnteger(intnrinttag)intkn=0rs=0fi;charc;if(n=10)ptin七f(”n无法输入规定的数据!n“);return-2;if(1(tag=l|tag=0)printf(rrn函数参数不合法!nrr);return-3;if(tag=l)for(i=0;in;i+)prin七f;for(i=0;i=0&s0)if(tag=0)printfCbb);/这里用到了belseprintfCb_b);/这里用到了bif(kn=0)kn=0;elsekn-;s=s/10;if(c=*0&knn)prin七fs=s*10

26、+c-,0f;kn+;while(1);printf(,rnfS序出现未知错课!nf);return-4;c)ASCII码表为方便编程时查阅一些常用的字符,这里附上一张ASCII码表。BinDecHex缩写/字符解释000NUL(null)空字符111SOH(startofheadling)标题开始1022STX(startoftext)正文开始1133ETX(endoftext)正文结束10044EOT(endoftransmission)传输结束10155ENQ(enquiry)请求11066ACK(acknowledge)收到通知11177BEL(bell)响铃100088BS(back

27、space)退格100199HT(horizontaltab)水平制表符1010100ALF(NLlinefeed,newline)换行键101111OBVT(verticaltab)垂直制表符110012OCFF(NPformfeed,newpage)换页键1101130DCR(carriagereturn)回车键1110140ESO(shiftout)不用切换111115OFSI(shiftin)启用切换100001610DLE(datalinkescape)数据链路转义100011711DC1(devicecontrol1)设备控制1100101812DC2(devicecontrol2

28、)设备控制2100111913DC3(devicecontrol3)设备控制3101002014DC4(devicecontrol4)设备控制4101012115NAK(negativeacknowledge)拒绝接收101102216SYN(synchronousidle)同步空闲101112317ETB(endoftrans,block)传输块结束110002418CAN(cancel)取消110012519EM(endofmedium)介质中断11010261ASUB(substitute)替补11011271BESC(escape)溢出11100281CFS(fileseparator

29、)文件分割符11101291DGS(groupseparator)分组符11110301ERS(recordseparator)记录分离符11111311FUS(unitseparator)单元分隔符1000003220(space)空格1000013321!1000103422II1000113523#1001003624$1001013725%1001103826&100111392711010004028(1010014129)101010422A*101011432B+101100442C1101101452D-101110462E-101111472F/110000483001100

30、01493111100105032211001151333110100523441101015335511011054366110111553771110005638811100157399111010583A111011593B1111100603C111111633F?1000000644010000016541A10000106642B10000116743C10001006844D10001016945E10001107046F10001117147G10010007248H1001001734911001010744AJ1001011754BK1001100764CL10011017

31、74DM1001110784EN /531001111794F010100008050P10100018151Q10100108252R10100118353S10101008454T10101018555U10101108656V10101118757W10110008858X10110018959Y1011010905AZ1011011915B1011100925C1011101935D1011110945EA1011111955F11000009660%11000019761a11000109862b11000119963c110010010064d110010110165e110011

32、010266f110011110367g110100010468h110100110569i11010101066Aj11010111076Bk11011001086CI11011011096Dm11011101106En11011111116F0111000011270P111000111371q111001011472r111001111573s111010011674t111010111775u111011011876V111011111977w111100012078X111100112179y /5311110101227Az11110111237B11111001247CI1111

33、1011257D11111101267E11111111277FDEL(delete)删除d)以%开头的格式控制符C语言中控制台的输出最常用的是printfO,这个函数有两种用法,一种用法是直接输出字符串,如:printf(Teststring);另一种用法是使用格式控制符,如:printf(nTestNUM:%dnTeststring:%sn,10zSTRING输出最小宽度:用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。精度:精度格式符以开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数:如果输出的是字符

34、,则表示输出字符的个数:若实际位数人于所定义的精度数,则截去超过的部分。长度:长度格式符为h两种,h表示按短整型量输出,I表示按长整型量输出。示例:#includevoidmain();第二种用法中第一个参数为一个字符串,以其以开头后接特定含义的字符(一般为一个,少数情况下会有多个)表示格式说明,这是C语言中的内容,读者可参考相应书籍,格式控制符既可用于输出也可用于输入,输入时使用scanf()函数,在此不再细讲,仅列举常见的格式说明符。类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示:格式字符意义d以十进制形式输出带符号整数(正数不输出符号)0以八进制形式输出无符号整数(不输出

35、前缀0)x,X以十六进制形式输出无符号整数(不输出前缀Ox)u以十进制形式输出无符号整数f以小数形式输出单、双精度实数e,E以指数形式输出单、双精度实数&G以%f%e中较短的输出宽度输出单、双精度实数c输出单个字符s输出字符串标志:标志字符为-、+、#、空格四种,其意义下表所示:标志意义-结果左对齐,右边填空格+输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号#对c,s,d,u类无影响:对o类,在输出时加前缀0:对x类,在输出时加前缀Ox;对ef类当结果有小数时才给出小数点inta=floatb=doublec=chard=15;丄231234567;12345678丄2345G

36、7;*pf;prin七=prin七f(”b=prin七f(”c=prin七f(”d=%5dz%or%xnn,a,ara);%lf,54J.f,gen”,b,bzb,b);84丄fn”,c,czc);%8cnH/dzd);数据流的格式设置C+也可以兼容并使用C语言中的控制符进行输出,但更好的方法是使用C+的数据流进行输出,主要使用的是cin和cout,读者可参考标准C+的语法书籍,这里仅列举一些对流格式进行控制的方法和函数:控制符作用dec设置整数为十进制hex设置整数为八进制oct设置整数为十六进制setbase(n)设置整数为n进制(”8,10,16)setfill(n)设置字符填充,c可以

37、是字符常或字符变量setprecision(n)设置浮点数的效数字为setw(n)设置字段宽度为n位setiosflags(ios:fixed)设置浮点数以固定的小数位数显示setiosflags(ios:scientific)设置浮点数以科学计数法表示setiosflags(ios:left)输出左对齐setiosflags(ios:right)输出右对齐setiosflags(ios:skipws)忽略前导空格setiosflags(ios:uppercase)在以科学计数法输出E与十六进制输出X以大写输出,否则小写setiosflags(ios:showpos)输出正数时显示“+“号re

38、setiosflags()终止已经设置的输出格式状态,在括号中应指定内容【注】如果使用到以上控制符,除了包禽iostream头外,还要包禽iomanip头文件并引入std命名空间。示例:#includeiostream#includeiomanip/输入输出流控制符需包含iomanip头文件usingnamespacestd;voidmain()/dec:返回数值的十进制,oct:返回数值的八进制,hex:返回数值的十六进制cout12345G的十进制:”dec123456”,八进制为:”oct123456”,十六进制为:”hex123456endl;coutdec;/恢复为十进制格式/set

39、fill(c):设世字符填充,c可以是字符常或字符变虽,只对当前语句生效/setw(n):设置字段宽度为n位,如果n小于所要返回的字符宽度则保留字符原样输出,且只对当前语句生效/setiosflags(ios:left):左寸齐,setiosflags(ios:righ七):右对齐coutsetfill(*f)setw(10)setiosflags(ios:left)123456endl;coutresetiosflags(ios:left);/终止已设置的输入输出流格式,木例去掉左对齐方式doubled=丄2345678901234567;coutdendl;/耒设置椿度之前默认格式输出椿度

40、为位小数coutsetprecision(16)dendl;/设置浮点数的緖度,n为有效数字,采用四则五入法舍位,setprecision(n)中,n小于等于有效coutdendl;/之前使用Tsetprecision(),此函数保留前面的宽度设置。coutresetiosflags(ios:fixed);/setiosflags(ios:fixed):取消的小数位数“勺设買,恢复默认设置/setiosflags(ios:scietific):用科学计数法表示,为指定小数位分为四位,且第四位四舍五入/setiosflags(ios:uppercase):在以科学计数法输出E与十六进制输出X以大

41、写输出,否则小写coutsetiosflags(ios:scientific)setiosflags(ios:uppercase)setprecision(4)dendl;怎样从控制台复制粘贴文字本教程除了讲解界面相关的编程以外,还对一些控制台用的重要操作进行说明,以便读者能更好的在控制台界面下工作。要复制粘贴命令行窗11中的文字,可以点击鼠标右键,选择标记,并用鼠标拖动标记一片区域并点击右键即可完成复制操作。粘贴则点击鼠标右键选择粘贴即可。将批处理bat转换为exe程序前面讲解过system,这个函数除了执行命令行功能和system32下的程序以外,最重要的一个作用是可以利用它来把批处理文件

42、中的命令逐一的转换为system()的调用,并编译生成可执行文件,这样的兼容性是最好的,而且还能加入其它的一些程序功能,显著增强程序的功能,网络上也有很多将批处理转换为EXE的工具,但一般都存在兼容性问题,且难以更改或扩展生成文件的功能。在VisualStudio2005中设置控制台程序的图标Windows卜的程序一般都有一个程序的图标,控制台也可以抛弃原始的应用程序默认图标,让自己的程序编译后有个性化的程序图标,具体操作如下:在VS2005中打开“资源视图窗I”(ResourceView)导入添加一个ic。的图标文件(图标可以利用VS自带的图标工具来新建,也可以利用专业的IconWorksh

43、op等工具来制作,但VS自带的图标工具仅支持256色,表现力太差,关于ic。图标的一些制作常识可以慢慢摸索,本教程不作过多讲解),查看属性窗Ih保证图标的ID标识在所有图标中是最小的,这样编译器会把最小标识的那个图标当作应用程序的图标。默认情况卞VC+6.0并没有生成文件,也就不会出现在资源视图窗II中,这时只需创建.rc资源文件即可看到,VS2005中用向导则生成这个文件,如果生成的时候选择的是空的工程,也可以采用相同方法添加。6)重定向控制台程序的输出对于控制台的应用程序,可以从命令提示符中输入所在路径及文件名来启动,默认情况下,控制台程序启动后,输出设备为显示器,如果重定向输出为文件,程

44、序执行期间的所有输出将输出到文件,不会在屏幕上显示任何字符,就算需要用户输入一些字符以继续执行的程序也不会有任何显示。重定向输出在Windows系统中使用主要用在两个方面,一是没有源代码的命令行程序只提供输出到屏幕的功能,没有保存结果到文件的功能,如果需要把计算的结果输出到文件,则可利用输出重定向实现,这样不用对程序进行任何更改即可将原本输出到屏幕的计算结果输出到文件;二是控制台程序在开发的时候,只是显示在屏幕上,但由于开的程序时就只把它作为一个小工具,临时用一下,就没有必要为它提供输入到文件的功能,这样可以不用写这些功能代码,更用不到去测试它,从而减少许多的开发测试时间,所以这个时候也可以借

45、助重写向技术来让程序间接的支持输出到文件的功能。重定向的使用方法为:在命令行中输入命令后,再输入一个空格,后接两个人于号,并跟上一个文件名,这样即可实现,如在命令提示符窗口中输入命令并按回车:pausec:test,txt即可在C:test.txt中看到输出的文件中有程序执行的内容,这里的路径也可以使用相对路径,相对路径的起始节点在命令行中所需执行的程序所在的目录。一味的使用重定向功能可能是个麻烦,如果命令行程序的用户交互过程较多,那么,所有的输入、输出都只能摸黑操作,非常不便,所以,如有可能在程序中提供将输出结果保存到文件的功能,会更方便一些。 /53第二部分控制台界面编程详解文本界面的控制

46、台应用程序开发是深入学习C+、掌握交互系统的实现方法的最简单的一种手段。然而,VisualC+的C+专用库却没有TC所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗II操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗II界面的编程控制方法。在众多C+开发工具中,由于Microsoft本身的独特优势,选用VisualC+已越来越被众多学习者所接受。显然,现今如果还再把TC作为开发环境的话,不仅没有必要,而且也不利于向Windows应用程序开发的过渡。然而,VisualC+的C+专用库却没有TC所支持的文本屏幕(控制台窗II)控制函数(相应的头文件

47、是conio.h)。这必然给C+学习者在文本界面设计和编程上带来诸多不便。要知道,文本界面设计是一种深入学习C+、掌握交互系统的实现方法的最简单的一种手段,它不像C+的Windows图形界面应用程序,涉及知识过多。为此,本系列文章来讨论在VisualC+开发坏境中,如何编写具有美观清晰的控制台窗II界面的C+应用程序。1)概述所谓控制台应用程序,就是指那些需要与传统DOS操作系统保持某种程序的兼容,同时又不需要为用户提供完善界面的程序。简单地讲,就是指在Windows坏境下运行的DOS程序。一旦C+控制台应用程序在Windows9x/NT/2000操作系统中运行后,就会弹出一个窗II。例如新建

48、一个空的工程,添加一个cpp源程序文件,在文档窗门中输入下列代码,并编译执行(在VS2005中此处设置为多字节字符集):#includeusingnamespacestd;voidmain()cout,rHello,Console1endl;程序运行后,弹出下图的窗II。注意:有很多初学C、C+的读者,喜欢使用快捷键,我个人比较喜欢将VS2005的键盘快捷键设置为VC6的,这里也以VC6的快捷键作说明。使用F5是运行程序,这个程序运行后马上就结束了,用户来不及查看窗II输出,如果要看到窗II输出有两个办法,一是使用CE+F5,二是在main()函数结束的人括号之前添加条语句:systme(“p

49、ause),并用F5执行,使用F5与生成的应用程序的方式一样,所以推荐后一种方法,两种方法执行的操作是不太一样的,读者自己查看相应的快捷键对应的功能即可知晓,此处不再赘述。图片中的窗口就是控制台窗口,与传统的DOS屏幕窗口相比最主要的区别有:(1)默认的控制台窗II有系统菜单和标题,它是一个内存缓冲区窗II,缓冲区大小取决于Windows操作系统的分配;而DOS屏幕是一种物理窗I丨,不具有Windows窗II特性,其人小取决于ROMBIOS分配的内存空间。(2)控制台窗II的文本操作是调用低层的Win32API,而DOS屏幕的文本操作是通过调用BIOS的26(10h)中断而实现的。(3)默认的

50、控制台窗II可以接收键盘和鼠标的输入信息,设备驱动由Windows管理,而DOS屏幕窗II接收鼠标时需要调用33h中断,且鼠标设备驱动程序由自己安装。2)控制台文本窗口编程的一般控制步骤除了使用第一部分介绍的控制台界面控制的相关方法以外,用得最多的是调用系统的控制台API来对其进行操作,要调用这些API,需要提供控制台窗II的句柄(句柄用于Windows程序中标识窗II等资源对的,关于它的详细概念读者自行了解,对于这些编程知识,不再本教程的讲解范闱之内,在此仅提及一卞),才能利用这个句柄对它进行各种操作,控制台窗口界面的一般编程控制步骤如下:第一步:调用GetStdHandle获取当前的标准输

51、入(STDIN)和标准输出(STDOUT)设备句柄。函数原型为:HANDLEGetStdHandle(DWORDnStdHandle);其中,nStdHandle可以是STDNPUT_HANDLE(标准输入设备句柄)、STD_OUTPUT_HANDLE(标准输出设备句柄)和STD_ERROR_HANDLE(标准错误句柄)。需要说明的是,句柄是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗II等)和设备等对彖。虽然可以把句柄理解为是一个指针变量类型,但它不是对彖所在的地址指针,而是作为Windows系统内部表的索引值来使用的。第二步:调用相关文本界面控制的API函

52、数。这些函数可分为三类。一是用于控制台窗II操作的函数(包括窗II的缓冲区大小、窗II前景字符和背景颜色、窗II标题、人小和位置等);二是用于控制台输入输出的函数(包括字符属性操作函数);其他的函数并为最后一类。第三步:调用CloseHandle()来关闭输入输出句柄。注意,这些函数都是Windows的API函数,所以在使用之前还必须包含头文件Windows.ho在使用系统所提供的API过程中还需要了解和认识一些Windows.h中定义的数据结构,用到的时候会逐一讲解。还需要说明的是,虽然在C+中,iostream.h定义了cin和cout的标准输入和输出流对彖,以及一些精细控制输入、输出的标

53、记,在C中提供了格式控制符,但它们只能实现基本的输入输出操作,最多能控制文字的位置、数目,对于控制台窗II文字界面颜色和其它非文字性质的控制却无能为力,而且C+中的流操作不能与stdio.h和conio.h友好相处,因为iostream.h和它们是C+两套不同的输入输出操作方式,使用时要特别注意,不要在代码中混用操作相同的对彖,或者在一个工程中只用一种方案。3)控制台窗口操作函数用于控制台窗口操作的常用API函数如下:GetConsoleScreenBufferInfo获取控制台窗II信息GetConsoleTitle获取控制台窗II标题ScrollConsoleScreenBuffer在缓冲

54、区中移动数据块SetConsoleScreenBufferSize更改指定缓冲区大小SetConsoleTitle设置控制台窗II标题SetConsoleWindov/Info设置控制台窗II信息(包括窗口大小、位置等)完整的VS2005中能用的控制台函数列举如卞(绝人多数在VC6中也能用),以便读者查阅使用,还有一部分这里的常用函数没有列举出来的,后面用到也会进行讲解,读者如有不懂的地方,可自己查阅MSDN,这里需要提醒的一点是有些函数在VS2005中可以原型和参数类型发生了一些微小的变化,在VC6中可以需要适当更改才能正常使用,对于掌握了C+语法的读者会很轻松就能完成:Function(函

55、数Description(描述)AddConsoleAliasDefinesaconsolealiasforthespecifiedexecutable.AllocConsoleAllocatesanewconsoleforthecallingprocessAttachConsoleAttachesthecallingprocesstotheconsoleofthespecifiedprocess.CreateConsoleScreenBufferCreatesaconsolescreenbufferFillConsoleOutputAttributeSetsthetextandbackgro

56、undcolorattributesforaspecHiednumberofcharactercellsFillConsoleOutputCharacterWritesacharactertotheconsolescreenbufferaspecifiednumberoftimes.FlushConsolelnputBufferFlushestheconsoleinputbuffer.FreeConsoleDetachesthecallingprocessfromitsconsoleGenerateConsoleCtrlEventSendsaspecifiedsignaltoaconsolep

57、rocessgroupthatsharestheconsoleassociatedwiththecallingprocess.GetConsoleAliasRetrievesthespecifiedaliasforthespecifiedexecutableGetConsoleAliasesRetrievesalldefinedconsolealiasesforthespecifiedexecutableGetConsoleAliasesLengthReturnsthesize,inbytes,ofthebufferneededtostorealloftheconsolealiasesfort

58、hespecifiedexecutableGetConsoleAliasExesRetrievesthenamesofallexecutableswithconsolealiasesdefinedGetConsoleAliasExesLengthReturnsthesize,inbytes,ofthebufferneededtostorethenamesofallexecutablesthathaveconsolealiasesdefinedGetConsoleCPRetrievestheinputcodepageusedbytheconsoleassociatedwiththecalling

59、processGetConsoleCursorlnfoRetrievesinformationaboutthesizeandvisibilityofthecursorforthespecifiedconsolescreenbuffer.GetConsoleDisplayModeRetrievesthedisplaymodeofthecurrentconsoleGetConsoleFontSizeRetrievesthesizeofthefontusedbythespecifiedconsolescreenbufferGetConsoleModeRetrievesthecurrentinputm

60、odeofaconsolesinputbufferorthecurrentoutputmodeofaconsolescreenbuffer.GetConsoleOutputCPRetrievestheoutputcodepageusedbytheconsoleassociatedwiththecallingprocessGetConsoleProcessListRetrievesalistoftheprocessesattachedtothecurrentconsoleGetConsoleScreenBufferlnfoRetrievesinformationaboutthespecified

温馨提示

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

评论

0/150

提交评论