色々なコントロール(2)

前回のつづき……の前に、予備知識をひとつ。

SendMessage() API

これは、読んで字のごとく、ウィンドウにメッセージを送るAPIです。似たようなもので、PostMessage() というのもあります。これを使って、コントロール毎に異なる特定のメッセージを送ることによって、 状態の調査や変更を行うことができます。SendMessage()とGetDlgItem()を一つにまとめた、 SendDlgItemMessage()というのもあります。

リストボックス

わりと多めの複数の選択肢から一つを選ばせるときに使うコントロールです。
また、スタイル指定に よっては、複数同時選択も可能です。マルチカラム(表計算ソフトのように複数の列をもつ)も可能です。
ダイアログテンプレートには
    LISTBOX             IDLIST, 68, 56, 48, 33, WS_VSCROLL | WS_TABSTOP
のように書きます。中身のデータは、ダイアログテンプレートには書けないので、 ダイアログプロシージャ内で、
	SendDlgItemMessage(hDlg, IDLIST, LB_ADDSTRING, 0, (LONG)(LPSTR)"8000");
	SendDlgItemMessage(hDlg, IDLIST, LB_ADDSTRING, 0, (LONG)(LPSTR)"11025");
	SendDlgItemMessage(hDlg, IDLIST, LB_ADDSTRING, 0, (LONG)(LPSTR)"22050");
	……
のようにして与えます。また、最初にどれか一つを選択状態にしておくために、
	SendDlgItemMessage(hDlg, IDLIST, LB_SETCURSEL, 1, 0L);
のように書きます。何番目の項目が選ばれたかは
	type = (int)SendDlgItemMessage (hDlg, IDLIST, LB_GETCURSEL, 0, 0L);
のように調査します。

コンボボックス

これはリストボックスとエディットコントロールを合わせたようなコントロールです。 編集可能にすることも、リードオンリーにすることもできます。 わりと多めの複数の選択肢から一つを選ばせるときに使ったり、さらにそれを 編集させたりできます。
閉じた状態では、このような外観をしています。右端のボタン を押してドロップダウンさせると
このような外観になります。なお、スタイル指定 によっては、ずっとドロップダウンさせたままの状態にすることもできます。
ダイアログテンプレートには
    COMBOBOX            IDTYPE, 38, 23, 91, 50, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
のように書きます。 中身のデータ(最初に与える選択肢)は、ダイアログテンプレートには書けないので、 ダイアログプロシージャ内で、
	SendDlgItemMessage(hDlg, IDTYPE, CB_ADDSTRING, 0, (LONG)(LPSTR)"PCM");
	SendDlgItemMessage(hDlg, IDTYPE, CB_ADDSTRING, 0, (LONG)(LPSTR)"Microsoft ADPCM");
	SendDlgItemMessage(hDlg, IDTYPE, CB_ADDSTRING, 0, (LONG)(LPSTR)"IEEE Froat");
	……
のように書きます。また、最初にどれか一つを選択状態にしておくために、
	SendDlgItemMessage(hDlg, IDTYPE, CB_SETCURSEL, type, 0L);
のように書きます。何番目の項目が選ばれたかは
	type = (int)SendDlgItemMessage (hDlg, IDTYPE, CB_GETCURSEL, 0, 0L);
のように調査します。文字列が編集可能な場合、編集結果はGetDlgItemText() を使って取得します。

スクロールバー

連続して変化する値を指定させるコントロールです。 スピンボタンとしての利用も可能です。
垂直スクロールバーと水平スクロールバーがあります。

これは他のコントロールとはちょっと変わったコントロールです。 まず他のコントロールはすべて、状態の変化をWM_COMMANDで親ウィンドウに伝えますが、これは WM_HSCROLLかWM_VSCROLLを送ってきます。 ダイアログテンプレートには

    SCROLLBAR           IDSCR, 42, 97, 86, 8
のように書きます。ソース中では初期化動作として
	SetScrollRange(GetDlgItem(hDlg, IDSCR), SB_CTL, 0, 100, FALSE);
	SetScrollPos(GetDlgItem(hDlg, IDSCR), SB_CTL, 50, TRUE);
	level=50;
メッセージ処理として
void OptionClass_OnHScroll(HWND hDlg, HWND hwndCtl, UINT code, int pos){
	switch(code){
		case SB_LINEUP:   level--; break;
		case SB_LINEDOWN: level++; break;
		case SB_PAGEUP:   level-=10; break;
		case SB_PAGEDOWN: level+=10; break;
		case SB_THUMBTRACK:
		case SB_THUMBPOSITION: level=pos; break;
	}
	if (level<0) level=0;
	if (level>100) level=100;
	SetScrollPos(GetDlgItem(hDlg, IDSCR), SB_CTL, level, TRUE);
	if (code!=SB_THUMBPOSITION)
		RedrawWindow(GetDlgItem(hDlg,IDSCR), NULL, NULL,
			RDW_FRAME|RDW_INVALIDATE/*|RDW_ALLCHILDREN*/);
}
中略
	case WM_HSCROLL:
		HANDLE_WM_HSCROLL(hDlg, wParam, lParam, OptionClass_OnHScroll);
		break;
のように書きます。

ここで、HANDLE_WM_HSCROLLというのは、<windowsx.h>(注意:<windows.h>ではない)で 定義されたメッセージクラッカマクロです。実は、WM_HSCROLLというメッセージは、Win16とWin32で パラメータの意味が変更になってしまいました。それをソース共通に記述するためのマクロが メッセージクラッカです。(crack(割る)より。32ビットパラメータを16ビットに適切に分割) <windowsx.h>には、他にも便利なマクロが沢山入っています。

前のページ

次のページ

一つ上のページに戻る