TabCtrlView.cpp
上传用户:sz86035077
上传日期:2013-02-27
资源大小:40k
文件大小:4k
源码类别:

Tab控件

开发平台:

Visual C++

  1. // TabCtrlView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Tab.h"
  5. #include "TabCtrlView.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTabCtrlView
  13. CTabCtrlView::CTabCtrlView()
  14. {
  15. }
  16. CTabCtrlView::~CTabCtrlView()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CTabCtrlView, CWnd)
  20. //{{AFX_MSG_MAP(CTabCtrlView)
  21. ON_WM_SIZE()
  22. //}}AFX_MSG_MAP
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CTabCtrlView message handlers
  26. BOOL CTabCtrlView::CreateStatic(CWnd *pParentWnd, DWORD dwStyle, UINT nid)
  27. {
  28. ASSERT(pParentWnd != NULL);
  29.     ASSERT(dwStyle & WS_CHILD);
  30.     ASSERT(!(dwStyle & SPLS_DYNAMIC_SPLIT));
  31.     // create with zero minimum pane size
  32.     if (!CreateCommon(pParentWnd, CSize(0, 0), dwStyle, nid))
  33.             return FALSE;
  34. return TRUE;
  35. }
  36. BOOL CTabCtrlView::CreateCommon(CWnd *pParentWnd, SIZE sizeMin, DWORD dwStyle, UINT nid)
  37. {
  38. ASSERT(pParentWnd != NULL);
  39. ASSERT(sizeMin.cx >= 0 && sizeMin.cy >= 0);
  40. ASSERT(dwStyle & WS_CHILD);
  41. ASSERT(nid != 0);
  42. // create with the same wnd-class as mdi-frame (no erase bkgnd)
  43. if (!CreateEx(0, NULL, NULL, dwStyle, 0, 0, 0, 0,
  44. pParentWnd->m_hWnd, (HMENU)nid, NULL))
  45. return false;       // create invisible
  46. //create the tab control
  47. CRect rect;
  48. GetClientRect(rect);
  49. //去掉TCS_OWNERDRAWFIXED类型,就可以屏蔽CViewTabCtrl类中的DrawItem函数。sunxin
  50. m_tabctl.Create(WS_VISIBLE | WS_CHILD | TCS_OWNERDRAWFIXED, rect, this, nid);
  51. //m_tabctl.Create(WS_VISIBLE | WS_CHILD | TCS_TABS | TCM_SETITEMSIZE, rect, this, nid);
  52. //overide this function to provide your tabs
  53. InitTabs(this);
  54. return TRUE;
  55. }
  56. BOOL CTabCtrlView::HandleTabs(int sel)
  57. {
  58. ASSERT(FALSE); //此处的设置相当于限定了在子类中必须重载HandleTabs函数,
  59. //否则,就会引发断言。
  60.     return FALSE;
  61. }
  62. void CTabCtrlView::InitTabs(CTabCtrlView *pView)
  63. {
  64. m_tabctl.SetView(pView); //实际上传递的仍然是this。sunxin
  65. }
  66. CView* CTabCtrlView::CreateView(CRuntimeClass *pViewClass, SIZE sizeInit, CCreateContext *pContext)
  67. {
  68. #ifdef _DEBUG
  69.         ASSERT_VALID(this);
  70.         ASSERT(pViewClass != NULL);
  71.         ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
  72.         ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), false));
  73. #endif
  74.         CWnd* pWnd;
  75.         TRY
  76.         {
  77.                 pWnd = (CWnd*)pViewClass->CreateObject();
  78.                 if (pWnd == NULL)
  79.                         AfxThrowMemoryException();
  80.         }
  81.         CATCH_ALL(e)
  82.         {
  83.                 TRACE0("out of memory creating a splitter pane.n");
  84.                 // note: delete_exception(e) not required
  85.                 return (CView*) NULL;
  86.         }
  87.         END_CATCH_ALL
  88.         ASSERT_KINDOF(CWnd, pWnd);
  89.         ASSERT(pWnd->m_hWnd == NULL);       // not yet created
  90.         DWORD dwstyle = AFX_WS_DEFAULT_VIEW;
  91.         // create with the right size (wrong position)
  92.         CRect rect(CPoint(0,0), sizeInit);
  93.         if (!pWnd->Create(NULL, NULL, dwstyle,
  94.                 rect, this, 0, pContext))
  95.         {
  96.                 TRACE0("warning: couldn't create client pane for splitter.n");
  97.                         // pwnd will be cleaned up by postncdestroy
  98.                 return (CView*)NULL;
  99.         }
  100.         m_activeView = (CView*) pWnd;
  101.         return m_activeView;
  102. }
  103. void CTabCtrlView::OnSize(UINT nType, int cx, int cy) 
  104. {
  105. CWnd::OnSize(nType, cx, cy);
  106. // TODO: Add your message handler code here
  107. if (nType != SIZE_MINIMIZED && cx > 0 && cy > 0)
  108. RecalcLayout();
  109. }
  110. void CTabCtrlView::RecalcLayout()
  111. {
  112. CWnd* pWnd = (CWnd*)GetActiveView();
  113. CRect rect;
  114. GetClientRect(&rect);
  115. m_tabctl.RecalcLayout(rect, pWnd);
  116. }
  117. CView* CTabCtrlView::GetActiveView()
  118. {
  119. return m_activeView;
  120. }
  121. void CTabCtrlView::SetTab(int tab)
  122. {
  123. m_tabctl.SetCurSel(tab);
  124. }