當前位置:
首頁 > 知識 > windows C/C++ 使控制台窗口全屏

windows C/C++ 使控制台窗口全屏

  • 背景
  • 方法
  • 方法一:使用cmd命令mode
  • 方法二:使用windows api
  • 附:

背景

時間[2018年07月23日 中午]

在寫windows控制台應用程序的時候,我們希望修改一下控制台窗口的大小以及位置等信息。

方法

方法一:使用cmd命令mode

語法: MODE CON[:] [COLS=c] [LINES=n]

指定控制台行數及列數,行、列的單位為字元。

C/C++中使用system()調用該命令,例如:

system(「mode con: cols=120 lines=40」);

要使用控制台窗口全屏化,首先要得到屏幕的大小,分別使用GetSystemMetrics(SM_CXSCREEN)和GetSystemMetrics(SM_CYSCREEN)獲取屏幕的寬度和高度,單位為像素。由於mode con的單位是字元,需要將屏幕大小信息進行轉換,因此我們又需要得到每個字元的寬和高所佔用的像素數,可以使用GetCurrentConsoleFont()和GetConsoleFontSize()來獲取。

示例代碼:

/*******************************************************************************

* 獲取控制台當前字體大小

******************************************************************************/

COORD get_font_size()

{

COORD font_size;

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

/* 字體信息 */

struct CONSOLE_FONT

{

DWORD index;

COORD dim;

} cfi;

typedef COORD (WINAPI *PROCGETCONSOLEFONTSIZE)(HANDLE, DWORD);

typedef BOOL (WINAPI *PROCGETCURRENTCONSOLEFONT)(HANDLE, BOOL, struct CONSOLE_FONT*);

HMODULE hKernel32 = GetModuleHandle("kernel32");

PROCGETCONSOLEFONTSIZE GetConsoleFontSize = (PROCGETCONSOLEFONTSIZE)GetProcAddress(hKernel32,"GetConsoleFontSize");

PROCGETCURRENTCONSOLEFONT GetCurrentConsoleFont = (PROCGETCURRENTCONSOLEFONT)GetProcAddress(hKernel32,"GetCurrentConsoleFont");

GetCurrentConsoleFont(handle, FALSE, &cfi); /* 獲取當前字體索引信息 */

font_size = GetConsoleFontSize(handle, cfi.index); /* 獲取當前字體寬高信息[字元寬度及高度所佔像素數] */

return font_size;

}

/*******************************************************************************

* 最大化展示控制台窗口

******************************************************************************/

void full_screen()

{

HWND hwnd = GetForegroundWindow();

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); /* 標準輸出緩衝區句柄 */

int cx = GetSystemMetrics(SM_CXSCREEN); /* 屏幕寬度 */

int cy = GetSystemMetrics(SM_CYSCREEN); /* 屏幕高度 */

COORD size = get_font_size();

char cmd[32] = { 0 };

sprintf(cmd, "MODE CON: COLS=%d LINES=%d", cx / size.X, cy / size.Y);

system(cmd);

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

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

到目前為止,代碼可以運行了,但運行效果並不盡如人意,比如,我不想讓控制台窗口的標題欄、狀態欄、邊框、滾動條等展示出來。在網上搜索了一翻,發現一種解決方案,是將屏幕的寬、高信息添加一個固定的數值,比如300,最後使用MoveWindow()函數設置窗口的左上角位置,即設置了一個大小為標題欄高度的偏移量,如-33,將標題欄放在了可視區之外。這種方法在win8.1上是可行的,但在win10中無效,只能另闢蹊徑了。

方法二:使用windows api

相關函數:

GetWindowLong() 用於獲取窗口信息

SetWindowLong() 用於設置窗口信息

SetWindowPos() 設置窗口起始位置及大小

要了解更詳細的使用說明,可以查看官方文檔。

示例代碼:

/*******************************************************************************

* 全屏控制台窗口

* 取消標題欄及邊框

******************************************************************************/

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

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

運行結果[win10 + vc6]:

windows C/C++ 使控制台窗口全屏

附:

使用api修改控制台緩衝區大小

SetConsoleScreenBufferSize() 設置控制台緩衝區大小

示例代碼

/*******************************************************************************

* 設置控制台窗口起始位置,緩衝區大小及窗口大小

* top : 左上角X坐標

* left : 左上角Y坐標

* width :寬度 單位 字元

* height: 高度 單位 字元

******************************************************************************/

void full_screen(int top, int left, SHORT width, SHORT height)

{

COORD size;

HWND hwnd = GetForegroundWindow();

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

COORD font_size = get_font_size();

width = width > GetSystemMetrics(SM_CXMIN) ? width : GetSystemMetrics(SM_CXMIN);

height = height > GetSystemMetrics(SM_CYMIN) ? height : GetSystemMetrics(SM_CYMIN);

size.X = width;

size.Y = height;

SetConsoleScreenBufferSize(handle, size);

SetWindowPos(hwnd, HWND_TOP, top, left, size.X * font_size.X, size.Y * font_size.Y, 0);

}

windows C/C++ 使控制台窗口全屏

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

listview多種條目展示案例
Idea 阿里代碼規約插件安裝

TAG:程序員小新人學習 |