![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Шаг 319 - Свой вид на основе CTabCtrlДавайте попробуем сделать свой вид. Вот такой например: Естественно, что при изменении размеров внутреннее содержание тоже будет приспосабливается под размер окна. Давайте создадим свой проект 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 просто вставляем в проект. | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|