掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ダイアログボックスをクラス化するさいプロシージャをメンバ化するには? (ID:72129)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
後藤さんが思い描いてる像が今一汲み取れなかったので、俺ならこうするかな?という例。 処理は *1 -> *5 の流れで進むつもり。コンパイル通したコードじゃないんで参考程度に。 class SuperDialog { const UINT id_; HWND wnd_; SuperDialog(UINT id) : id_(id), wnd_(NULL) {} INT_PTR ShowDialog(HWND parent) { return ::DialogBoxParam(instance, MAKEINTRESOURCE(id), parent, DefaultProc, this); // *2 }; static INT_PTR CALLBACK DefaultProc(wnd, msg, w, l) { SuperDialog* dlg = (SuperDialog*)::GetWindowLongPtr(wnd, GWLP_USERDATA); if (dlg != NULL) { return dlg->MyProc(msg, w, l); // *4 } else if (msg == WM_NCCREATE) { // *3(dialog って WM_NCCREATE 来たっけ?ダメな場合は WM_INITDIALOG 辺りで) dlg = (SuperDialog*)((CREATESTRUCT*)l)->lpCreateParams; ::SetWindowLongPtr(wnd, GWLP_USERDATA, dlg); dlg->wnd_ = wnd; } return FALSE; } virtual INT_PTR CALLBACK MyProc(msg, w, l) = 0; }; class MyDialog : public SuperDialog { MyDialog() : SuperDialog(IDD_MYDIALOG) {} INT_PTR CALLBACK MyProc(msg, w, l) { // *5 switch (msg) { // 以下に処理したいメッセージを追加してく case ...: return TRUE; } return FALSE; } }; void xxxxxxxx(HWND parent) { MyDialog dlg; dlg.ShowDialog(parent); // *1 }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.