Давайте попробуем сделать свой вид. Вот такой например:
Естественно, что при изменении размеров внутреннее содержание тоже будет приспосабливается под размер окна. Давайте создадим свой проект MFC AppWizard с именем TestView как SDI. На шестом шаге проверьте, что базовым классом (base class) является CView. Здесь же Вы можете убедиться, что нету вида для CTabCtrl.
Добавим теперь свой класс вида.
И в описание класса добавим ссылку на класс 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 данный подход сработает:
Кстати, вы не забыли, что класс можно сохранить в коллекцию, а потом вставлять в проект ??? Если забыли, то почитайте "Шаг 66 Принцип работы - Component Gallery". В данном случае создав его в SDI упаковываем, а потом при переносе в MDI просто вставляем в проект.