OnDrawが呼び出されない

このQ&Aのポイント
  • VC++6.0 MFCを使用し、コントロール部と描画部に分けた画面を作成しています。
  • CMyViewクラスはコントロール部であり、CTest1Viewクラスは描画部であり、CTest1Docクラスと関連付けられています。
  • MyViewのボタン入力でTest1Viewの画面を再描画したいのですが、OnDrawが呼び出されません。
回答を見る
  • ベストアンサー

OnDrawが呼び出されません

一つの画面をコントロール部と描画部にわけたものを作ろうとしています. (VC++6.0 MFC使用) ・CMyViewクラス(CFormViewクラス派生・コントロール部) ・CTest1Viewクラス(CViewクラス派生・描画部)(CTest1Docに関連付け) ・CTest1Docクラス MyViewのボタン入力でTest1Viewの画面を再描画させたいのですが,MyView内から以下のようにしてもTest1ViewのOnDrawが呼び出されません. (OnUpdateは呼び出されるようです) CTest1Doc *pDoc=(CTest1Doc *)GetDocument(); pDoc->UpdateAllViews(NULL, 1, NULL); 再描画させるにはどうすればよいのでしょうか.

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

  • ベストアンサー
  • valvelde
  • ベストアンサー率35% (46/129)
回答No.3

No2は間違いなので無視してください。 CWnd::Invalidate CWnd::UpdateWindow をコールする。 いまいち何がしたいのかよくわかりませんが本来は OnUpdateで画面を更新すれば自動的にOnDrawがコールされるので強制的に再描画する必要はないと思いますが。

IndigoS
質問者

補足

回答ありがとうございます.説明が下手ですいません… ウインドウをCViewとCFormViewに分割して,CFormView側のボタンを押すとCView側に線を引く,というのをやりたいのです(まだ分かりづらいでしょうか,すいません) InvalidateとUpdateWindowを呼び出してみたところ,無事再描画はされました.ありがとうございます. OnUpdateで画面を更新するためには,このようにこちらから何か指定しなければいけないのでしょうか?

その他の回答 (3)

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.4

OnUpdate関数内でCWnd::GetDCをコールしてCDCのインスタンスを取得する。 取得したCDCのインスタンスで線を描画する。

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.2

CWnd::UpdateWindowをコールする。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

pDoc->UpdateAllViews(NULL, 1, NULL); の前に pDoc->SetModifiedFlag(); を入れてみてはいかがでしょうか。

IndigoS
質問者

お礼

回答ありがとうございます. 試してみたのですが,どうもやっぱりOnDrawは呼び出されないようです. 他の方法も試してみようと思います. ありがとうございました.

