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]:
附:
使用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);
}


※listview多種條目展示案例
※Idea 阿里代碼規約插件安裝
TAG:程序員小新人學習 |