Windows高级输出教程
  • 板块灌水区
  • 楼主HenryLin11
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/6/28 17:03
  • 上次更新2024/6/28 18:51:19
查看原帖
Windows高级输出教程
987047
HenryLin11楼主2024/6/28 17:03

所有定义的函数和变量都很重要,以后做作品时会用到。
文中的"color"并不是拼写错误,在电脑中,"colour"就是这么写的。
printf和cout都可以用。
建议大家不要关同步流什么的,可能会出错。
看在我辛辛苦苦写教程的份上,求个小小的关注不算过分吧……

| +关注 |

头文件

在文件的开头,加上:

#include<bits/stdc++.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define _CRT_SECURE_NO_WARNINGS

这几行代码很重要,所有的输出都依靠这几行。
有#define的那一行是为了防止跳警告。
建议大家加上using namespace std。

元素

其实界面就是这样,记住一些构成界面的以元素,组合到一起就可以了。
所以,可以把这个教程加入收藏夹(求个小小的关注不算过分吧),以便记住。

控制台输出句柄

既然是输出教程,肯定是输出的句柄嘛(废话)

HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);

这是标准输出句柄,即输出到控制台。以后很多时候都会用到的。
它相当于指向控制台的指针,后面讲到的函数修改输出信息,都需要句柄。
记住就行了。(Tips:以后有函数让你填的变量是HANDLE类型的话,就填它)

控制台信息

CONSOLE_SCREEN_BUFFER_INFO cinfo;

它包含有关控制台屏幕缓冲区的信息,如屏幕大小、是否显示光标(但我们好像用得不多) 高宽的获取方式:

int HEIGHT = info.srWindow.Bottom;
int WIDTH = info.srWindow.Right;

是否显示光标的方式可以看后面。

颜色

颜色分为前景颜色和背景颜色。
前景颜色:

#define FOREGROUND_BLUE 			0x0001
#define FOREGROUND_GREEN			0x0002
#define FOREGROUND_RED				0x0004
#define FOREGROUND_INTENSITY			0x0008

背景颜色:

#define BACKGROUND_BLUE 			0x0010
#define BACKGROUND_GREEN			0x0020
#define BACKGROUND_RED				0x0040
#define BACKGROUND_INTENSITY			0x0080

其中,INTENSITY表示“高亮”,指将颜色亮度提高。
不难发现,前景颜色和背景颜色是差不多的,只是FOREGROUND和BACKGROUND不同,在这里提醒大家,不要搞混了。
如果要混色,可以使用“按位或”(即|)将颜色混起来。
混色如下: 0 NULL(空即为黑色)
1 BLUE(蓝色)
2 GREEN(绿色)
3 GREEN|BLUE(浅绿色)
4 RED(红色)
5 RED|BLUE(紫色)
6 RED|GREEN(黄色)
7 RED|GREEN|BLUE(白色,我们的CMD使用的前景色就是这个白色,别跟后面的“亮白色”搞混了)
8 (蒟蒻还没找到)\texttt{\color{grey}(蒟蒻还没找到)}(灰色)
9 BLUE|INTENSITY(淡蓝色)
A GREEN|INTENSITY(淡绿色)
B GREEN|BLUE|INTENSITY(淡浅绿色)
C RED|INTENSITY(淡红色)
D RED|BLUE|INTENSITY(淡紫色)
E RED|GREEN|INTENSITY(淡黄色)
F RED|GREEN|BLUE|INTENSITY(亮白色)
使用时记得在每个颜色前(包括INTENSITY)加上FOREGROUND_或BACKGROUND_。前景色和背景色可以混在一起
颜色前面的数字是使用color命令时的参数,后面会讲。

位置

COORD pos;

COORD是一种自带结构体,表示一个字符在控制台屏幕上的坐标。
他有两个元素,分别是X和Y。不用我多说了吧。

函数

GetStdHandle

获得标准输出的句柄。
前面说过了,不多讲了。

SetConsoleCursorPosition

用来设置光标在控制台上的位置。与之前讲的HANDLE和COORD配合使用。

WINAPI BOOL SetConsoleCursorPosition (HANDLE, COORD);

第一个参数填之前定义的hout,第二个参数填一个COORD结构,表示要移动到的位置。

将它打包成一个新函数:

void gotoxy(int x,int y){
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(hout,pos);
	return;
}

(可以在最前面加上inline)

SetConsoleTextAttribute

用于设置输出颜色。与之前讲的HANDLE和“颜色”搭配使用。

WINAPI BOOL SetConsoleTextAttribute (HANDLE, WORD);

其中,第一个参数填之前定义的hout,第二个参数填颜色,混色方法之前讲过,前景色和背景色可以混在一起。

