![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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
No.2ベストアンサー
- 回答日時:
>直接書きとコントロールは完全にすみ分けして使うのが
>標準ということでしょうか?
"標準"と言いきっていいのか否かはわかりませんが、
その方がプログラミングし易いとは感じています。
>CFromViewクラスを使った理由はコントロールも使いたかった為です。
コントロールの数や大きさ等にもよりますが、
CDialogBarを使う手もあります。
("リボン"はこの発展形になります)
ツールバーにエディット等各種コントロールを搭載可能にしたものです。
あまりにコントロールが多くて、CDialogBarが巨大になってしまうのなら、
CSplitWndを用いて左右(もしくは上下)に分割し
片方にCFormView,他方にCViewを表示する
ことも可能です。
どうしても一つのウィンドウにまとめたいなら
あなたのやったようにOnDraw()のオーバーライドもありかなと思います。
CViewでチャイルドを作成する方法もあり、
こっちのほうがオーソドックスな気がしないでもないですが、
コントロールの配置を自分でコーディングしなくてはならないので、
コントロールの数が多い場合には難しい(というか面倒)ですね。
私の結論としては
A) 基本的にはコントロールとView(FormViewを除く)は分離したほうが、
プログラミングもしやすいし、使いやすい
B)コントロールの数が少数であれば、ダイアログバーやリボンをつかうと
現代的で見栄えもよい
C)コントロールが多数配置され、かつ、CView(CFormViewを除く)も使いたいなら、
スプリット・ウィンドウで分離させると作りやすい
D)どうしても一つのウィンドウにまとめたい
(ex. コントロールの背景に描画したい)
場合なら、OnDraw()をオーバーライドすればよい
こんな感じです
No.1
- 回答日時:
>ドキュメント(で正しいでしょうか?)が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が無かったので、これは無理やり表示ができても、お勧めできない方法かなと思いましたので、別の良い方法があるのかお聞きしたかったです。
直接書きとコントロールは完全にすみ分けして使うのが標準ということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java java final 1 2022/06/10 22:49
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java eclipse実行ができない 2 2022/07/27 04:47
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
連続で印刷すると画像が更新さ...
-
Tabコントロールに貼り付けたダ...
-
EXCELVBA リストボックスで選択...
-
コモンダイアログコントロール...
-
警告表示を非表示にしたい
-
TabControlとToolBarの背景色変更
-
ActiveXコントロールを.NETにイ...
-
複数列リストコントロールについて
-
ワードのドロップダウンリスト
-
プロパティシートのタブの名前...
-
WS_TABSTOPが機能するコントロ...
-
文字色を変えたい(ACCESS VBA)
-
フォームでPDFを表示させた...
-
VScrollBarの点滅を何とかしたい。
-
CFromViewの OnDrawメソッドに...
-
C#.NETでのCOMコンポーネント作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
連続で印刷すると画像が更新さ...
-
フォームでPDFを表示させた...
-
ActiveXコントロールを.NETにイ...
-
エクセル - リストボックスのマ...
-
コモンダイアログコントロール...
-
TabControlとToolBarの背景色変更
-
EXCELVBA リストボックスで選択...
-
警告表示を非表示にしたい
-
CEdit の内容が変わった時にメ...
-
ワードのドロップダウンリスト
-
リストボックスの同期
-
文字色を変えたい(ACCESS VBA)
-
VScrollBarの点滅を何とかしたい。
-
C#でChartコントロールを...
-
Excel VBAでのMultipageの選択
-
VisualStudio MFC変数が追加で...
おすすめ情報