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

世蹊發表於2024-12-04

目錄
  • 一、游標
    • 1. 隱藏游標
    • 2. 移動游標
  • 二、視窗大小
    • 1. 調整大小
    • 2、固定大小
  • 三、顏色
    • 1. cmd 命令
    • 2. 直接printf顏色
  • 四、控制檯
    • 1. 標題

一些常用的控制檯操作!

注意:該文章全程需要: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);
} 

二、視窗大小

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"); 

先記錄這些,有用到的再繼續更新。

相關文章