自作のコントロールを使ったビュー作成

   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」の部分を
      変更すればいい


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

カテゴリー「VC++ TIPS」 のエントリー