2

こんにちは Windows プログラマー!

winapi を使用した Windows プログラミングは初めてです。このとても素敵な本を読んでいて、DrawText と TextOut を使用してクライアント領域に Unicode 文字 U+5167 (內) を表示すると、問題 (黒いボックスとして表示される) に遭遇しました。不思議なことに、この特定の Unicode 文字はウィンドウのキャプション エリアに正しく表示されます。この Unicode 文字は、MessageBox を使用して表示すると正しく表示されます。最後に、U+5166、U+5168、U+5157、U+5177 など、この Unicode に比較的近い他の Unicode 文字を表示してみました。

標準で定義されているこの Unicode 文字のリンクを次に示します。 http://unicode-table.com/en/#5167

注:Visual Studio 2010を使用してUnicodeを使用してこのコードをコンパイルしています

以下は私のコードです。


#include<windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    HWND hwnd;
    MSG msg;

    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if(!RegisterClass (&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,
                            TEXT("內Sample text 內篇 日本国 渡瀬 內篇全兦兗具 кошка"),
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    LPTSTR c = TEXT("內Sample text 內篇 日本国 渡瀬 內篇全兦兗具 кошка");

    switch(message)
    {
        case WM_CREATE:
            PlaySound(TEXT("shutda.wav"), NULL, SND_FILENAME | SND_ASYNC);
MessageBox(hwnd, c, c, 0);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rect);         
            DrawTextEx(hdc, c, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER, NULL);
            TextOut(hdc, 100, 100, TEXT("內篇 日本国 кошка unicode"), 19);
            EndPaint(hwnd, &ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

Windows 以外のプログラマーは、このコードをコピーして .cpp ファイルに直接貼り付けることで、このコードをコンパイルして実行できます。VS2010 を使用している場合は、新しい「Win32 アプリケーション」プロジェクトを作成し、「空のプロジェクト」を選択するだけです。その後、プロジェクトのソース フォルダーに「test.cpp」などの cpp ファイルを追加する必要があります。次に、コードをコピーして「test.cpp」に貼り付け、ビルドして実行します。これで私の問題が表示されるはずです。:)

4

1 に答える 1

5

有効な文字が四角形のボックスとして表示されている場合は、フォントにその文字のグリフが含まれていないことを示しています。この問題を解決するには、この文字のグリフを持つフォントを使用する必要があります。

于 2014-05-30T09:54:51.947 に答える