CTreeCtrlの派生コントロールなどの自作コントロールを作った場合、SDIアプリ
としてビュー全面にそのコントロールを使うのは結構面倒くさい。
それを解決するためにはCFormView派生クラスを作成してVCのウイザードが用意
したSDIやMDIのビューに結びつける。
・SDIかMDIでプロジェクトを作成する。ここでは「xxx」とした
・ダイアログリソースを挿入する
・ダイアログリソース名を「IDD_CUSTOM_VIEW」とする
・ダイアログのプロパティで「スタイル」を「チャイルド」に変更する
・ダイアログのプロパティで「境界線」を「しない」に変更する
・ダイアログから「OK」と「キャンセル」ボタンを削除する
・ダイアログにツリーコントロールを配置する
・ツリーコントロールのリソース名を「IDC_TREE」とする
・ClassWizardでクラスの新規作成を開く
・クラス名「CCustomView」、基本クラス「CFormView」、ダイアログID「IDD_CUSTOM_VIEW」とする
・ClassWizardで新しく作成したCCustomViewに「IDC_TREE」のメンバコントロール「m_cTreeCtrl」を追加する
・ClassWizardでCCustomViewに「WM_SIZE」のハンドラ関数「OnSize()」を追加する
・生成したコードに以下の変更を加える
※ 自分で作成したツリーコントロールに対するビューを作成したい場合は
CCustomTreeView内のメンバ変数「CTreeCtrl m_cTreeCtrl」の部分を
変更すればいい
としてビュー全面にそのコントロールを使うのは結構面倒くさい。
それを解決するためにはCFormView派生クラスを作成してVCのウイザードが用意
したSDIやMDIのビューに結びつける。
・SDIかMDIでプロジェクトを作成する。ここでは「xxx」とした
・ダイアログリソースを挿入する
・ダイアログリソース名を「IDD_CUSTOM_VIEW」とする
・ダイアログのプロパティで「スタイル」を「チャイルド」に変更する
・ダイアログのプロパティで「境界線」を「しない」に変更する
・ダイアログから「OK」と「キャンセル」ボタンを削除する
・ダイアログにツリーコントロールを配置する
・ツリーコントロールのリソース名を「IDC_TREE」とする
・ClassWizardでクラスの新規作成を開く
・クラス名「CCustomView」、基本クラス「CFormView」、ダイアログID「IDD_CUSTOM_VIEW」とする
・ClassWizardで新しく作成したCCustomViewに「IDC_TREE」のメンバコントロール「m_cTreeCtrl」を追加する
・ClassWizardでCCustomViewに「WM_SIZE」のハンドラ関数「OnSize()」を追加する
・生成したコードに以下の変更を加える
※ 自分で作成したツリーコントロールに対するビューを作成したい場合は
CCustomTreeView内のメンバ変数「CTreeCtrl m_cTreeCtrl」の部分を
変更すればいい
class CCustomTreeView : public CFormView { protected: COptionsTreeView(); // 動的生成に使用されるプロテクト コンストラクタ。 DECLARE_DYNCREATE(CCustomTreeView) // フォーム データ public: //{{AFX_DATA(CCustomTreeView) enum { IDD = IDD_CUSTOM_VIEW }; // CTreeCtrl m_cTreeCtrl; //■■ この行は削除 //}}AFX_DATA CTreeCtrl m_cTreeCtrl; //■■ 削除した行をここに追加、必要に応じてCTreeCtrlを変えればいい ...(省略)... }; void CCustomTreeView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); if(::IsWindow(m_cTreeCtrl.m_hWnd) != FALSE) //■■ 追加 m_cTreeCtrl.MoveWindow(0, 0, cx, cy); //■■ 追加 }
#include "CustomTreeView.h" //■■ 追加 class CxxxView : public CCustomTreeView //■■ クラス名を変更 { ...(省略)... }; IMPLEMENT_DYNCREATE(CxxxView, CCustomTreeView) //■■ クラス名を変更 BEGIN_MESSAGE_MAP(CxxxView, CCustomTreeView) //■■ クラス名を変更 //{{AFX_MSG_MAP(CxxxView) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CxxxView::PreCreateWindow(CREATESTRUCT& cs) { return CCustomTreeView::PreCreateWindow(cs); //■■ クラス名を変更 } void CxxxView::OnInitialUpdate() { CCustomTreeView::OnInitialUpdate(); //■■ クラス名を変更 } #ifdef _DEBUG void CxxxView::AssertValid() const { CCustomTreeView::AssertValid(); //■■ クラス名を変更 } void CxxxView::Dump(CDumpContext& dc) const { CCustomTreeView::Dump(dc); //■■ クラス名を変更 } CxxxDoc* CxxxView::GetDocument() // 非デバッグ バージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CxxxDoc))); return (CxxxDoc*)m_pDocument; } #endif //_DEBUG