• ベストアンサー

OnPaint() とOnNcPaint()

環境 WIN98 VC++6.0 MFC メインウィンドウの子として作成したウィンドウにおいて OnPaint()内でメンバ変数を以下のように変更しました。 void CMyWnd::OnPaint() {   aaa=99; ところが、OnNcPaint()内ではaaaが99になってません どうしてなのでしょうか? void CMyWnd::OnNcPaint() {   aaa;  //ここでは99になってない とOnNcPaint()

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.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のほうが優先されます。

VitaminBB
質問者

お礼

回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>>1.どのように確認したんですか? > >またまた怒られそうですがメッセージボックスを表示させて確認しました。 >デバッグして確認しました。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsdebug/html/_core_the_trace_macro.asp MFCなんですからTRACEマクロを使用しましょう。 描画関連とフォーカスが絡む場合は、メッセージボックスやデバッガでのブレイクポイントやステップ実行は禁物です。

VitaminBB
質問者

お礼

回答ありがとうございます。 TRACEマクロを使ってみました。 ウィンドウを2つ描画する場合、次のようにメッセージが飛んでました。 OnNcPaint OnNcPaint OnPaint OnPaint てっきりこうだと思っていたのですが。。。 OnNcPaint OnPaint OnNcPaint OnPaint

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>ところが、OnNcPaint()内ではaaaが99になってません >>OnPaint()が呼ばれてないだけでは? >呼ばれていることは確認済です。 1.どのように確認したんですか? 2.確認しているCMyWndのインスタンスは一緒ですか? ・・・具体的にはOnPaintが呼ばれたときのthisとOnNcPaintが呼ばれたときのthisが同一かということ 3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか?

VitaminBB
質問者

お礼

回答ありがとう御座います。 >1.どのように確認したんですか? またまた怒られそうですがメッセージボックスを表示させて確認しました。 >3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか? そう思いましたが、上記の方法では、クライアント領域が描画された状態でメッセージボックスが出て止まり、その時にはまだ非クライアント領域が描画されていないのでOnNcPaintが後かなと判断しました。 その後の調査にて >1.どのように確認したんですか? デバッグして確認しました。 >3.そもそもOnNcPaintが呼ばれるのが先のような気がするんですけど、そんなことないですか?  デバッグでOnNcPaint内で止めると、今度は非クライアント領域が先に描画されたので、  そうだと思います。 よって、以下のようにOnNcPaintにて代入することで解決しました。 void CMyWnd::OnPaint() {   aaa;   //ここで99になっている void CMyWnd::OnNcPaint() {   aaa=99; 

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

OnPaint()が呼ばれてないだけでは? メインウィンドウってことはフレームですよね。 非表示だったりクライアント領域に描画されるものがなければOnPaintは呼ばれませんけど。

VitaminBB
質問者

お礼

回答ありがとう御座います。 >OnPaint()が呼ばれてないだけでは? 呼ばれていることは確認済です。 >メインウィンドウってことはフレームですよね。 いいえ。 メインウィンドウではなく、メインウィンドウの子ウィンドウです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • dc.TextOut(0 ,0 , *str) ;について

    環境 WIN98 VC++6.0 MFC にて パターンBはOKですが、パターンAだと不正な処理で落ちてしまいます。 どうしてなのかお教えください。 void CFffView::OnPaint() { CPaintDC dc(this); //パターンA CString* str ; str = (CString*)("999"); dc.TextOut(0 ,0 , *str) ; //パターンB CString aaa ; aaa = (CString)("999"); dc.TextOut(0 ,0 , aaa) ; }

  • 変数の宣言場所について

    <環境> WIN98 VC++6.0 MFC  ダイアログベースにて 変数の宣言をグローバルにするとコンパイルはOKですが、 実行時にダウンしてしまいます。 グローバルに変えるだけでこのようなことがどうして起きるのでしょうか? CBitmap m_p[2];//エラー void CxxxDlg::OnPaint() { CBitmap m_p[2];//OK

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • LoadBitmapについて

    環境 WIN98 VC++6.0 MFC にて 下記のようにbmp.LoadBitmap(IDB_BITMAP1);を2度続けるとダウンしますがどうしてですか? void CAdvancedRgnDlg::OnPaint() { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); bmp.LoadBitmap(IDB_BITMAP1);//2度続けるとダウンする CDialog::OnPaint(); }

  • OnPaint() とOnDraw()の違いについて

    OnPaint内に記述した下記コードでビットマップが描画されますが、OnDraw内だと描画されません。 どうしてなのか教えてください。 お願いします。 void CAbcView::OnPaint() { HBITMAP myDIB; // ビットマップのハンドル HBITMAP oldDIB; HDC hDC; // デバイスコンテキストのハンドル HDC hCompatiDC; // メモリデバイスコンテキスト PAINTSTRUCT ps; // クライアント領域の描画に使う情報を保持 if(!m_BmpInfo) return; hDC = ::GetDC(m_hWnd);//これでもOK ::BeginPaint(m_hWnd,&ps); hCompatiDC = ::CreateCompatibleDC(hDC);//hDC); myDIB = ::CreateDIBitmap(hDC,&m_BmpInfo->bmiHeader, CBM_INIT,m_BmpImage,m_BmpInfo,DIB_RGB_COLORS); oldDIB=(HBITMAP)::SelectObject(hCompatiDC,myDIB); BitBlt(hDC,5,25,m_BmpInfo->bmiHeader.biWidth, m_BmpInfo->bmiHeader.biHeight,hCompatiDC,0,0,SRCCOPY); 略 } 環境 WIN98 VC++6.0 MFC にて

  • デスクトップへの描画

    環境 WIN98 VC++6.0 MFC にて ダイアログベースにて デスクトップにキャラクターを書くために、 BOOL CXXX::OnInitDialog(){ キャラクタのリージョンの作成; キャラクタの描画; //ここでは描画されなかった 略 } としましたが、キャラクタは描画されませんでした。 そこで以下のようにしましたが、キャラクタが書かれる前に、リージョンが先に一瞬見えてしまいます。 このような場合はどうすれば良いのでしょうか? void CAdvancedRgnDlg::OnPaint() { キャラクタの描画; }

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • 試作クラス使用C++プログラムが動かない原因

    試しに作成した以下のプログラムにビルドエラーが発生し,困っているので質問しました. コンパイラは,「BBB *b」などクラスポインタ変数の部分がエラーと指摘しているのですが(他にも数か所ありますが…),間違っている理由が分からず困ってます. ご回答,よろしくお願い致します. ----------------------------------- #include <iostream> using namespace std; class AAA { public: // コンストラクタ AAA(){ b = new BBB( this ); } // デストラクタ ~AAA(){ delete b; } // メンバ変数 BBB *b; int i; // メンバ関数 void displayB(){ b->displayA(); } }; class BBB { public: // コンストラクタ BBB( AAA *a ){ this->a = a; } // デストラクタ ~BBB(){} // メンバ変数 AAA *a; int j; // メンバ関数 void displayA(){ printf( "%d\n", a->i ); } }; int main() { // 変数の定義 AAA a; // 変数の初期化 a.i = 2; a.b->j = 5; // 出力 printf( "%d\n", a.i ); a.b->displayA(); return 0; } -----------------------------------

  • 子ウィンドウから親ウィンドウへデータを渡すには?

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、ダイアログのテキストボックスに入力した文字をウィンドウに表示しています。 また、ウィンドウ生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_moji=m_InputData; //テキストボックスの文字をウィンドウに表示されるう変数m_mojiに代入 pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログを非表示から表示にし、ウィンドウに表示されている文字をダイアログのテキストボックスに表示させるために以下のようにしましたが、文字は表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->m_InputData=m_moji;//変数に正しい文字が代入されていることは確認できました UpdateData(FALSE); pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • typedefについて質問があります。

    現在C言語で書かれたソースを読んでいるのですが理解しにくい記述が あって困っています。 typedef void *aaa; 上記の様な記述があるのですが例えば void *aaa; ならaaaはvoid型の変数を代入するオブジェクトのアドレスを格納するもので、また typedef void aaa; ならaaaはvoidと同義語となるというのはわかりますが 一番上の記述になるとどういう意味になるのでしょうか? もしかして一番上の記述後に aaa bbb; と記入すればbbbはvoid型のポインタと同義になるのでしょうか? 初心者ですのでもしかして初歩的な質問をしてしまっているかも しれませんが、よろしくお願い致します。