機能限定のウィンドウをつくる(DialogBox MessageBox)


POINT Window Program は Window と Proc のペアでひとつ これを簡単に提供するのが DialogBox, MessageBox 機能が限定された Window のこと
Application ----------------------------------------- DialogBox DlgProc() ----------------------------------------- | MessageLoop -- // メッセージループはシステムが行う。 Windows -----------------------------------------
SYNTAX int DialogBox ( DialogBox() 作成時に Proc Address を登録する ) DialogBox() の構造 Windows は 複数の Proc Address をもつ. Message を送信する Window から Proc を選ぶ. DialogBox の RetVal は Windows が処理する. ( App にはかえらない ) -> Message を処理しない場合は, false を返してね -> 終わるわけではない -> false == [ Message 無視 ]といいかえよう. Windows が DialogBox の MessageLoop を管理する. -> 別に Menu から呼ばないといけないわけではない. DialogBox() は制御がかえらない IDCANCEL は固定値 ? -> [X] を押すと WM_CLOSE が送信. 無視すると, WM_COMMAND + IDCANCEL が送信. DialogBox(); は内部で次のような処理をする. CreateWindowEx(); WM_SETFONT, WM_INITDIALOG,


MessageBox


DESC window の生成なしで, Dialog の生成が可能 POINT MessageBox は DialogBox よりもさらに簡略化した Window Callback してもらう関数を登録することもできないため ボタンを押した結果をもらうという決められた操作に限定される。 SYNTAX int MessageBox( HWND hWnd , // 親ウィンドウ LPCTSTR lpText , // メッセージ LPCTSTR lpCaption , UINT uType ); POINT ARG1 は 制御をとめたい Window に利用できる。 RET 押されたボタン表す整数 IDYES | IDNO | IDOK | IDRETRY | IDIGNORE | IDCANCEL | IDABORT
MessageBox( NULL, "message", "title", MB_OK );
// 次のように切り替える # ifdef UNICODE # define wsprintf wsprintfW # else # define wsprintf wsprintfA # endif // !UNICODE Win32 が Unicode の関係で、ANSI C 標準の文字列関数を使用できない( 移植が難しくなる ) LPTSTR lstrcat( LPTSTR lpString1, LPCTSTR lpString2 ); int lstrlen( LPCTSTR lpString ) UNICODE 設定にすると文字化けしてしまうな - ( しかし 切り替えは動作する ) 日本語を表示する project file を開けば 設定を見ることができる LPTSTR GetCommandLine(VOID); からも取得可能 ------------------------------------------------------- Application MessageBox() ------------------------------------------------------- Windows MessageLoop WindowProc( 用意すみの Proc が利用される ) | | | | --- Window から Proc を選択 --- -------------------------------------------------------


DialogBox( Modeless ) は MessageQ に送られるので 自分で Dialog 用か判定する


Dispatch とは Windows からの Message を 対応する Control にお届すること. IsDialogMessage() は 実は tag 移動の際の対象になるだけ. -> MouseEvent とかは関係ないので, あってもなくても OK Tread を利用して 複数の MessageBox を呼んでも動くようにする。 MB_APPLMODAL : MessageBox に応答しないと, hWnd 指定の Window で作業できない -> default : ->


Resource を利用する


Dialog の 指定数値は Font のサイズで決まる Dialog には ToolBox から Control をはりつけること可能 Control は [ ChildWindow ] Shift + F7 で Control の大きさを 文字列にあわせること可能 Dialog を[ 破棄 ]する EndDialog( HWND, INT_PTR ); // ARG2 は適当な値で OK TIP DialogProc でしか利用しない WARNING DefWindowProc を利用禁止


ModeLessDialog(CreateDialog() <-> DialogBox() )


DESC ResourceScript は ModelDialog と同じ内容でよい。 CreateDialog(); DestroyWindow(); MessageLoop::isDialogMessage();