関連するQ&A

  • 特定のビューへのポインタ取得方法について

    MFCプログラミング(MDI)について教えてください。 1つのドキュメントに 複数の子ウィンドウ+子ビューのセットがあるとき、 特定のビューへのポインタの取得方法を教えてください。 ちなみに、ビューの種類は、 1.CViewの派生クラス 2.CFormViewの派生クラス です。 MSDNを調べ回っった結果、 ドキュメントクラスのポインタから、 GetNextView(pos)を使って順番にビューを使うところまで来たのですが、その後が分かりませんし、 この方法の方向性自体の是非も良く分かりません。 ご指導よろしくお願いします。 POSITION pos = pDoc->GetFirstViewPosition(); while(pos != NULL) { CView* tmpView = pDoc->GetNextView(pos); if(tmpView == ???????)........????? }

  • CFromViewの OnDrawメソッドについて

    MFC初心者です。VC2005でグラフィックスに挑戦しております。 まだよくクラスとか、MFCの作法などしらないのでトンチンカンな質問をしますが、 ドキュメント(で正しいでしょうか?)がCViewクラスの場合、 OnDraw(CDC* pDC)が定義されていたので、直接そこに描画コードを書きましたが、 CFromViewクラス(コントロール可能)の場合、 OnDraw(CDC* pDC)が見当たりませんので、定義にvoid OnDraw(CDC* pDC)を追加し、 以下のようにメソッドを追加して、無理やり表示させました。 この方法は普通でしょうか? void CtestView::OnDraw(CDC* pDC) { CBrush myBrush; CBrush* pOldBrush; myBrush.CreateSolidBrush(RGB(255,0,0)); // ソリッドブラシの作成 pOldBrush = pDC->SelectObject(&myBrush); // myBrushを選択 pDC->Ellipse(60,10,160,110); pDC->SelectObject(pOldBrush); // 元に戻す myBrush.DeleteObject(); // ブラシを削除 } //--------------------------------------------------- 以下クラス定義部 class CtestView : public CFormView { protected: // シリアル化からのみ作成します。 CtestView(); DECLARE_DYNCREATE(CtestView) public: enum{ IDD = IDD_test_FORM }; // 属性 public: CtestDoc* GetDocument() const; // 操作 public: // オーバーライド public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。 // 実装 public: virtual ~CtestView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif void OnDraw(CDC* pDC); /////////////////////////// ←勝手に追加 protected: // 生成された、メッセージ割り当て関数 protected: DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // testView.cpp のデバッグ バージョン inline CtestDoc* CtestView::GetDocument() const { return reinterpret_cast<CtestDoc*>(m_pDocument); } #endif

  • CDCオブジェクトの作成について

    // あまり意味はないのですが、 //CDCのオブジェクトを宣言して、 //そこへ図形を描画して、 //クライエント領域にBitBltするときは、 //どうすればいいですか? //CreateCompatibleDCが関係していると思っています。 //ですが、上手く描画できません。 //教えてください、 //お願いします。 void CProject1View::OnDraw(CDC* pDC) { CProject1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; ////////////////////////////////////////////////////// CDC imageDC; CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); imageDC.CreateCompatibleDC(pDC); for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { imageDC.SetPixel(i,j,RGB(128,0,0)); } } oldpen=imageDC.SelectObject(&pen); imageDC.Rectangle(50,50,400,300); pDC->BitBlt(0,0,600,600,&imageDC,0,0,SRCCOPY); imageDC.SelectObject(oldpen); ////////////////////////////////////////////////////// }

  • ドキュメントからビューを操作するには

    VC++ の MFI で SDI 使っています。 ドキュメントとビューがともに一つだけのとき、 ビューからドキュメントを操作するには   C○○○Doc* pDoc = getDocument(); で実現できます。 逆に、ドキュメントからビューを操作するには、どういう 関数を使えばよいのでしょうか。

  • CDocumentの取得方法について

    CTreeCtrlクラスを使って、 ドキュメントクラスのデータを ダイアログ上のツリーコントロールに 表示させるプログラムを作っています。 CViewクラスでは、GetDocument()関数で ドキュメントデータを取得できますが、 CTreectrlクラスには、そのような関数がないので、 困っています。 どうすれば、ドキュメントデータをツリー表示できるのかを教えてください。 よろしくお願いします。

  • CFormViewでの印刷について

    環境はWIN98 VC++6.0 MFCです。 基本クラスをCViewにした場合は下記コードにて、印刷プレビューで画像が見れたのですが、基本クラスをCFormViewにしたら見れません。 どうすれば良いのでしょうか? void CxxxView::OnDraw(CDC* pDC) { if (pDC->IsPrinting()) { 下記URLのコード } else{ } 画像表示用コード http://www.codeguru.com/forum/showthread.php?threadid=234177

  • Viewクラスからロジック部分への繋ぎについて

    Java SE 6 の SingleFrameApplication を用いたアプリケーションについて質問です。 NetBeans6.5.1 にて、Javaデスクトップアプリケーションを新規作成すると、AppクラスとViewクラスが作成されます。 ここに肉付けしてゆくとき、UI部分をViewに実装し、ロジック部分をおそらく新しくオリジナルで作成するクラス(仮にDocとする)に実装するのだと思います。このとき、ViewとDocの繋ぎは、通常どのような方法を取りますか? App で Doc のインスタンスを作成し、テンプレートに実装されている getApplication() と同じ方法で getDocument() するような方法でしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • テキストの折り返し処理について

    Visual Studio 2005のMFCを使用してアプリケーションを作成しようとして いるのですが、テキストの折り返し処理がうまくいかないので、質問させて ください。MFC初心者です。 新規作成⇒プロジェクト⇒MFCアプリケーション⇒シングルドキュメント ⇒NEXT×6⇒基本クラスを【CEditView】に変更すると、スケルトンとして メモ帳が出来上がりますよね?このメモ帳に対して文字を入力していくと、 端でちゃんと折り返し、最大化すると文字を最大化用に敷き詰めてくれます。 これはメモ帳ですが、自分がやりたい事はあるPCからのデータをレシーブしてそこの画面に表示!!という事なので、CEditViewではなくCListViewとかを使おうとしてます。そのスケルトンに対して、実際に文字を表示させようとして、C○○View::OnDraw(CDC* pDC){    例えば *変数 ="AAABBBCCCDDDEEE"; C○○Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->TextOut(0,0,name); }     窓 そうすると、 ------------- AAABBBCCCDDDE        ------------- このように表示されてしまい右にスクロールすると、残った文字が出てきます。 このプログラムを 窓 ------------- AAABBBCCCDDDE EE ------------- と折り返し処理をしてくれて、最大化した時は                  //右端まで行ったら折り返す ----------------- AAABBBCCCDDDEEE ----------------- まずはこのようなプログラムにしたいのですが、アドバイス等、ご教示 いただきたいです。宜しくお願いいたします ///////////////////////////////////////////////// 開発環境 WinXP sp2 Visual Studio 2005 MFC

  • Cwndクラスの派生クラスmCWndクラスのOnDrawについて

    OnDraw関数が呼び出しされていません。 どうすればいいですか? よろしくお願いします。 class mCWnd :public CWnd { public: DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags,CPoint point) { AfxMessageBox("子ウインドウ"); CDC *pDC=GetDC(); pDC->TextOut(0,0,"HELLO"); ReleaseDC(pDC); Invalidate(); } virtual void OnDraw(CDC* pDC) { AfxMessageBox("OnDraw"); pDC->FillSolidRect(CRect(0,0,300,300),RGB(255,255,255)); } }; BEGIN_MESSAGE_MAP(mCWnd, CWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ------------------------------------------- //***View.cpp (mCWnd cw) void CKoDlg::OnBnClickedButton1() { CRect rect=CRect(50,50,190,250); cw.Create(NULL,"Hello",WS_CHILD|WS_VISIBLE,rect,this,5000,0); // TODO : ここにコントロール通知ハンドラ コードを追加します。 }

専門家に質問してみよう