1

C で記述されたプログラムがあり、Visual Studio 2012 で開発されています。
私のプログラムはラスター フォントでは使用できない文字を使用しているため、cmd.exeフォントを Consolas に変更すると、文字 (á、é、í など) が機能しました。

しかし、プログラムを開くと、コンソールはまだラスター フォントのままです。Consolas をグローバルに受け入れられるようにするには、どこを変更すればよいかわかりません。

前もって感謝します。

4

2 に答える 2

1

ここに、いくつかのソースから集めたいくつかのコードを示します。コードページを使用できるようにし、ユニコードを回避します。ただし、 wprintf() なども機能するはずです。

consolas と lucida コンソールのみが動作します。同様のサイズを取得する試みが含まれます。

チェックには、nFont インデックスの有効性チェックが含まれます。これは不要な場合があります。その場合、kernel32 ルーチン GetNumberOfConsoleFonts() への文書化されていない呼び出しを省略できます。

Hans は、XP では動作しないと言っています。ドキュメントによると、XP を含む最小の _WIN32_WINNT は 0x500 です。まだ試していません。1月

static void strcpytoW(WCHAR *dst, const char *src)
{
    WCHAR c;
    while ((c=*src++)!=0) *dst++=c;
    *dst=0;
}

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

typedef DWORD (WINAPI *FN_NUMCONSOLEFONT)();
FN_NUMCONSOLEFONT GetNumberOfConsoleFonts;
static bool setfont(const HANDLE h, char *facename, CONSOLE_FONT_INFOEX &in,CONSOLE_FONT_INFOEX &out)
{
    in.cbSize=out.cbSize=sizeof(in);
    strcpytoW(in.FaceName,facename);
    if (!SetCurrentConsoleFontEx(h,FALSE,&in)) return false;
    HMODULE hm = ::GetModuleHandleA("KERNEL32.DLL"); 
    if (!hm) return false;
    GetNumberOfConsoleFonts = (FN_NUMCONSOLEFONT) GetProcAddress(hm, "GetNumberOfConsoleFonts");
    if (!GetNumberOfConsoleFonts) return false;
    DWORD numConsoleFonts=GetNumberOfConsoleFonts();
    if (!GetCurrentConsoleFontEx(h,FALSE,&out)) return false;
    return out.nFont>=0 && out.nFont<numConsoleFonts && _wcsicmp(in.FaceName,out.FaceName)==0;
}

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

static char *set_console(char *facename,int page)
{
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFOEX fi={sizeof(fi),-1,{0,0},54,700},newfi;
    CONSOLE_FONT_INFO curfi;
    if (!GetCurrentConsoleFont(hStdout,FALSE,&curfi)) return NULL;
    for (fi.dwFontSize=curfi.dwFontSize;;fi.dwFontSize.Y++)
    {
        if (!setfont(hStdout,facename,fi,newfi))
        {
            facename="Lucida Console";
            if (!setfont(hStdout,facename,fi,newfi)) return NULL;
        }
        if (newfi.dwFontSize.X>=curfi.dwFontSize.X) break;
    }
    if (!SetConsoleOutputCP(page)) return NULL;
    return facename;
}

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

int main(int argc, char *argv[])
{
    char *faceused;
    if ((faceused=set_console("Consolas",1252))!=NULL)
        printf("Console succesful, using %s\n",faceused);
    else puts("Console failed");
    puts("\x86 \x87 \xa7 \xa9 \xae \xb1 \xbc");
于 2013-06-03T13:53:55.087 に答える