テキストを表示する

画面にテキストw表示すう方法を説明します。

画面の表示にはデバイス今テキストを使いますが、これにはテキスト描画用のメンバ関数も用意されています。
なんと便利なクラスなんでしょうか。
では、一つづいきます。

始めになんでもよいのでテキストを表示してみます。
ダイアログベースのプロジェクトを作り、ボタンをおきます。
ボタンのハンドルに

CClientDC DC(this); // 表示用のデバイスコンテキスト

DC.TextOut(0,0,"テキストを表示してみました");


表示1


こんな風に表示できましたか?
簡単ですね。

では次にテキストを表示するまえに

DC.SetBkMode(TRANSPARENT); //背景が透けるように重ねる場合

という文を入れて同じく実行してみましょう。

表示2


今度はこんな風になりました。

表示1と比べると、文字の背景が灰色になっています。
これは灰色になっているのではなくて、背景の色が透けて見えているんですね。
キャラクタで背景を透明にするのと同じです。

こうやると、背景にビットマップがある場合でもちゃんと絵に重なって表示されます。
これを利用するとサウンドノベルが作れるかもしれません。


--------------------------------------------------------------------------------

ゲームで使うにはテキストの色、大きさ、フォントなどを変更する必要があります。

色の変更は、

DC.SetTextColor(0x00ff0000); //テキストの色 BGR の順番

というメンバ関数で行います。
色をどうやって決めるかというと、32ビットの2進数を思い出してください。
この関数の引数は、32ビットの16進数です。

それぞれ右から1バイトづつ、(つまり0〜0xFFまで)で区切られており、
右から赤、緑、青 の順番に指定することになっています。

一番明るい赤は、0x000000ff  になります。
同じく
一番明るい青 0x00ff0000
一番明るい緑 0x0000ff00

になります。
色を混ぜるときにはそれぞれの成分を入れればOKです。
たとえば黄色は、赤+緑なので

0x0000ffff になります。

配分は光の3原色の配分です。


--------------------------------------------------------------------------------

フォントの大きさとフォントの変更はちょっとやり方が面倒です。
フォント用の構造体を作ってやらなければいけません。
 

DC.SetMapMode(MM_TEXT); // マッピングモードをきめる(大きさの単位を決める)
//////////////////////////////////////
// フォント 生成
LOGFONT logfont;
logfont.lfHeight = 200; // 高さ
logfont.lfWidth = 50; // 幅
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = 100;
logfont.lfItalic = FALSE; //イタリックにするか
logfont.lfUnderline = TRUE // アンダーラインをひくか;
logfont.lfStrikeOut = FALSE; // 消し線をひくか
logfont.lfCharSet = SHIFTJIS_CHARSET;   // どのタイプのフォントを使うか
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily = DEFAULT_PITCH | FF_DECORATIVE;
// strcpy(logfont.lfFaceName,"MS 明朝"); //フォントの名前
strcpy(logfont.lfFaceName,"DFPOP体");
 
CFont font;
CFont* pOldFont; // 元のフォントを保存する
font.CreateFontIndirect(&logfont);
pOldFont = DC.SelectObject(&font);
DC.TextOut(0,0,"あいうえお株式会社"); // テキストを表示してから
DC.SelectObject(pOldFont); // フォントを元にもどす
 
//////////////////////////////////////////////
 

このコードはまとめて1セットで使います。
元のフォントを戻す部分ですが、これはなくてもちゃんと動きます。
しかし、これはDCを新しく作っているからで、これが pDCなどだったばあい
画面のフォントを変更したままかえるとおかしくなる場合があります。

ですから、これも約束ということで入れておきます。

テキスト表示のテスト用全コードは以下のようになります。
 

  void CDialogtestDlg::OnButton1()
 {
 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 
 CClientDC DC(this);
 DC.SetBkMode(TRANSPARENT); //背景が透けるように重ねる場合
 
 DC.SetMapMode(MM_TEXT); // マッピングモードを決める
 
 // フォントの作成
 
 LOGFONT logfont;
 
 logfont.lfHeight = 200; // 高さ
 logfont.lfWidth = 30; // 幅
 logfont.lfEscapement = 0;
 logfont.lfOrientation = 0;
 logfont.lfWeight = 100;
 logfont.lfItalic = FALSE;
 logfont.lfUnderline = TRUE;
 logfont.lfStrikeOut = TRUE;
 logfont.lfCharSet = SHIFTJIS_CHARSET;
 logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
 logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
 logfont.lfQuality = DEFAULT_QUALITY;
 logfont.lfPitchAndFamily = DEFAULT_PITCH | FF_DECORATIVE;
 // strcpy(logfont.lfFaceName,"MS 明朝");
 strcpy(logfont.lfFaceName,"DFPOP体");
 
 CFont font;
 CFont* pOldFont;
 font.CreateFontIndirect(&logfont);
 pOldFont = DC.SelectObject(&font);
 
 DC.TextOut(20,20,"テキストを表示してみました");
 
 DC.SelectObject(pOldFont);
 
 }