電子書籍の厳選無料作品が豊富!

VC++(6.0)/MFCにてアプリを開発しています。
メイン画面上にリストボックス・リストビュー・ボタンの各コントロールを配置し、
ユーザがいつでも操作できるようになっています。
そこで、ユーザがリストボックス等をマウスにてスクロール中に、バックグラウンド
処理でモーダルダイアログを表示すると、マウスダウン中に突然フォーカスが失われ
るため操作中のコントロールに対しマウスアップメッセージが送信されずモーダルダ
イアログ側へフォーカスが強制的に移動してしまいます。
操作中のコントロールは、マウスアップイベントが送信されていないため、奇妙な動
きをするようになります。
この場合、画面上の全てのコントロールに適応可能な「フォーカスが失われたよ」的
な処理を実装したいのですが、どのようにすればよいのでしょうか。
現在は、コントロール単位でオーバーライドしてLostFocus等で処理しています。
よろしくお願いします。

A 回答 (1件)

参考にしてください。

あしからず

勘違いしている人が実に多いのでいつも驚きますが
まずSetFocus()等に関連する「フォーカス」とは
キーボードの入力権なのであって、そもそもマウスとは
関係ありません。マニュアルを確認してください。

マウスメッセージをロストするのは他のウインドウが
マウスをキャプチャしたり、アクティブになったり
するからであって、キーボードフォーカスを
失ったからではありません。従ってこの場合対処すべきメッセージは
WM_CAPTURECHANGEDやWM_ACTIVATEなのです。これらのハンドラで
処理の中止を行うと解決するかもしれません。

整理すると処理すべき、又は、いきなり失う可能性のある
エッセンシャルには、
1.キーボード入力権(キーボードフォーカス)
2.マウスメッセージ占有権(マウスキャプチャ)
3.前面占有権(アクティベート)
があるといえます。それぞれ得た場合と失った場合の処理が
必要な場合があると言えます。
    • good
    • 0
この回答へのお礼

Situgyosyaさん

勉強不足でした。
今まで無理矢理いろんなことをしていたことを後悔しています。
もう少し本筋を勉強しなおすようにします。

エッセンシャルについては大変参考になりました。
ありがとうございます。

お礼日時:2008/05/29 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!