否则返回>=0的索引值。GetIndex由索引得到窗口,失败返回NULL,否则返回对应的窗口。7)获取视图页面的数量:GetViewCount。8)设置视图页面的标题:SetViewTitle,有2个重载形式,int类型参数的按索引设置,CWnd类型参数的按窗口设置,成功返回TRUE,否则返回FALSE。9)获取视图页面的标题:GetViewTitle,有2个重载形式,int类型参数的按索引获取,CWnd类型参数的按窗口获取,成功返回TRUE,否则返回FALSE。10)设置视图页面的图像:有2个重载形式,int类型参数的按索引设置,CWnd类型参数的按窗口设置,成功返回TRUE,否则返回FALSE。11)获取视图页面的图像:有2个重载形式,int类型参数的按索引获取,CWnd类型参数的按窗口获取,成功返回TRUE,否则返回FALSE。12)设置视图页面的数据:有2个重载形式,int类型参数的按索引设置,CWnd类型参数的按窗口设置,成功返回TRUE,否则返回FALSE。13)获取视图页面的数据:有2个重载形式,int类型参数的按索引获取,CWnd类型参数的按窗口获取,成功返回TRUE,否则返回FALSE。14)视图页面内部标志查询:有2个重载形式,int类型参数的按索引查询,CWnd类型参数的按窗口查询,成功返回TRUE,否则返回FALSE,当操作成功时,参数bInner为TRUE表示为CTabView内部创建的窗口,否则表示外部窗口。
最后列出主要部分的实现代码,如下所示
1CTabCtrl& CTabView::GetTabCtrl() const
2{
3 return *(CTabCtrl*)this;
4}
5
6CWnd* CTabView::AddView(CRuntimeClass* pClass,CCreateContext* pContext,LPCTSTR pszTitle,
7 int iImage,LPVOID pData,BOOL bActivate)
8{
9 return InsertView(GetViewCount(),pClass,pContext,pszTitle,iImage,pData,bActivate);
10}
11
12BOOL CTabView::AddView(CWnd* pWnd,LPCTSTR pszText,int iImage,LPVOID pData,BOOL bActivate)
13{
14 return InsertView(GetViewCount(),pWnd,pszText,iImage,pData,bActivate);
15}
16
17CWnd* CTabView::InsertView(int iIndex,CRuntimeClass* pClass,CCreateContext* pContext,
18 LPCTSTR pszTitle,int iImage,LPVOID pData,BOOL bActivate)
19{
20 ASSERT(::IsWindow(CCtrlView::m_hWnd));
21 ASSERT(pClass!=NULL);
22 ASSERT(pClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
23 ASSERT(AfxIsValidAddress(pClass,sizeof(CRuntimeClass),FALSE));
24
25 CWnd* pWnd = (CWnd*)pClass->CreateObject();
26 if (NULL==pWnd) return NULL;
27 ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CWnd)));
28
29 CCreateContext context;
30 if(pContext==NULL)
31 {
32 CView* pOldView=(CView*)GetActiveView();
33 if(pOldView!=NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
34 {
35 ASSERT(context.m_pCurrentFrame==NULL);
36 context.m_pLastView=pOldView;
37 context.m_pCurrentDoc=pOldView->GetDocument();
38 if(context.m_pCurrentDoc!=NULL)
39 {
40 context.m_pNewDocTemplate=context.m_pCurrentDoc->GetDocTemplate();
41 }
42 }
43 pContext=&context;
44 }
45 if (!pWnd->Create(NULL,NULL,WS_CHILD,CRect(0,0,0,0),this,GetUniqueId(),pContext))
46 {
47 delete pWnd; return NULL;
48 }
49 if (!InsertView(iIndex,pWnd,pszTitle,iImage,pData,bActivate))
50 {
51 pWnd->DestroyWindow(); return NULL;
52 }
53 SetViewInner(iIndex,TRUE);
54 return pWnd;
55}
56
57BOOL CTabView::InsertView(int iIndex,CWnd* pWnd,LPCTSTR pszTitle,int iImage,LPVOID pData,BOOL bActivate)
58{
59 ASSERT(::IsWindow(CCtrlView::m_hWnd));
60 ASSERT(pWnd&&::IsWindow(pWnd->m_hWnd));
61
62 CString str;
63 ShortenTitle(pszTitle,str);
64
65 TC_EXTRA_ITEM ti;
66 ti.header.mask = TCIF_PARAM|TCIF_TEXT|TCIF_IMAGE;
67 ti.header.pszText = (LPTSTR)(LPCTSTR)str;
68 if (pszTitle)
69 {
70 ti.view.pszTitle = new TCHAR[_tcslen(pszTitle)+1];
71 if (NULL==ti.view.pszTitle)
72 re