CViewの派生クラスでのOnDraw()

[戻る]
ピグマ 2010/01/10(日) 15:08:04
初歩的な質問かもしれませんが、ご教授お願いします。

CViewから派生したCTestViewを作成し、
そのOnDraw()で描画を行いたいと考えています。

CTestViewでOnDraw()をオーバーロードしたところ、
以下のソースが自動追加されました。

void CTestView::OnDraw(CDC* pDC)
{
    CDocument* pDoc = GetDocument();
    // TODO: 描画コードをここに追加してください。
}

そして、CTestViewをnew後にCreate()して作成したのですが、
いっこうに上記OnDraw()に処理が飛んできません。

試しにOnPaint()をオーバーロードしてみたところ、
OnPaint()には処理が飛んできています。

void CCaptureStcView::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: ここにメッセージ ハンドラ コードを追加します。
    // 描画メッセージで CView::OnPaint() を呼び出さないでください。
}

OnDraw()で処理を受け取り、同メソッド内のpDCで描画処理をするには、
他に設定/追記などが必要なのでしょうか?

ピグマ 2010/01/10(日) 16:54:01
> オーバーロード
オーバーライドの間違いです。

環境は VS2005 MFCです。

私も初心者だけど 2010/01/10(日) 21:19:07

>void CTestView::OnDraw(CDC* pDC)
>{
>    CDocument* pDoc = GetDocument();
>    // TODO: 描画コードをここに追加してください。
>}

この感じだとおそらくスケルトンをつくられたのでしょうね
そうだと仮定してのはなしだけど

>そして、CTestViewをnew後にCreate()して作成したのですが、
>いっこうに上記OnDraw()に処理が飛んできません。

newする必要ないです
    // TODO: 描画コードをここに追加してください。
このおすすめどおり ここにかけばよいです と思う

pDC->〜〜〜〜〜;
という風に

デゴルガン 2010/01/11(月) 00:57:37
OnPaint の方が CCaptureStcView クラスになっていますが、
ビューが2つあるということなのでしょうか?

ITO 2010/01/11(月) 14:46:09
> そして、CTestViewをnew後にCreate()して作成したのですが、
> いっこうに上記OnDraw()に処理が飛んできません。

"CTestView"は、クラス→追加で作成しましたか?
MFCにはいろいろなマクロが使われています。
慣れないうちは、追加→クラスで作成しましょう。


>OnPaint()には処理が飛んできています。

> void CCaptureStcView::OnPaint()
> {
>    CPaintDC dc(this); // device context for painting
>    // TODO: ここにメッセージ ハンドラ コードを追加します。
>    // 描画メッセージで CView::OnPaint() を呼び出さないでください。
> }

メッセージにもあるとおり、
>    // 描画メッセージで CView::OnPaint() を呼び出さないでください。
コードを書き込まない方がいいですね。
「OnPaint()」書きたかったコードはすべてこちらに書いたほうがいいです。


>void CTestView::OnDraw(CDC* pDC)
>{
>    CDocument* pDoc = GetDocument();
>    // TODO: 描画コードをここに追加してください。
>}

おんどり 2010/01/12(火) 00:36:29
CViewクラスはSDIならCSingleDocTemplate、MDIならCMultiDocTemplateに登録して
CXXXApp::OnFileNewやCXXXApp::OpenDocumentFileで生成します。
newでViewを生成してもMFCのDocumentとViewは正常に動作しません。
ひとつのドキュメントに複数のViewを作る場合も同じです。

CSingleDocTemplateとCMultiDocTemplateの使い方を覚えましょう。

それでも今の形でOnDrawを呼び出したいなら
void CXXXView::OnPaint()
{
  CView::OnPaint();
}
とCViewのOnPaint()関数を呼び出せば呼び出してくれます。
でも、OnDraw()関数の最初のCDocument* pDoc = GetDocument();で、
ドキュメントのアドレスはうけとれませんので、全く意味がありません。

ピグマ 2010/01/19(火) 10:20:14
[[解決]]
ご回答ありがとうございます。
また、回答が遅くなりました。すいません。

OnPain()を記述せずにOnDraw()のみをオーバーライドしたところ、
OnDraw()に処理が入ってきました(MSのヘルプを参照しました)。

ただし、おんどりのおっしゃる通りに、
ドキュメント/ビューアーキテクチャの概念からは外れるため、
その点についてはもう少し検討してみようと思います。

古いスレッドには追加発言できません。