- ベストアンサー
モーダル画面の親をクリック時にタイトルバーが点滅
環境:Win2000/VC6/MFC ある画面(親画面)から別の画面(子画面)を モーダルで表示します。 子画面が表示した状態で、親画面をクリックした時、 子画面のタイトルバーが青色(アクティブ)と 灰色(非アクティブ)を数回繰り返し、点滅します。 点滅後は、青色(アクティブ)に戻ります。 この時、灰色にならないようにする方法を教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
解決されたということなので、一応、参考までに >・子画面のClassWizardには、WM_NCACTIVATEメッセージは存在しないため、 クラスで使用可能なメッセージ用フィルタをウィンドウに変更すれば出てきますよ。 >子画面で、WM_NCACTIVATEメッセージ受信時の処理を >追加し、アクティブでなくなった時に、 >アクティブに変更するよう、以下の対応を行いました。 確かに親をアクティブにしようとしたときの点滅はなくなりますが、 他のアプリがアクティブになったときでも モーダルウィンドウがアクティブの色のままになりません?
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
どうも、内部的にはFlashWindowExが呼び出されてる感じですね。 このときにも0x0118がきてますし。 なんで、このメッセージをどうにかして対処するというのは無理そうですね。 プログラム的に何とかするには、モーダルウィンドウが 表示されている間にロックされているウィンドウが クリックされたら、そのマウスメッセージを破棄する しかなさげですねぇ。 FlashWindowExをコールさせないようにということで。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>問題のタイミングで、メッセージ0x118(意味不明)が >届いています。 ほー、そうなんですか。 >1度、このメッセージの時に、 >return FALSE; >で強制終了させたところ、 >タイトルバーが灰色になったままで、 >青色に戻りませんでした。 これはどういうコードを書かれたんですか? CWnd::Default()をオーバーライドしたんですか? 調査された結果から考えると、PreTranslateMessageで 該当メッセージのときにTRUEを返せばいいように思いますが、どうでしょう?
補足
>>1度、このメッセージの時に、 >>return FALSE; >>で強制終了させたところ、 >>タイトルバーが灰色になったままで、 >>青色に戻りませんでした。 > >これはどういうコードを書かれたんですか? >CWnd::Default()をオーバーライドしたんですか? PreTranslateMessageにて if (pMsg->message == 0x118) return FALSE; を追加しました。 >調査された結果から考えると、 >PreTranslateMessageで >該当メッセージのときにTRUEを返せばいいように思い >ますが、どうでしょう? やってみました。 結果としては、クリック毎に、灰色と青色の 繰り返しになりました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
Windows2000以降のOSの仕様じゃないんですかねぇ? もしかしたら、レジストリいじったりすれば平気かもしれませんが。
補足
どうしても、プログラムとして対応したいのです。 調査しましたが、 CWnd::PreTranslateMessage には、 問題のタイミングで、メッセージ0x118(意味不明)が 届いています。 1度、このメッセージの時に、 return FALSE; で強制終了させたところ、 タイトルバーが灰色になったままで、 青色に戻りませんでした。 何か、ご存知の方は、いらっしゃらないでしょうか?
補足
自己レスです。 以下の方法で、ほぼ、点滅は、なくなりました。 子画面で、WM_NCACTIVATEメッセージ受信時の処理を 追加し、アクティブでなくなった時に、 アクティブに変更するよう、以下の対応を行いました。 ・子画面のClassWizardには、WM_NCACTIVATEメッセージは存在しないため、 手動で、OnNcActivate関数を追加しました。 参考:http://www5d.biglobe.ne.jp/~satis/document/MFC100/008.html ・子画面のOnNcActivate内にて、 アクティブでなくなった時に、自分自身へ PostMessage( WM_NCACTIVATE, TRUE, 0 ); を送信しました。(以下、参照) > BOOL C子画面Dlog::OnNcActivate(BOOL bActive) > { > if ( !bActive ) { > PostMessage( WM_NCACTIVATE, TRUE, 0 ); > } > > return CDialog::OnNcActivate(bActive); > } 早いマシンだと、ちらつきが発生しますが、 グレーの表示が見えるほどには、なりません。 上記、対応で解決しました(?) ありがとう、ございます。