モーダルで親ダイアログをクリックしたときの挙動

管理人のタツです。

仕事中、詰まってた処理があったのですが、
解決方法が分かったので備忘録というかなんというか。

困ったこと

ダイアログでボタンを押下して、子ダイアログを出現させます。

その時、親ダイアログをクリックするとこんな感じになってほしかったのです。

わかりにくいかもしれませんが、
子ダイアログがチカチカしてますよね。
後、警告音もなっています。

モーダルダイアログなので当然親ダイアログは操作できないのですが、
このチカチカ&警告音を出したかった。

なのに2つとも生じなかった。

親ダイアログが操作できないことに変わりはないのですが。

昔の人が作ったダイアログではすべてこのチカチカが出てくるのに、
なぜか今回自分が作ったダイアログでは出てこなかった。

これは正直重要な処理ではないので、後回し。
最終的にこのままでもいいのですが、何とかしたい。

ってことを2週間くらい、考えていました。

で、やっと解決方法が出てきました。

そんなことだったんかー(;´・ω・)

結論

基底クラスの選択が間違えてた。

〇 CDialog
× CDialogEx

実験

VisualStudio2022で試してみます。

プロジェクト作成。

名前はModalBehaviorにしておきます。

アプリケーションの種類を「ダイアログベース」にします。

準備完了!

今回、新しい子ダイアログを表示させるので、
まずはそれを呼ぶボタンを追加します。

IDはそれぞれIDC_BUTTON1、IDC_BUTTON2です。
今回は初期表示のままにしています。

ちょっとだけレイアウト変えておきます。

なんかもっと、専門的な用語使えや、って感じですけど、
これの名称が分からない(;´・ω・)
とりあえずこれで許してください。

二つボタンを用意したので、それぞれダブルクリックして、
ModalBehaviorDlg.cppに処理を追加させておきます。
(ダブルクリックで自動的に処理追加されます)

続いて、子ダイアログを作ります。

リソースビューからDialogを選択し、右クリック。
リソースの追加をします。

新規追加後、新しいダイアログがリソースに追加されます。

プロパティで、ID名を変更しておきます。

これは「チカチカしない」ほうなので、IDD_DIALOG_Exとしておきます。

後、こんなに大きさいらないので適当に縮めておきます。
ここら辺は匙加減です。
気にならない人は飛ばしてもいいかも。

で、ダイアログにある「OKボタン」をダブルクリック。

新しいクラスの作成画面が出てくるので、適当に名前つけました。

基底クラスは「CDialogEx」です。多分初期表示では?

CJikken1クラスが作られました。
これはもうやることないので、次に行きます。

同じ要領で、もう一つダイアログを作ります。

追加して
ID名変えて
OKボタンをしてクラス追加画面

はい、ここでストップ。

基底クラスをCDialogにします。

違いはここだけです。

後は最後に、rcファイル開いて適当にサイズ調整やキャプションを付けておきます。

最後にModalBehaviorDlg.cppに戻って、作成したヘッダーを2つインクルードします。

最初にのボタン押下時の処理で、コンストラクタ&DoModal処理を書いて、
先の子ダイアログ共を呼びます。

はい、ビルド。

できました。

左のチカチカしないボタンを押下すると

こいつが出てきます。
後ろの親ダイアログをクリックしてもうんともすんとも言いません。

対して、右のチカチカするボタンを押下すると

一番最初にお見せした通りのチカチカ&警告音が確認されます。

おしまい( ˘ω˘ )

終わりに

なんで詰まったかって、新しいクラスを作るときの、基底クラスがCDialogExだったんですよね。
そこを変更せずにダイアログを作ったせいで、チカチカしない設計になってました。

だから、チカチカって正式名称なんて言ったらいいんですかね(;´・ω・)

全く別の話ですが、
今回動画載せるために初めてWondershare使いました。
昔たまに、Win+Gで画面録画撮ってたんですが、あれってフルスクリーンって撮れなかったんですね。
初めて知りました。

Win+Gであの現象を撮ろうとすると、
親ダイアログのみ録画されて肝心の子ダイアログが録画されてないので少し困ってました。

こういう、自作アプリの挙動をブログに載せる方たちって、どういう風に録画してんだろ?

コメント

タイトルとURLをコピーしました