- ベストアンサー
OnPaint() とOnNcPaint()
環境 WIN98 VC++6.0 MFC メインウィンドウの子として作成したウィンドウにおいて OnPaint()内でメンバ変数を以下のように変更しました。 void CMyWnd::OnPaint() { aaa=99; ところが、OnNcPaint()内ではaaaが99になってません どうしてなのでしょうか? void CMyWnd::OnNcPaint() { aaa; //ここでは99になってない とOnNcPaint()
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>てっきりこうだと思っていたのですが。。。 >OnNcPaint >OnPaint >OnNcPaint >OnPaint http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_getmessage.asp GetMessageの処理順序ですね。 メッセージキューはウィンドウ毎に1つではなく、スレッドごとに1つなのでWM_NCPAINTのほうが優先されます。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>>1.どのように確認したんですか? > >またまた怒られそうですがメッセージボックスを表示させて確認しました。 >デバッグして確認しました。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsdebug/html/_core_the_trace_macro.asp MFCなんですからTRACEマクロを使用しましょう。 描画関連とフォーカスが絡む場合は、メッセージボックスやデバッガでのブレイクポイントやステップ実行は禁物です。
お礼
回答ありがとうございます。 TRACEマクロを使ってみました。 ウィンドウを2つ描画する場合、次のようにメッセージが飛んでました。 OnNcPaint OnNcPaint OnPaint OnPaint てっきりこうだと思っていたのですが。。。 OnNcPaint OnPaint OnNcPaint OnPaint
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ところが、OnNcPaint()内ではaaaが99になってません >>OnPaint()が呼ばれてないだけでは? >呼ばれていることは確認済です。 1.どのように確認したんですか? 2.確認しているCMyWndのインスタンスは一緒ですか? ・・・具体的にはOnPaintが呼ばれたときのthisとOnNcPaintが呼ばれたときのthisが同一かということ 3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか?
お礼
回答ありがとう御座います。 >1.どのように確認したんですか? またまた怒られそうですがメッセージボックスを表示させて確認しました。 >3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか? そう思いましたが、上記の方法では、クライアント領域が描画された状態でメッセージボックスが出て止まり、その時にはまだ非クライアント領域が描画されていないのでOnNcPaintが後かなと判断しました。 その後の調査にて >1.どのように確認したんですか? デバッグして確認しました。 >3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか? デバッグでOnNcPaint内で止めると、今度は非クライアント領域が先に描画されたので、 そうだと思います。 よって、以下のようにOnNcPaintにて代入することで解決しました。 void CMyWnd::OnPaint() { aaa; //ここで99になっている void CMyWnd::OnNcPaint() { aaa=99;
- taka_tetsu
- ベストアンサー率65% (1020/1553)
OnPaint()が呼ばれてないだけでは? メインウィンドウってことはフレームですよね。 非表示だったりクライアント領域に描画されるものがなければOnPaintは呼ばれませんけど。
お礼
回答ありがとう御座います。 >OnPaint()が呼ばれてないだけでは? 呼ばれていることは確認済です。 >メインウィンドウってことはフレームですよね。 いいえ。 メインウィンドウではなく、メインウィンドウの子ウィンドウです。
お礼
回答ありがとうございます。