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







