第19章 リストボックス・その他の扱い方 その2


前回の、ウィンドウプロシージャの中でもう少し解説しないと いけないところがあります。

case IDM_DLG: hIns = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); DialogBox(hIns, "MYDIALOG", hWnd, (DLGPROC)DlgProc); InvalidateRect(hWnd, NULL, TRUE); break;

の部分ですが、以前作ったプログラムでは、DialogBox関数の 第1引数はWinMain関数の第1引数をグローバル変数にコピーしておいて これを利用しました。ここでは、GetWindowLong関数を用いてインスタンス ハンドルを取得しています。ただしこれは32ビット版 の話です。

LONG GetWindowLong( HWND hWnd, // handle of window int nIndex // offset of value to retrieve );

nIndexの所をいろいろ変えてやることにより、ウィンドウのいろいろな 情報を取得することができます。インスタンスハンドルを取得するには GWL_HINSTANCEにすればよいのです。「GWL_何とか」というパターンです。 GWLというのはGetWindowLongの大文字の所を取ったものです。(と、筆者は思っています)

16ビット版では

WORD GetWindowWord(hwnd, nOffset) HWND hwnd; int nOffset;

を使います。GetWindowWord(hWnd, GWW_HINSTANCE);というような 感じで使います。

さて、インスタンスハンドルの取得方法はもう1つあります。 ウィンドウプロシージャの中で、WM_CREATEメッセージを捕まえます。 そこで、hInst = ((LPCREATESTRUCT)lp)->hInstance;とする方法です。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HINSTANCE hInst; switch (msh) { case WM_CREATE: hInst = ((LPCREATESTRUCT)lp)->hInstance; ・・・以下略

という感じで使います。これもある程度決まった書き方です。

と言うことで、DialogBoxで使うインスタンスハンドルの取得方法を3つ紹介しました。 まとめると、

1.WinMain関数の第1引数をグローバル変数にコピーして使う

2.GetWindowLong関数(16ビットではGetWindowWord関数)を使う

3.WM_CREATEメッセージを捕まえて((LPCREATESTRUCT)lparam)->hInstanceを調べる

他にもあるのかもしれませんが、筆者はこの3つしか知りません。

さて、肝心のダイアログプロシージャ部分の解説をしましょう。

LRESULT CALLBACK DlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: getDlg(hDlgWnd); EndDialog(hDlgWnd, IDOK); break; case IDCANCEL: EndDialog(hDlgWnd, IDCANCEL); break; default: return FALSE; } break; case WM_INITDIALOG: SetWinCenter(hDlgWnd); initDlg(hDlgWnd); break; case WM_HSCROLL: switch(LOWORD(wp)) { case SB_LINELEFT: ScrPos--; break; case SB_LINERIGHT: ScrPos++; break; case SB_PAGELEFT: ScrPos -= 10; break; case SB_PAGERIGHT: ScrPos += 10; break; case SB_THUMBTRACK: ScrPos =(int)(HIWORD(wp)); break; } ShowScroll(hDlgWnd); break; default: return FALSE; } return TRUE; }

ダイアローグプロシージャのなかでは、大きくWM_COMMAND, WM_INITDIALOG, WM_HSCROLLメッセージを捕まえなくてはいけません。

WM_COMMANDメッセージを捕まえたら、WPARAMの下位ワード値を 調べ押されたボタンの種類を決め、ダイアログボックスを終了させます。 この時、OKボタンが押されたならばダイアログボックスに 入力された情報を取得します。この情報取得をそのまま書いてしまうと 長ったらしくなるのでここでは、getDlg関数という自作の関数を 使うことにしました。キャンセルボタンが押されたときは 何もせずに、ダイアログボックスを終了させます。

次に、WM_INITDIALOGメッセージを捕まえたときは、 ダイアログボックスの初期化をします。具体的には ダイアログボックスが出現して、まだユーザーが何も入力していない 時にコンボ・ボックスとかエジットボックスに書かれている 文字列などを表示します。ここでも、長くなるのでinitDlgという 自作の関数を使うことにしました。

WM_HSCROLLメッセージは、ユーザーが水平スクロールバーを クリックしたときに送られてきます。これを捕まえたら、 WPARAMの下位ワード値を調べて、水平スクロールバーの どの部分がクリックされたのかを知ります。そしてそれにあった 動作をさせます。具体的には、左右のスクロールボタンなのか、 スクロールつまみなのか、はたまたスクロールボタンとつまみの間 なのかです。スクロールボタンならば位置を1つだけ動かし、スクロール つまみならば、今度はwpの高位ワード値を調べます (これがスクロール位置となります)。そして、スクロールボタンと つまみの間がクリックされたら位置を10移動させます。 そして、1回のクリックでスクロール位置が決まったらそのように つまみの位置やら、関連の動作をさせます。これも長くなるので ShowScrollという自作関数を使うことにしました。

と、まあこんな所です。

まとめると、

ダイアログプロシージャでは 1.WM_COMMANDメッセージを捕まえる   押されたボタンの種類を知る   OKボタンなら、ダイアログボックスに入力された   情報を取得する 2.WM_INITDIALOGメッセージを捕まえる   捕まえたらダイアログボックスの初期化をする   (最初に表示される文字列など) 3.WM_HSCROLL(WM_VSCROLL)メッセージを捕まえる   捕まえたら、クリックされたボタン等を調べる   それぞれに応じた処理をする

さて、それぞれの処理の具体的方法は次章で解説します。


[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Apr/16/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。