[C++]常用的windows控制台操作

一些常用的控制台操作!

注意:该文章全程需要:Windows.h 头文件,因为使用了Windows的API

一、光标

1. 隐藏光标

void HideCursor(){
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

2. 移动光标

代码中的参数:

  • x x坐标
  • y y坐标
void gotoxy(int x, int y){
	HANDLE hout;
	COORD pos;
	pos.X = x;
	pos.Y = y;
	hout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout, pos);
} 

不知道什么时候,这里多了一些奇怪的符号:WEdCezBCbVl4NGtVNG9+X3drRlJXUSxOfQ==

二、窗口大小

1. 调整大小

自定义窗口大小可以带来更好的体验!

代码中的参数:

  • col
  • row 行数
    其实就是高和宽

下面是Windows10系统的写法

void setsize(int col, int row){
	char cmd[64];
	sprintf(cmd, "mode con cols=%d lines=%d", col, row);
	system(cmd);
}

或者使用Windows API的写法

bool SetSize(int width, int height)
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //获取输出句柄
    SMALL_RECT wrt = { 0, 0, width - 1, height - 1 }; //设置宽高
    bool ret = SetConsoleWindowInfo(hOutput, TRUE, &wrt); // 设置窗体尺寸
    if (!ret) return false;
    COORD coord = { width, height };
    ret = SetConsoleScreenBufferSize(hOutput, coord); // 设置缓冲尺寸
    return ret;
}

上面的方法在Win10可以使用,但是在Win11系统失效了,如果想要在Win11系统下修改窗口大小,可以手动修改终端设置实现,但是!!
我们是为了在程序运行的时候能够自行修改窗口大小,怎么能让用户修改呢。
于是经过一番查找,发现了一个Windows的API可以实现修改窗口大小的操作————SetWindowPos
代码如下:

void setsize(int col,int row){
  HWND hwnd = GetConsoleWindow();
  Sleep(10);//如果在程序启动后立即执行这些代码,则必须在此处等待一小段时间,否则 GetWindow 将失败。我推测可能是因为控制台尚未完全初始化,若非开始时调用可以忽略此处。
  HWND owner = GetWindow(hwnd,GW_OWNER);
  if (owner == NULL) {
      // Windows 10
      SetWindowPos(hwnd, nullptr, 0, 0, col, row, SWP_NOZORDER | SWP_NOMOVE);
  }
  else {
      // Windows 11
      SetWindowPos(owner, nullptr, 0, 0, col, row, SWP_NOZORDER | SWP_NOMOVE);
  }
}

上面代码同时兼顾了Win10和Win11,推荐此写法。
这些代码不需要记忆,直接使用即可,参数和上面的一样。
同时,我们也可以利用它写一个全屏的函数

void full_screen()
{
    HWND hwnd = GetForegroundWindow();
    int cx = GetSystemMetrics(SM_CXSCREEN);            /* 屏幕宽度 像素 */
    int cy = GetSystemMetrics(SM_CYSCREEN);            /* 屏幕高度 像素 */

    LONG l_WinStyle = GetWindowLong(hwnd, GWL_STYLE);   /* 获取窗口信息 */
    /* 设置窗口信息 最大化 取消标题栏及边框 */
    SetWindowLong(hwnd, GWL_STYLE, (l_WinStyle | WS_POPUP | WS_MAXIMIZE) & ~WS_CAPTION & ~WS_THICKFRAME & ~WS_BORDER);

    SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, 0);
}

2、固定大小

当然,为了防止用户自己改变窗口大小,所以我们还需要固定窗口大小

HWND hWnd = GetConsoleWindow(); //获取窗口句柄
LONG_PTR sty = GetWindowLongPtrA(hWnd, GWL_STYLE); //获取窗口样式
sty = sty & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX; //去除可变化大小,最大,最小化按钮,~是取反,&是与,这是位运算相关的知识了
SetWindowLongPtrA(hWnd, GWL_STYLE, sty); //设置窗体不可更改大小,不可最大化

或者直接写为一句代码(

SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);

可惜Win11用不了......,目前只看到有一种办法就是更改windows的终端,未发现其他固定控制台大小的方法。

三、颜色

1. cmd 命令

第一种改变输出颜色的方法,就是利用cmd命令改变全部颜色

color 后面的参数就是要修改的颜色

system("color a");              ^

部分参数

颜色
0 黑色
1 蓝色
2 绿色
3 Aqua
4 红色
5 紫色
6 黄色
7 白色
8 灰色
9 淡蓝色
a 浅绿色
b 淡蓝绿色
c 淡红色
d 淡紫色
e 淡黄色
F 亮白色

2. 直接printf颜色

这种方法虽然格式不是很好写,但是如果我们封装为函数就非常方便,并且因为printf输出,可以实现局部颜色改变,做控制台游戏的应该知道这有多重要hh(

void printf_red(const char *s)
{
    printf("\033[0m\033[1;31m%s\033[0m", s);
}

void printf_green(const char *s)
{
    printf("\033[0m\033[1;32m%s\033[0m", s);
}

void printf_yellow(const char *s)
{
    printf("\033[0m\033[1;33m%s\033[0m", s);
}

//......

void printf_cyan(const char *s)
{
    printf("\033[0m\033[1;36m%s\033[0m", s);
}

具体参考该文章

四、控制台

1. 标题

把下面的title改为想要的标题即可

SetConsoleTitle("title");

或者使用Windows的API更改标题

SetConsoleTitleA("test"); 

先记录这些,有用到的再继续更新。

posted @ 2024-12-04 22:09  蹊世  阅读(492)  评论(0)    收藏  举报