電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

>直接書きとコントロールは完全にすみ分けして使うのが


>標準ということでしょうか?

"標準"と言いきっていいのか否かはわかりませんが、
その方がプログラミングし易いとは感じています。

>CFromViewクラスを使った理由はコントロールも使いたかった為です。

コントロールの数や大きさ等にもよりますが、
CDialogBarを使う手もあります。
("リボン"はこの発展形になります)
ツールバーにエディット等各種コントロールを搭載可能にしたものです。

あまりにコントロールが多くて、CDialogBarが巨大になってしまうのなら、
CSplitWndを用いて左右(もしくは上下)に分割し
片方にCFormView,他方にCViewを表示する
ことも可能です。

どうしても一つのウィンドウにまとめたいなら
あなたのやったようにOnDraw()のオーバーライドもありかなと思います。

CViewでチャイルドを作成する方法もあり、
こっちのほうがオーソドックスな気がしないでもないですが、
コントロールの配置を自分でコーディングしなくてはならないので、
コントロールの数が多い場合には難しい(というか面倒)ですね。

私の結論としては
A) 基本的にはコントロールとView(FormViewを除く)は分離したほうが、
  プログラミングもしやすいし、使いやすい
B)コントロールの数が少数であれば、ダイアログバーやリボンをつかうと
 現代的で見栄えもよい
C)コントロールが多数配置され、かつ、CView(CFormViewを除く)も使いたいなら、
  スプリット・ウィンドウで分離させると作りやすい
D)どうしても一つのウィンドウにまとめたい
  (ex. コントロールの背景に描画したい)
場合なら、OnDraw()をオーバーライドすればよい

こんな感じです
    • good
    • 0

>ドキュメント(で正しいでしょうか?)がCViewクラスの場合



ドキュメントではありません。ビューの誤りです。

>CFromViewクラス(コントロール可能)の場合、
>OnDraw(CDC* pDC)が見当たりませんので、
>定義にvoid OnDraw(CDC* pDC)を追加し、
>以下のようにメソッドを追加して、無理やり表示させました。

>この方法は普通でしょうか?

なぜに、CFromViewを選択されたのですか?
CViewやCScrollViewを選ばずにCFromViewを選択された理由を知りたいです。

通常、CFromViewはダイアログのように、
エディットやリストボックスなどのチャイルドを貼り付ける入れ物にするために
利用されます。

例えば、データとして"ABCD"という文字列があり、
これを表示したい場合
CViewやCScrollViewなどでは、
OnDrawでTextOut, DrawTextなどを用いて
"View自身がデータを表示”
します。

これに対し、CFormViewでは
チャイルドのテキストボックス等を用いて表示します。
"View自身はデータを表示せず、チャイルドを用いて表示”
します。

CFormView自身はデータを表示しないのが普通なので
OnDrawが提供されていないのです。

きちんとドキュメント/ビュー アーキテクチャの基礎を学習し、
合わせて、各Viewの特徴も学習されることをお勧めします。

この回答への補足

詳しい説明ありがとうございます。

CFromViewクラスを使った理由はコントロールも使いたかった為です。

コントロールも使えて、直接書きもできるのはCFromViewクラスかなと思いました。
メソッド?にOnDrowが無かったので、これは無理やり表示ができても、お勧めできない方法かなと思いましたので、別の良い方法があるのかお聞きしたかったです。

直接書きとコントロールは完全にすみ分けして使うのが標準ということでしょうか?

補足日時:2009/05/09 11:41
    • good
    • 0

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