1989年開業 情報工学部門 文部科学省登録番号 第22082号 公益社団法人日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム Unicode文字表示

●ウィンドウを開き、Unicodeで文字列を表示するプログラムです。
●TextOut関数ではなくTextOutW関数を使うとShift-JISではなくUnicodeとして描画されます。
●TextOutW関数は、文字列をchar型ではなくWCHAR型(ワイド文字列)で指定します。
 ワイド文字の型宣言は、wchar_t と記述してもかまいません。
●char型は1バイトですが、WCHAR型は2バイトです。


≫ソースファイルのダウンロード: unicode01.c
【問題】
●表示する文字列を変えてみよう。
●文字の色やフォント、サイズを変えてみよう。
 ※Unicodeに対応していないフォントがあります。

/*********************/
/*  Unicode文字表示  */
/*********************/
#include <stdio.h>
#include <windows.h>

HWND    hWnd=NULL;                                  // ウィンドウハンドル
MSG     msg;                                        // ウィンドウメッセージ
int     endFG=0;                                    // 終了フラグ

void  SETwindow(void);                              // ウィンドウ初期設定
void  byouga(void);                                 // 文字描画
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  // ウィンドウプロシージャ

void  main( )
{
    int  ir;

    SETwindow( );                                   // ウィンドウ初期設定

    while( endFG==0 )
      {
        ir=PeekMessage(&msg,hWnd,0,0,PM_REMOVE);    // windowsメッセージ取得
        if ( ir==0 ) continue;                      // メッセージなし
        TranslateMessage(&msg);                     // メッセージ変換
        DispatchMessage (&msg);                     // メッセージ送出
        if ( endFG!=0 ) break;
      }

    DestroyWindow(hWnd);                            // ウィンドウ破棄
}


void  SETwindow( )
/*----------------------*/
/*  ウィンドウ初期設定  */
/*----------------------*/
{
  WNDCLASS wc;      // ウィンドウ クラス
  DWORD  Wstyle;    // ウィンドウ・スタイル

    //--ウィンドウクラス設定--
    wc.lpszClassName="Unicode文字表示";             // ウィンドウ・クラス名
    wc.lpszMenuName =NULL;                          // クラス・メニュー・リソース名
    wc.hInstance    =GetModuleHandle(NULL);         // インスタンス・ハンドル
    wc.lpfnWndProc  =WndProc;                       // ウィンドウ・プロシージャ関数名
    wc.hCursor      =LoadCursor(NULL,IDC_ARROW);    // クラス・カーソル
    wc.hIcon        =NULL;                          // クラス・アイコン
    wc.hbrBackground=GetStockObject(BLACK_BRUSH);   // クラス背景ブラシ
    wc.style        =CS_OWNDC|                      // クラス・スタイル
                     CS_BYTEALIGNCLIENT|
                     CS_BYTEALIGNWINDOW;
    wc.cbClsExtra   =0;                             // 補足クラス・メモリ
    wc.cbWndExtra   =0;                             // 補足ウィンドウ・メモリ

    //--ウィンドウ・スタイル設定--
    Wstyle= WS_OVERLAPPED|                          // 自動表示位置
            WS_SYSMENU|                             // 閉じる可能
            WS_MINIMIZEBOX;                         // 最小化可

    RegisterClass(&wc);                             // ウィンドウ・クラス登録

    //--ウィンドウ生成--
    hWnd=CreateWindow(wc.lpszClassName,             // クラス名
                      wc.lpszClassName,             // ウィンドウ名(実行ファイル)
                      Wstyle,                       // ウィンドウ・スタイル
                      0,                            // ウインドウ水平位置
                      0,                            // ウインドウ垂直位置
                      600,                          // ウィンドウXサイズ(枠含)
                      100,                          // ウィンドウYサイズ(枠含)
                      NULL,                         // 親ウィンドウ・ハンドル
                      NULL,                         // メニューハンドル
                      wc.hInstance,                 // アプリケーション・インスタンス・ハンドル
                      NULL);                        // ウィンドウ作成データ

    ShowWindow(hWnd,SW_SHOWDEFAULT);                // ウィンドウ表示状態設定
}


void  byouga( )
/*------------*/
/*  画面描画  */
/*------------*/
{
    HDC  hdc;     // デバイスコンテキスト ハンドル
    HFONT  hfont; // 論理フォントハンドル
    WCHAR  c[32]; // ワイド文字

    hdc=GetDC(hWnd);                                // ウィンドウのDC 取得

    SetBkMode(hdc,OPAQUE);                          // 文字の背景=不透明
    SetTextColor(hdc,RGB(255,128,  0));             // テキスト色設定
    SetBkColor  (hdc,RGB(  0,  0,  0));             // 背景色=黒

    //--フォント--
    hfont=CreateFont(                               // フォント・オブジェクト生成
            64,                                     // フォントの論理高(ピクセル)
            32,                                     // 文字の論理幅(ピクセル)
            0,                                      // テキスト行の角度
            0,                                      // ベースラインとx軸の角度
            FW_THIN,                                // フォント太さ(標準)
            FALSE,                                  // イタリック体フラグ
            0,                                      // アンダーラインフラグ
            FALSE,                                  // バーチカルラインフラグ
            SHIFTJIS_CHARSET,                       // 文字セット識別子
            OUT_TT_PRECIS,                          // 出力精度
            CLIP_TT_ALWAYS,                         // クリッピング精度
            PROOF_QUALITY,                          // 出力品質
            FIXED_PITCH|FF_MODERN,                  // ピッチ
//          "メイリオ");                            // タイプフェイス名
            "MS ゴシック");                       // タイプフェイス名
    SelectObject(hdc,hfont);                        // フォント設定

    //--文字コード--
    c[0]=0x2318;                                    // Unicode
    c[1]=0x2603;                                    // Unicode
    c[2]=0x270C;                                    // Unicode
    c[3]=0x3004;                                    // Unicode
    c[4]=0x3403;                                    // Unicode
    c[5]=0x9AD9;                                    // Unicode
    c[6]=0xAC10;                                    // Unicode

    TextOutW(hdc,10,5,c,7);                         // 文字列描画(7文字)

    DeleteObject(hfont);                            // フォントオブジェクト削除
    ReleaseDC(hWnd,hdc);                            // ウィンドウのDC 解放
}


LRESULT CALLBACK  WndProc(
/*--------------------------*/
/*  ウィンドウプロシージャ  */
/*--------------------------*/
HWND  hwnd,      // ウィンドウ・ハンドル
UINT  uMsg,      // メッセージID
WPARAM wParam,   // 第1メッセージ・パラメータ(無符号)
LPARAM lParam)   // 第2メッセージ・パラメータ(有符号)
{
  PAINTSTRUCT  hpaint;  // 描画情報
  BOOL  ir=0;

    switch( uMsg )
      {
        case WM_CLOSE://--ウィンドウ閉--
                PostQuitMessage(0);                 // 実行終了
                endFG=1;
                break;

        case WM_PAINT://--ウィンドウ更新--
        case WM_SETFOCUS://--フォーカス取得--
                if ( GetUpdateRect(hwnd,NULL,FALSE)!=0 )
                  {                                // 更新リージョンあり
                    BeginPaint(hwnd,&hpaint);
                    byouga( );                     // 文字描画
                    EndPaint(hwnd,&hpaint);
                  }
                break;

        default://--その他--
                ir=DefWindowProc(hwnd,uMsg,wParam,lParam);
      }

    return(ir);
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: info@saeki-pe.com