所有定义的函数和变量都很重要,以后做作品时会用到。
文中的"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 (蒟蒻还没找到)(灰色)
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。不用我多说了吧。
获得标准输出的句柄。
前面说过了,不多讲了。
用来设置光标在控制台上的位置。与之前讲的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)
用于设置输出颜色。与之前讲的HANDLE和“颜色”搭配使用。
WINAPI BOOL SetConsoleTextAttribute (HANDLE, WORD);
其中,第一个参数填之前定义的hout,第二个参数填颜色,混色方法之前讲过,前景色和背景色可以混在一起。
将它打包成一个新函数:
void set_color(int color){
SetConsoleTextAttribute(HOUT, color);
return;
}
(可以在最前面加上inline)
毫无区别,是吧?但是名字更短了,对吧?
用于获取控制台信息,包括窗口长宽等。我们一般只用长宽。
跟之前讲的的HANDLE和CONSOLE_SCREEN_BUFFER_INFO搭配使用。
WINAPI BOOL GetConsoleScreenBufferInfo (HANDLE, PCONSOLE_SCREEN_BUFFER_INFO);
其中,第一个参数填之前定义的hout,第二个参数填之前讲的CONSOLE_SCREEN_BUFFER_INFO&(记得加上&,表示引用)。
它会将信息存到你给的CONSOLE_SCREEN_BUFFER_INFO里。
长宽的获取方法之前讲过,不多说了。
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)
相当于在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 /?。
用法复杂,不讲太多。就讲一下强制全屏的代码吧:
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()跟getchar用法差不多,但不会把输入的字符显示在屏幕上。
没啥好说的。
_kbhit()告诉你在你没有让用户输入时,用户是否有输入,返回bool值。换个方式讲,就是用户有没有按下键盘。按下的按键会存入缓冲区中,可以用cin,scanf,_getch等读取。
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;
}
效果如下。

定义如前。自己看吧。