FAQ3-1

Q. リストボックスでテキストを右揃えにするには

 リストボックスに数値を右揃えにして表示させたいのですが,どうもうまくいきません.リスト3-1のようにwsprintfを使用して,リストボックスの中に入れる文字列を揃えて入れてみたのですが,図3-1のようになってしまいます.

[図3-1] :

 リスト3-1のようにすることによって,10桁目で右揃えになるはずだったのですが,なぜかバラバラの位置に書かれてしまいます.また,これでうまくいったとしても,リストボックスのウィンドウの右端に揃えれるかどうか不安です.
 どうしたらよいのか教えてください.

[リスト3-1] :

BYTE buff[100];
wsprintf( (LPSTR)buff, "%10d", nData );
SendMessage( hList, LB_ADDSTRING, 0, (LPARAM)(LPSTR)buff );


A. 固定ピッチフォントを指定する

固定ピッチフォントを指定

 これは,システムフォントが可変ピッチであるためによく起きる現象です.可変ピッチとは,一文字一文字それぞれ幅が違うフォントのことで,例えば「W」と「I」では幅がずいぶん違います.
 この可変ピッチの問題は,固定ピッチのフォントを指定することで解決できます.固定ピッチのフォントは,特にフォントの形にこだわらなければ,Fixedsysという名前の固定ピッチフォントがあるので,これを使用しましょう.
 フォントを作成するにはCreateFont関数などを使用するのが普通ですが,特定の定義済みフォントはGetStockObjectで獲得できるので,これを使用します.
 コントロールで使われるフォントを変更するには,WM_SETFONTメッセージをコントロールに送ることで変更できます.
 というわけで,WM_INITDIALOGの処理中などにリスト3-2の1文を入れれば一発で解決です(図3-2).

[図3-2] :

[リスト3-2] :

SendMessage( hList, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FIXED_FONT), 0 );

リストボックスの中身を自分で書く

 これ以外にももう一つ方法があります.  それは,リストボックスの中身を自分で書くという方法です.リストボックスにはLBS_OWNERDRAWFIXEDとLBS_OWNERDRAWVARIABLEというオーナー描画のスタイルがあります.
 前者はリストボックスの項目の高さがすべて均一になるスタイルで,後者は一つ一つの項目の高さを変えられるスタイルです.
 どちらも,リストボックスの項目が描画されるタイミングのときにWM_DRAWITEMメッセージが親ウィンドウに対して来るので,このメッセージを処理すれば項目の内容を自分で書くことができるようになります.
 リスト3-3のようにすることで,とりあえず右揃えに表示可能になります(これはLBS_HASSTRINGスタイルも指定した場合).
 こうすることによって,リストボックスのサイズがどう変っても,確実に右端に書くことが可能になりました(図3-3).

[図3-3] :

[リスト3-3] :

case WM_DRAWITEM:{
  DRAWITEMSTRUCT FAR * dis;
  BYTE buff[100];
  
  dis = (DRAWITEMSTRUCT FAR *)lParam;
  SendMessage( hList, LB_GETTEXT, dis->itemID, (LPARAM)(LPSTR)buff );
  DrawText(dis->hDC , (LPSTR)buff, -1 ,&dis->rcItem,
           DT_SINGLELINE | DT_VCENTER | DT_RIGHT );
  
  return(TRUE);
  }
 リスト3-3のWM_DRAWITEM処理では,リストボックスがフォーカスを得たときの破線枠の描画や,項目が選択されているときのハイライト表示のことを考えていません.
 DRAWITEMSTRUCT構造体のメンバーにitemStateというメンバーがあるので,この状態を見て描画方法を切り分けてやる必要があります.
 このほか,余談ですがWM_MEASUREITEMメッセージを処理することで,項目の高さを自在に変えることが可能です.
 LBS_OWNERDRAWVARIABLEスタイルを指定した場合,項目を追加するたびにWindowsからアプリケーションに対してWM_MEASUREITEMメッセージを送ってくるので,これに応答してやることで項目ごとに違う高さのリストボックスも作成できるようになります.
 図3-4は,いろいろオーナー描画してみた例です.どれも,とてもリストボックスとは思えない姿ですが,れっきとしたリストボックスなのです.

[図3-4] :

 オーナー描画にすると,少々面倒ではありますが,いろいろなことができるのでバシバシ使っていきましょう.


Back to FAQ main page