每个控制台都有一个包含输入事件记录队列的输入缓冲区当控制台的窗口获得键盘焦点时,控制台会将每个输入事件(例如单次击键、鼠标移动或鼠标按钮单击)设置为它放置在控制台输入缓冲区中的输入记录这种描述虽然严谨,但是牵涉到了鼠标时间、键盘事件、缓冲区的数据结构等等,会让我们的学习曲线在开始的时候就会变得陡峭,基本上就变成了从入门到放弃在前期是不需要深入学习的,后期会在我的实战课中逐渐学习到的窗口的显示区域指的是当前控制台窗口的外观大小,屏幕缓冲区指的是当前控制台窗口的数据存储的容量的大小,我们先来讲解下窗口显示区域如何设置大小设置窗口可见区域的大小控制台窗口尺寸的设置,有很多种方法,本文先介绍两种最简单移动的方法一个是通过DOS命令mode来进行设置,另一个是通过windows的控制台函数来进行设置我们先介绍第一种DOS命令中有一个mode命令,mode是“模式”的意思,可以设置控制台的模式,也可以设置打印机的模式,等等控制台在DOS命令一般称为“con”,是console的简写设置控制台的窗口大小,实际上就是设置它在屏幕上的显示区域,有多少行多少列可见比如说我们设置了展示出20行,但是如果我们输入和输出的内容超过了20行,那么除非移动滚动条,否则是看不到的举个例子:我们打开了一个控制台窗口,如果屏幕输入和显示的内容超过了屏幕的显示区域,就会自动出现滚动条,如下图所示:我们输入了一个dir命令,显示的内容的行数已经超过了窗口显示区域的行数,所以可见区域以外的部分,就需要通过滚动条上下滚动来显示被遮蔽的内容,无论如何滚动,控制台窗口的可见区域大小都不会被改变的可见区域的行数和列数就是窗口的尺寸通过刚才介绍的mode命令,就可以进行设置命令如下:mode con lines = 40 cols = 20
mode con 是设置console(控制台)的mode(模式)的意思lines 是行,col是colum的简写,后面加s是因为复数下面是一段演示如何通过程序来利用mode命令设置控制台窗口尺寸的代码:#include <stdio.h>#include <stdlib.h>int main() { int lines = 20,cols = 30; char console_size[50]; sprintf(console_size,"mode con lines=%d cols=%d",lines,cols); system(console_size); printf("input lines: "); scanf("%d",&lines); printf("input cols: "); scanf("%d",&cols); sprintf(console_size,"mode con lines=%d cols=%d",lines,cols); system(console_size); printf("new lines = %d\nnew cols = %d\n",lines,cols); system("pause"); return 0;}
程序启动时的默认控制台窗口尺寸为20行30列,可以随时改变窗口尺寸注意,lines=30,和cols=20,中间不能有空格,否则命令不起作用之所以用sprintf函数,是为了能灵活接收变量的值程序刚开始运行窗口尺寸如下:输入行数15,列数30保持不变,窗口尺寸效果如下:除了通过system函数执行DOS命令的方式以外,我们一般更常用的办法,是通过windows提供的控制台函数来设置控制台窗口尺寸函数原型如下:BOOL SetConsoleWindowInfo( HANDLE hConsoleOutput, BOOL bAbsolute, const SMALL_RECT lpConsoleWindow);typedef struct _SMALL_RECT {SHORT Left;SHORT Top;SHORT Right;SHORT Bottom;} SMALL_RECT;
第一个是要用到的控制台函数的原型定义,第二个是函数最后一个参数要用到的结构体类型的定义我们来详细解释下这两者SetConsoleWindowInfo,见名知义,设置控制台窗口信息,这个函数的作用局势用来设置控制台的显示区域的尺寸大小的(和之前的DOS命令一样,不是设置屏幕缓冲区大小,都只是设置控制台窗口显示区域的大小,屏幕缓冲区大小后文会介绍)函数执行成功,会返回TRUE,失败返回FALSE第一个参数需要传入某个控制台的句柄值 ,句柄的用法我们在之前的系列文章里已经介绍过了,这里不再赘述,一般都是通过GetStdHandle函数获取到当前控制台窗口的句柄值,然后传入即可第二个参数是状态开关,如果FALSE,则我们传入的窗口尺寸是相对值,如果是TRUE,则传入的窗口尺寸是绝对值相对值是指相对于当前控制台窗口尺寸的偏移量绝对值,是指重新指定一组新的窗口尺寸,下面的演示代码就是使用的是绝对值用法最后一个参数,是一个SMALL_RECT结构体如果状态开关是TRUE的话,这个结构体存放的是新的窗口的尺寸大小因为后面控制台系列文章中,要经常用到下面就详细介绍下RECT是rectangle的简称,矩形的含义每一个窗体都是一个矩形的结构船体一般有4个顶点共同构成一块矩形区域,但是如果指定了左上顶点和右下顶点的位置,那么这个矩形实际上也就被唯一确定了左上顶点一般由x坐标和y坐标组成之前文章已经说过,整个屏幕的坐标轴,包括GUI图形的坐标轴,都是把左上顶点作为原点,往下是y轴,往右是x轴因此我们控制台窗口也是这样左上角是坐标轴原点,y轴一般称为Top(top),x轴一般称为Left(left)因为是原点,所以Top和Left一般默认为:Top = 0,left= 0以此类推,右下角坐标的x轴我们一般称为Right(right),y轴称为Bottom(bottom)实际上bottom就是行数,right就是列数(每一行的可见字符个数)small是指这个矩形的4个成员变量的数据类型都是short类型small表示小,shaort表示短整型我们假设控制台的显示区域(可见区域)是15行40列(每行可见40个字符),给出演示代码如下:#include <windows.h>int main() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT newWindowSize = {0, 0, 39, 14}; // 设置新的窗口尺寸,宽度为40字符,高度为15行 SetConsoleWindowInfo(hConsole, TRUE, &newWindowSize); system("pause"); return 0;}
首先通过GetStdHandle获取标准设备的句柄,参数指定了要获取句柄的标准设备的类型是什么,本例是控制台,STD_OUTPUT_HANDLE,指的就是控制台对象的句柄然后定义一个区域的大小,作为新的控制台窗口的尺寸从0开始,直到39,一共右40个字符,从0到14,一共15行状态标志一定要是TRUE,表示是通过绝对值来设置新的窗口尺寸程序运行效果如图所示:总 结本文主要讲解了控制台窗口的大小不仅仅是屏幕上看见的“显示区域”(可见区域),还包括窗口输入输出的数据的存储大小并且通过代码详细演示了如何设置控制台窗口的显示区域(可见区域)的尺寸,并且给出了2个实现的方法,特别提醒的是,这2个方法只是讲解了控制台显示区域的大小设置,他们的屏幕缓冲区的大小都是操作系统设置的默认值下一篇将详细讲解控制台屏幕缓冲区的设置(ScreenBufferSize),包括获取当前控制台窗口的默认缓冲区的大小,以及如何设置成新的大小等实际操作段誉,24年2月12日(年初三),写于合肥(图片来源网络,侵删)
写在前面在上一篇文章中,详细的介绍了通过格式字符串对文字进行各种设置(原文链接:轻松玩转windows控制台( 三):魔改文字和玩转光标),比如给文字加上下划线、高亮显示文字等等,又着重介绍了如何灵活控制当前光标的位置,可以定位在控制台屏幕的任意位置,可以前进、后退、上下左右四个方向任意移动等的功能为后期的控制台游戏开发提供了一些准备知识,突破了我们对控制台一成不变黑窗口的印象,原来随着我们技能的提升,控制台是可以被我们随心所欲玩转的控制台就像一个盲盒,每次调试控制台程序时,它的大小和位置都是未知的,今天,我们就来学习一下,如何设置控制台窗口的大小控制台窗口的2个大小我们通常所说的控制台窗口的大小,其实指的是控制台程序的显示面积占据整个屏幕的区域,我们把这个大小,称为控制台的“显示区域”,或可见区域、可视区域都可以如图:我的桌面是黑色的,和控制台的背景很相似,但是仔细看,还是能看到边框痕迹的红框内的控制台窗口的大小,称为控制台的“显示区域”(可见区域)控制台窗口内输入输出数据,以及鼠标、键盘等设备的响应事件、以及操作的历史记录等等,都被存储在控制台的“屏幕缓冲区”(Screen Buffer),屏幕缓存区也是有大小的,这个大小指的是能存储的数据的多少这样说实际上是不准确的,但是为了降低学习的复杂度,这样处理是最合适的,否则按下面的讲法:
0 评论