回答編集履歴

4

まとめに編集しなおした

2019/02/19 16:57

投稿

atata0319
atata0319

スコア881

test CHANGED
@@ -50,4 +50,10 @@
50
50
 
51
51
 
52
52
 
53
- #結果して手持ちのソフトではメニューからモーダルダイアログが開くソフトはありませんでした。すべてのソフトはモードレスダイアログを開いていました。
53
+ #
54
+
55
+ 結果として手持ちのソフトではメニューから直接モーダルダイアログが開くソフトはありませんでした。すべてのソフトはモードレスダイアログを開いています。とは言いつつも各ソフトウェアの機能としてモーダルダイアログを表示できるソフトウェアは存在しており、モーダルダイアログ表示中にタスクバーからメニューを開いた際の動作はソフトウェア次第という感じですね。多重起動を防止するだけであれば、真ん中の Steam の動作が比較的近いと思いますが、これはモーダルダイアログ用のメッセージループを別途管理しているということであり、標準の MessageBox 等では処理できません。(もしくはフックで処理しているか)
56
+
57
+
58
+
59
+ 私のおすすめとしてはやはりモーダルダイアログ表示前にフラグを立てて、モーダルダイアログが閉じられた後にはフラグを落とす。メニューはフラグに応じて処理を決定するってのが良いと思いました。

3

結論を追記

2019/02/19 16:57

投稿

atata0319
atata0319

スコア881

test CHANGED
File without changes

2

結論を追記

2019/02/19 16:43

投稿

atata0319
atata0319

スコア881

test CHANGED
@@ -47,3 +47,7 @@
47
47
  ![JoyToKey](989e6c5bb4d8ec61602f0327acad6498.png)
48
48
 
49
49
  終了メニューを選択するとそのままモーダルダイアログごとプロセスが終了します。なお、標準の DialogBox/MessageBox 系 API を使うと PostQuitMessage で投げた WM_QUIT がダイアログボックス側のメッセージループに食われる問題は発生しません。モーダルダイアログのメッセージループを自分で作成したりする複雑なアプリケーションでは上記の問題に遭遇したりします。このソフトは素直な作りになっていると推測されます。
50
+
51
+
52
+
53
+ #結果として手持ちのソフトではメニューからモーダルダイアログが開くソフトはありませんでした。すべてのソフトはモードレスダイアログを開いていました。

1

他のソフトウェアを調査した結果を追記

2019/02/19 16:43

投稿

atata0319
atata0319

スコア881

test CHANGED
@@ -7,3 +7,43 @@
7
7
 
8
8
 
9
9
  モーダルダイアログが表示されるとメッセージループがダイアログ側で処理されるようになり、WinMain側のメッセージループが使われなくなります。いろいろなフレームワークはそれをメインのメッセージループに組み込むようにいろいろ努力していますが・・・。結局のところウィンドウプロシージャだけでモーダルダイアログ表示中かの条件判断を実施せざるを得なくなるためフラグ制御が最も実装コストが低いという結果になります。
10
+
11
+
12
+
13
+ ---
14
+
15
+ 2019/02/20 追記
16
+
17
+
18
+
19
+ 面白そうなので、市販ソフトがどのような制御をしているか調べてみました。とは言っても手持ちのソフトですが。
20
+
21
+
22
+
23
+ # Becky!
24
+
25
+ このソフトではモーダル表示時は終了メニューだけ無効化されています。
26
+
27
+ ![Becky!](eb8248f88903b918796eeaafc2878663.png)
28
+
29
+ 無効化されていないメニューはそのまま使えます。使い勝手を落とさずに矛盾した動作を防ぐなかなか賢い対応と思いますね。フラグ制御とか上で言っているものに近いと推測されます。
30
+
31
+
32
+
33
+ # Steam
34
+
35
+ 画像からはわかりませんが、ポップアップメニューがモーダル表示されてメニューを選択することができません。
36
+
37
+ ![Steam](c700dca244d9bb1399bd469cd65045d9.png)
38
+
39
+ かなり面白い実装になってそうな気配があります。おそらくメッセージループを停止(モーダルダイアログ以外のメッセージをディスパッチしない)しているものと推測されます。ATL/WTL の実装に近いですね。
40
+
41
+
42
+
43
+ # JoyToKey
44
+
45
+ 画像からはわかりませんが、このソフトはモーダル表示中もそのまま操作可能です。
46
+
47
+ ![JoyToKey](989e6c5bb4d8ec61602f0327acad6498.png)
48
+
49
+ 終了メニューを選択するとそのままモーダルダイアログごとプロセスが終了します。なお、標準の DialogBox/MessageBox 系 API を使うと PostQuitMessage で投げた WM_QUIT がダイアログボックス側のメッセージループに食われる問題は発生しません。モーダルダイアログのメッセージループを自分で作成したりする複雑なアプリケーションでは上記の問題に遭遇したりします。このソフトは素直な作りになっていると推測されます。