• ベストアンサー
  • すぐに回答を!

モーダル画面の親をクリック時にタイトルバーが点滅

  • 質問No.637841
  • 閲覧数1625
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 0% (0/4)

環境:Win2000/VC6/MFC

ある画面(親画面)から別の画面(子画面)を
モーダルで表示します。
子画面が表示した状態で、親画面をクリックした時、
子画面のタイトルバーが青色(アクティブ)と
灰色(非アクティブ)を数回繰り返し、点滅します。
点滅後は、青色(アクティブ)に戻ります。

この時、灰色にならないようにする方法を教えて下さい。

質問者が選んだベストアンサー

  • 回答No.4
  • ベストアンサー

ベストアンサー率 65% (1020/1553)

解決されたということなので、一応、参考までに

>・子画面のClassWizardには、WM_NCACTIVATEメッセージは存在しないため、

クラスで使用可能なメッセージ用フィルタをウィンドウに変更すれば出てきますよ。


>子画面で、WM_NCACTIVATEメッセージ受信時の処理を
>追加し、アクティブでなくなった時に、
>アクティブに変更するよう、以下の対応を行いました。

確かに親をアクティブにしようとしたときの点滅はなくなりますが、
他のアプリがアクティブになったときでも
モーダルウィンドウがアクティブの色のままになりません?

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 65% (1020/1553)

どうも、内部的にはFlashWindowExが呼び出されてる感じですね。
このときにも0x0118がきてますし。

なんで、このメッセージをどうにかして対処するというのは無理そうですね。

プログラム的に何とかするには、モーダルウィンドウが
表示されている間にロックされているウィンドウが
クリックされたら、そのマウスメッセージを破棄する
しかなさげですねぇ。

FlashWindowExをコールさせないようにということで。
補足コメント
ryo_oji

お礼率 0% (0/4)

自己レスです。

以下の方法で、ほぼ、点滅は、なくなりました。


子画面で、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);
> }


早いマシンだと、ちらつきが発生しますが、
グレーの表示が見えるほどには、なりません。

上記、対応で解決しました(?)
ありがとう、ございます。
投稿日時:2003/08/27 18:38
  • 回答No.2

ベストアンサー率 65% (1020/1553)

>問題のタイミングで、メッセージ0x118(意味不明)が
>届いています。

ほー、そうなんですか。


>1度、このメッセージの時に、
>return FALSE;
>で強制終了させたところ、
>タイトルバーが灰色になったままで、
>青色に戻りませんでした。

これはどういうコードを書かれたんですか?
CWnd::Default()をオーバーライドしたんですか?

調査された結果から考えると、PreTranslateMessageで
該当メッセージのときにTRUEを返せばいいように思いますが、どうでしょう?
補足コメント
ryo_oji

お礼率 0% (0/4)

>>1度、このメッセージの時に、
>>return FALSE;
>>で強制終了させたところ、
>>タイトルバーが灰色になったままで、
>>青色に戻りませんでした。
>
>これはどういうコードを書かれたんですか?
>CWnd::Default()をオーバーライドしたんですか?

PreTranslateMessageにて
if (pMsg->message == 0x118)
return FALSE;
を追加しました。


>調査された結果から考えると、
>PreTranslateMessageで
>該当メッセージのときにTRUEを返せばいいように思い
>ますが、どうでしょう?

やってみました。
結果としては、クリック毎に、灰色と青色の
繰り返しになりました。
投稿日時:2003/08/27 09:18
  • 回答No.1

ベストアンサー率 65% (1020/1553)

Windows2000以降のOSの仕様じゃないんですかねぇ?

もしかしたら、レジストリいじったりすれば平気かもしれませんが。
補足コメント
ryo_oji

お礼率 0% (0/4)

どうしても、プログラムとして対応したいのです。

調査しましたが、
CWnd::PreTranslateMessage には、
問題のタイミングで、メッセージ0x118(意味不明)が
届いています。

1度、このメッセージの時に、
return FALSE;
で強制終了させたところ、
タイトルバーが灰色になったままで、
青色に戻りませんでした。

何か、ご存知の方は、いらっしゃらないでしょうか?
投稿日時:2003/08/26 16:41
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

ピックアップ

ページ先頭へ