Шаг 319 - Свой вид на основе CTabCtrl

Давайте попробуем сделать свой вид. Вот такой например:

319_1.gif (2692 b)

Естественно, что при изменении размеров внутреннее содержание тоже будет приспосабливается под размер окна. Давайте создадим свой проект MFC AppWizard с именем TestView как SDI. На шестом шаге проверьте, что базовым классом (base class) является CView. Здесь же Вы можете убедиться, что нету вида для CTabCtrl.

Добавим теперь свой класс вида.

319_2.gif (4286 b)

И в описание класса добавим ссылку на класс CTabCtrl:

class CTabView : public CView
{
	......
public:
	CTabCtrl cTab;
	......
};

Элемент должен иметь идентификатор, вот мы его и опишем:

......
// TabView.h : header file
//
#define TAB_ID 1000

///////////////////////////////////////
// CTabView view
......

Нам нужно перегрузить функцию Create() для того, чтобы добавить туда код создания элемента:

///////////////////////////////////////
// CTabView message handlers

BOOL CTabView::Create(LPCTSTR lpszClassName, 
		LPCTSTR lpszWindowName, DWORD dwStyle,
		const RECT& rect, CWnd* pParentWnd,
		UINT nID, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class

	CWnd::Create(lpszClassName, lpszWindowName, dwStyle,
		rect, pParentWnd, nID, pContext);
	if (cTab.Create(WS_CHILD | WS_VISIBLE|TCS_BOTTOM,
		rect,this,TAB_ID)!=TRUE) 
	{
		AfxMessageBox("Error Create cTab"); 
		return FALSE;
	}
	CreateItem();
	return TRUE;
}

Обратите внимание на функцию CreateItem(), я ее специально вынес, так как там будут создаваться закладки.

class CTabView : public CView
{
......
// Operations
public:
	CTabCtrl cTab;
	void CreateItem();
// Overrides
......
};

void CTabView::CreateItem()
{
	TC_ITEM tc;
	tc.mask=TCIF_TEXT;
	CString str1="Nomer 1";
	tc.pszText=(LPSTR)(LPCTSTR)str1;
	tc.cchTextMax=str1.GetLength();
	cTab.InsertItem(0,&tc);
	tc.mask=TCIF_TEXT;
	str1="Nomer 2";
	tc.pszText=(LPSTR)(LPCTSTR)str1;
	tc.cchTextMax=str1.GetLength();
	cTab.InsertItem(0,&tc); 
}

Нам нужно устанавливать его размер при изменении размера окна. Это можно сделать перегрузив CalcWindowRect():

void CTabView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
	CView::CalcWindowRect(lpClientRect, nAdjustType);
	CRect rect=lpClientRect;
	cTab.MoveWindow(0,0,rect.Width()-4,rect.Height()-4);
}

Теперь осталось объяснить виду, который участвует в схеме документ-вид, что папа у него уже другой:

......
#endif // _MSC_VER > 1000
#include "TabView.h"
class CTestViewView : public CTabView
{
	......
};

Всё, можете запускать. Можете проверить и с MDI данный подход сработает:

319_3.gif (6524 b)

Кстати, вы не забыли, что класс можно сохранить в коллекцию, а потом вставлять в проект ??? Если забыли, то почитайте "Шаг 66 Принцип работы - Component Gallery". В данном случае создав его в SDI упаковываем, а потом при переносе в MDI просто вставляем в проект.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.02.2001