プロが教える店舗&オフィスのセキュリティ対策術

環境:Win2000/VC6/MFC

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

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

A 回答 (4件)

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



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

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


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

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

どうも、内部的にはFlashWindowExが呼び出されてる感じですね。


このときにも0x0118がきてますし。

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

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

FlashWindowExをコールさせないようにということで。

この回答への補足

自己レスです。

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


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

・子画面のClassWizardには、WM_NCACTIVATEメッセージは存在しないため、
手動で、OnNcActivate関数を追加しました。
参考:http://www5d.biglobe.ne.jp/~satis/document/MFC10 …

・子画面の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
    • good
    • 0

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


>届いています。

ほー、そうなんですか。


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

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

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

この回答への補足

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

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


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

やってみました。
結果としては、クリック毎に、灰色と青色の
繰り返しになりました。

補足日時:2003/08/27 09:18
    • good
    • 0

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



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

この回答への補足

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

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

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

何か、ご存知の方は、いらっしゃらないでしょうか?

補足日時:2003/08/26 16:41
    • good
    • 0

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