将它打包成一个新函数: void set_color(int color){ SetConsoleTextAttribute(HOUT, color); return; } (可以在最前面加上inline)
毫无区别,是吧?但是名字更短了,对吧?

GetConsoleScreenBufferInfo

用于获取控制台信息,包括窗口长宽等。我们一般只用长宽。
跟之前讲的的HANDLE和CONSOLE_SCREEN_BUFFER_INFO搭配使用。

WINAPI BOOL GetConsoleScreenBufferInfo (HANDLE, PCONSOLE_SCREEN_BUFFER_INFO);

其中,第一个参数填之前定义的hout,第二个参数填之前讲的CONSOLE_SCREEN_BUFFER_INFO&(记得加上&,表示引用)。
它会将信息存到你给的CONSOLE_SCREEN_BUFFER_INFO里。
长宽的获取方法之前讲过,不多说了。

GetConsoleCursorInfo和SetConsoleCursorInfo

GetConsoleCursorInfo会获取屏幕上光标的信息,获取成功返回true,失败返回false。
SetConsoleCursorInfo会设置屏幕上光标的信息。
把它们打包成一个是否显示光标的函数——show_cursor。 这个函数很有用,比如说我以前发过一个贪吃蛇的帖子(现在已经删了),里面如果不隐藏光标,那么就会显得很丑,老有一个光标 闪来闪去。
循环反复使用show_cursor会导致程序崩溃(是那种间隔很短的,如果两个show_cursor之间还有一个有效循环那么就不会崩溃,不过我还是建议大家还是不要多次反复使用)。
不需要了解太多细节,自己看代码吧:
(记得BOOL要大写)

void show_cursor(BOOL hide){
	CONSOLE_CURSOR_INFO cciCursor;
	if (GetConsoleCursorInfo(HOUT, &cciCursor))	//获得光标信息
	{
		cciCursor.bVisible = hide;				//隐藏光标
		SetConsoleCursorInfo(HOUT, &cciCursor);	//重新设置光标
	}
}

(可以在前面加上inline)

system

相当于在CMD中输入命令。用法较为复杂,但我们只用两个,"cls"和"color"。
使用方法:

system("cls");
system("color ××");

cls是用于清空屏幕的,但是颜色保持color设置的命令。

color用于设置颜色。 颜色属性由两个十六进制数字指定,
第一个对应于背景,第二个对应于前景。
每个数字可以为以下任何值: 0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 浅绿色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色 当设置颜色时,color会先将屏幕上所有文字(包括空格)全部变成你指定的颜色,然后将输出颜色也设为你指定的颜色。 要获取更多详细信息,可以在CMD里输入color /?。

keybd_event

用法复杂,不讲太多。就讲一下强制全屏的代码吧:

void FullScreen(){
	keybd_event(VK_MENU,0x38,0,0);
	keybd_event(VK_RETURN,0x1c,0,0);
	keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP,0);
	keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);
}

(可以在前面加上inline)
这里我将它打包成一个函数FullScreen。要用时直接用就可以了。

_getch

_getch()跟getchar用法差不多,但不会把输入的字符显示在屏幕上。
没啥好说的。

_kbhit

_kbhit()告诉你在你没有让用户输入时,用户是否有输入,返回bool值。换个方式讲,就是用户有没有按下键盘。按下的按键会存入缓冲区中,可以用cin,scanf,_getch等读取。

Sleep

Sleep()有一个参数,即等待的毫秒数,注意是unsigned,所以给负数会溢出。功能是等待你指定的毫秒数。

组合

发挥时间到了!把你刚学到的组合起来吧,自由发挥。

(过了一会儿)

呃……我还是讲讲示例吧。

#include<bits/stdc++.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define frame_width 60
#define frame_height 25
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
void set_color(int color){
	SetConsoleTextAttribute(hout, color);
	return;
}
void gotoxy(int x,int y){
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(hout,pos);
	return;
}
void show_info(){
	system("cls");
	set_color(FOREGROUND_RED|FOREGROUND_GREEN);
	for (int i = 0; i<frame_height; i++)
	{
		gotoxy(i, 0);
		printf("#");
		gotoxy(i, frame_width);//因为这个标记是长度,从零开始所以最后要减1
		printf("#");
	}
	for (int i = 0; i<frame_width; i++)
	{
		gotoxy(0, i);
		printf("#");
		gotoxy(frame_height, i);
		printf("#");
	}
	set_color(FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN);
	gotoxy(12,21);
	printf("Welcome to the homepage of this Konjac");
}
int main(){
	show_info();
	return 0;
}

效果如下。
效果
定义如前。自己看吧。


求关注

看在我辛辛苦苦写教程的份上, | 关注我吧! |

2024/6/28 17:03
加载中...