1. 程式人生 > >控制檯設定字型的大小,網上找得自己還沒來的及實現

控制檯設定字型的大小,網上找得自己還沒來的及實現

——————— 【 轉載請保留 】 ———————

作者:Defanive
部落格:Console.Dec.Cn(Hi.Baidu.Com/Console_App)

——————— 【 謝謝合作 】 ———————

型別:原創
時間:10.04.04
測試環境:VC++ 6.0

網友說,既然能改變控制檯的顏色,為什麼不能改變控制檯的字型大小呢?答案是肯定的。系統為我們提供了許多的API,能更改字型大小的API正隱身其中。網上沒有控制檯字型大小的相關資料,關於控制檯字型大小的教程是本部落格獨家放出。本文將教會你如何使用這些API,達到修改控制檯字型大小的目的。

一般控制檯中每個輸出緩衝區都有一個固定的字型。系統中的字型,每一種都有對應的序號,每種字型大小不同。想要修改為一種新的字型,就將這種字型的序號賦值給控制檯緩衝區即可。一般來說,系統所有的字型總數不超過40個,因此迴圈獲取資訊時可以以這個為上限。

首先放出需要用到的API列表:

(如下大部分API都沒有公佈,至最近才公佈了其中幾個的詳細資訊)

bool SetConsoleFont(HANDLE,DWORD)
這個是用於設定字型大小
第一個引數為輸出控制代碼,第二個引數為新字型大小序號

bool GetConsoleFontInfo(HANDLE,BOOL,DWORD,CONSOLE_FONT*)
這個是用於獲取字型資訊
第一個引數為輸出控制代碼,第二個引數應設為0,第三個引數為欲獲取資訊的字型序號,第四個引數為CONSOLE_FONT結構體的指標,API將返回的資訊放置在這個結構體裡

COORD GetConsoleFontSize(HANDLE,DWORD)
這個是用於獲取字型大小
第一個引數為輸出控制代碼,第二個引數為欲獲取大小的字型序號,返回的COORD的兩個成員就是字型的大小

DWORD GetNumberOfConsoleFonts()
這個是用於獲取可用字型數
返回可用字型總數

bool GetCurrentConsoleFont(HANDLE,BOOL,CONSOLE_FONT*)
這個是用於獲取當前字型的資訊
第一個引數為輸出控制代碼,第二個引數應設為0,第三個引數為CONSOLE_FONT結構體的指標,API將返回的資訊放置在這個結構體裡

結構體CONSOLE_FONT:

struct CONSOLE_FONT
{
DWORD index;
COORD dim;
};

第一個成員是字型的序號,第二個成員是字型的大小

由於篇幅原因,不對每個API函式一一討論,其引數型別所對應的意義參見其他文章。

首先,這是些未公佈的API,所以需要動態載入,首先在全域性宣告:

struct CONSOLE_FONT
{
DWORD index;
COORD dim;
};

typedef BOOL (WINAPI *PROCSETCONSOLEFONT)(HANDLE, DWORD);
typedef BOOL (WINAPI *PROCGETCONSOLEFONTINFO)(HANDLE,BOOL,DWORD,CONSOLE_FONT*);
typedef COORD (WINAPI *PROCGETCONSOLEFONTSIZE)(HANDLE,DWORD);
typedef DWORD (WINAPI *PROCGETNUMBEROFCONSOLEFONTS)();
typedef BOOL (WINAPI *PROCGETCURRENTCONSOLEFONT)(HANDLE,BOOL,CONSOLE_FONT*);

PROCSETCONSOLEFONT SetConsoleFont;
PROCGETCONSOLEFONTINFO GetConsoleFontInfo;
PROCGETCONSOLEFONTSIZE GetConsoleFontSize;
PROCGETNUMBEROFCONSOLEFONTS GetNumberOfConsoleFonts;
PROCGETCURRENTCONSOLEFONT GetCurrentConsoleFont;

然後在程式啟動的時候進行載入:

HMODULE hKernel32 = GetModuleHandle("kernel32");
SetConsoleFont = (PROCSETCONSOLEFONT)GetProcAddress(hKernel32,"SetConsoleFont");
GetConsoleFontInfo = (PROCGETCONSOLEFONTINFO)GetProcAddress(hKernel32,"GetConsoleFontInfo");
GetConsoleFontSize = (PROCGETCONSOLEFONTSIZE)GetProcAddress(hKernel32,"GetConsoleFontSize");
GetNumberOfConsoleFonts = (PROCGETNUMBEROFCONSOLEFONTS)GetProcAddress(hKernel32,"GetNumberOfConsoleFonts");
GetCurrentConsoleFont = (PROCGETCURRENTCONSOLEFONT)GetProcAddress(hKernel32,"GetCurrentConsoleFont");

載入完畢之後,就可以進行程式設計對字型大小控制了。

——————— 【 轉載請保留 】 ———————

作者:Defanive
部落格:Console.Dec.Cn(Hi.Baidu.Com/Console_App)