回答編集履歴
2
回答を追記
test
CHANGED
@@ -47,3 +47,33 @@
|
|
47
47
|
|
48
48
|
|
49
49
|
これは API 等で提供されるものではありません。ReactOS がそうなっているように選択中の文字列を選択中であることを示すために描画する必要があります。ゲームの場合、手抜きしてマウス選択は受け付けないとかはありかと思いますが、通常のコントロールではマウスでの選択とキーボード操作の両方を処理するため、けっこうめんどくさい処理になります。なお、標準の Edit Control ですらダブルクリックで単語選択等を実装しているので、動作を近づけようとすると ReactOS の内容のままになると思います。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
---
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
(2019/03/30 追記)
|
58
|
+
|
59
|
+
> 軽く書いてみたのですがWM_SETFOCUSはウィンドウをクリックしたら飛ぶものではないのですか?WM_LBUTTONDOWNでSetFocusしたら上手くいきましたが
|
60
|
+
|
61
|
+
アクティブとフォーカスは別ということですか?
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
Windows においてはアクティブ(ウィンドウ)とフォーカス(が設定されたウィンドウ)は意味が異なります。アクティブウィンドウはトップレベルウィンドウのうち選択されているものを指します。フォーカスはすべてのウィンドウのうちキーボードメッセージを受け取る対象のウィンドウのことを指します。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
結論から言うと ReactOS のソースがそうなっているように子ウィンドウでは WM_LBUTTONDOWN 等のマウスメッセージで SetFocus を呼び出す必要があります。WM_LBUTTONDOWN 以外では WM_MOUSEACTIVATE で SetFocus することも可能ですが、これはあまりお勧めしません。
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
以下余談ですが、トップレベルウィンドウでは WM_MOUSEACTIVATE を DefWindowProc に渡すと自動的にフォーカスが設定されるため、子ウィンドウの処理とは異なるアプローチが可能です。逆に子ウィンドウ側で WM_MOUSEACTIVATE を処理するようにするとトップレベルウィンドウがアクティブ化する時の挙動がおかしくなります。ReactOS のソースでは Edit Control をトップレベルウィンドウにした場合、WM_MOUSEACTIVATE でフォーカスが設定されるため、フォーカスが当たっていない場合のみ SetFocus を呼び出すようになっているものと推測されます。
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
なお、以下のマイクロソフトのページの下の方に Edit Control で処理するメッセージについて記載がありますが、どのタイミングで SetFocus を呼び出しているかについては言及されていません。が、WM_MOUSEACTIVATE を処理していない以上、WM_LBUTTONDOWN で処理していると推測するしかない感じですね。
|
78
|
+
|
79
|
+
[https://docs.microsoft.com/en-us/windows/desktop/controls/about-edit-controls](https://docs.microsoft.com/en-us/windows/desktop/controls/about-edit-controls)
|
1
誤字の修正
test
CHANGED
@@ -46,4 +46,4 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
これは API 等で
|
49
|
+
これは API 等で提供されるものではありません。ReactOS がそうなっているように選択中の文字列を選択中であることを示すために描画する必要があります。ゲームの場合、手抜きしてマウス選択は受け付けないとかはありかと思いますが、通常のコントロールではマウスでの選択とキーボード操作の両方を処理するため、けっこうめんどくさい処理になります。なお、標準の Edit Control ですらダブルクリックで単語選択等を実装しているので、動作を近づけようとすると ReactOS の内容のままになると思います。
|