ダイアログテンプレートには
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>には、他にも便利なマクロが沢山入っています。
一つ上のページに戻る