の部分ですが、以前作ったプログラムでは、DialogBox関数の 第1引数はWinMain関数の第1引数をグローバル変数にコピーしておいて これを利用しました。ここでは、GetWindowLong関数を用いてインスタンス ハンドルを取得しています。ただしこれは32ビット版 の話です。case IDM_DLG: hIns = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); DialogBox(hIns, "MYDIALOG", hWnd, (DLGPROC)DlgProc); InvalidateRect(hWnd, NULL, TRUE); break;
nIndexの所をいろいろ変えてやることにより、ウィンドウのいろいろな 情報を取得することができます。インスタンスハンドルを取得するには GWL_HINSTANCEにすればよいのです。「GWL_何とか」というパターンです。 GWLというのはGetWindowLongの大文字の所を取ったものです。(と、筆者は思っています)LONG GetWindowLong( HWND hWnd, // handle of window int nIndex // offset of value to retrieve );
16ビット版では
を使います。GetWindowWord(hWnd, GWW_HINSTANCE);というような 感じで使います。WORD GetWindowWord(hwnd, nOffset) HWND hwnd; int nOffset;
さて、インスタンスハンドルの取得方法はもう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つ紹介しました。 まとめると、
他にもあるのかもしれませんが、筆者はこの3つしか知りません。1.WinMain関数の第1引数をグローバル変数にコピーして使う
2.GetWindowLong関数(16ビットではGetWindowWord関数)を使う
3.WM_CREATEメッセージを捕まえて((LPCREATESTRUCT)lparam)->hInstanceを調べる
さて、肝心のダイアログプロシージャ部分の解説をしましょう。
ダイアローグプロシージャのなかでは、大きくWM_COMMAND, WM_INITDIALOG, WM_HSCROLLメッセージを捕まえなくてはいけません。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メッセージを捕まえたら、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