マウスメッセージについて – プログラミング – Home

マウスメッセージについて
 
通知
すべてクリア

[解決済] マウスメッセージについて


佐藤
 佐藤
(@佐藤)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

WIN-NT VC++6.0 MFC MSFlexGrid使用

マウスのダブルクリックでCEllの編集に入り隠れEditBoxにフォーカスを移します。
EditBox上でマウスをクリックしてカーソル位置を変えようとすると
KILLFOCUSメッセージを受信してしまいます。
誰がKILLFOCUSを出すのか分かりません。
kiLLFOCUSは他のCELLをクリックした場合のみ受信するようにしたいのですが
うまく出来ないでいます。
(1)MSFlexGridを使用する場合、マウスの処理はフォーカスが当たったCEllの隠れEditBoxで
すべて行ってくれると思っていますがどうでしょうか?ご意見をお聞かせ下さい。
(2)又、マウスのクリックされた位置がEditBoxの範囲内に有るかどうかはどのAPI関数を
使うのでしょうか?
よろしくお願いします。


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

実際に表示を切り替えているコードを提示した方がいいと思います。
この内容から状況を想像するよりその方が早いでしょう。

ただ、起こっている現象だけを見ると実際にEditコントロールが
MSFlexGridよりも前にあるようには思えないのですけれど。
Grid側の再描画を止めてEditコントロールを再描画すると
Zオーダー的にはGridの後ろにあるのに画面上は表にあるように
表示されてしまうような気がします。
Editコントロールを可視にするときにZオーダーがGridよりも前に
くるように指定しなおしてはどうでしょう。
Editコントロールの親をGridにしてやるとこの辺がうまく行くように
なるかもしれません。

いずれにせよ、ZオーダーでEditコントロールが前にあるのであれば、
マウスの処理はEditコントロールにいくと思います。


返信引用
佐藤
 佐藤
(@佐藤)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

PATIO さんありがとうございます。

初めてMSFlexGridを使用する検討違いなことをいうかもしれませんがよろしくお願いします。
(1)現象をSPY++で見直したところ、ダブルクリックでEditBoxにフォーカスが移動した後、
始めのクリックでは正しくクリック位置にキャレットを表示します。
(EN_KILLFOCUSは出ていません)、2回目のクリックでEN_KILLFOCUSを受け取っています。
(2)切り替え部のコード ダブルクリック受信時
// エディットボックスをCELL位置に移動。
Edit->MoveWindow(rcCell.left - 1, rcCell.top - 1, rcCell.right + 2,
rcCell.bottom + 2, TRUE );
// エディットボックスにCELLのテキストをコピー
Edit->SetWindowText( buff );
// エディットボックスを表示
Edit->ShowWindow( SW_SHOWNA );
// エディットボックスにフォーカスを移動
Edit->SetFocus();
Edit->SetCapture(); //マウスイベントをとるため
return;
// 以上


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

画面上の見え方と言うのは、描画のタイミング等でどうにでもなります。
実際に問題になるのは、GridコントロールとEditコントロールのどちらのウインドウが
前に来ているかです。

Gridコントロールの再描画を止めてEditコントロールを可視にした場合、
見た目だけだとEditコントロールがGridコントロールの前に来ているように見えますが、
ウインドウのZ方向の位置関係は変わっ
ていないのでウインドウとしてはGridコントロールが
前に来ていると言う事もありえます。
あなたのコードを見る限りでは、Editコントロールを最前面に持ってくるコードが
入っていませんから、GridコントロールがEditコントロールの前にある状態では、
Gridコントロールの方が前にある状態が続いていると思います。

この状態でマウスをクリックしてもウインドウとしてはGridコントロールが前にあるので
Grid側にマウスイベントが行きます。当然、フォーカスもGrid側に移ります。

ウインドウのZ方向の位置関係と可視/不可視、フォーカスの有無は別の問題です。
それぞれを適切に設定しないと想定する状態にする事は出来ないはずです。

ちなみにMSFlexGridだからとかいう問題ではありません。
これ以外のコントロールを使う場合でも扱いは全く同じです。


返信引用
佐藤
 佐藤
(@佐藤)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

PATIOさん 有益なご助言ありがとうございます。
おかげさまで解決できました。

ご指摘の通りEditBoxのZ方向の位置がGridの後になってました。
ShowWindow()で上位にあるものと思ってました。
SetWindowPos(&wndTop,,,,)で上位にしたところ正しく動くようになりました。
MSFlexGridでのデータ入力には
ダブルクリックによってEditBoxを前面に出して入力する場合と、
クリック後に入力する場合があることがわかりました。
ダブルクリックの場合はSetWindowPos(&wndTop,,,,)を実行し、
クリックの場合は今までの方式を採用しています。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました