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

Tab控件

开发平台:

Visual C++

  1. // ViewTabCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Tab.h"
  5. #include "ViewTabCtrl.h"
  6. #include "TabCtrlView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CViewTabCtrl
  14. #define CX_BORDER 1
  15. #define CY_BORDER 1
  16. #define MAX_COLORS 3
  17. COLORREF g_colorRef[MAX_COLORS] =
  18. {
  19.         RGB(0,225,255),
  20.         RGB(0,240,190),
  21.         RGB(128,128,255),
  22.         /*RGB(240,200,175),
  23.         RGB(240,240,150),
  24.         RGB(175,130,175),
  25.         RGB(240,140,0),
  26.         RGB(255,200,0),
  27.         RGB(255,160,120),
  28.         RGB(255,200, 175)*/
  29. };
  30. CViewTabCtrl::CViewTabCtrl()
  31. {
  32. m_strSelfont = _T("华文行楷"); //此处是设置标签上的字体的名称,m_strSelfont是选中时的字体名称,
  33.     m_strGrayfont= _T("宋体"); //m_strGrayfont是变灰时的字体名称。
  34. }
  35. CViewTabCtrl::~CViewTabCtrl()
  36. {
  37. }
  38. BEGIN_MESSAGE_MAP(CViewTabCtrl, CTabCtrl)
  39. //{{AFX_MSG_MAP(CViewTabCtrl)
  40. ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
  41. //}}AFX_MSG_MAP
  42. END_MESSAGE_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CViewTabCtrl message handlers
  45. void CViewTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  46. {
  47. int nsel = lpDrawItemStruct->itemID;
  48.         ASSERT(nsel > -1);
  49.         ASSERT(nsel <  GetItemCount()); 
  50.         TC_ITEM item;
  51.         char text[255];
  52. memset(text,0,255);
  53. switch(nsel)
  54. {
  55. case 0:
  56. strcpy(text, "下载");
  57. break;
  58. case 1:
  59. strcpy(text, "代理服务器");
  60. break;
  61. case 2:
  62. strcpy(text, "站点探测器");
  63. break;
  64. default:
  65. break;
  66. }
  67.         item.pszText = text;
  68.         item.mask = TCIF_TEXT;
  69.         GetItem(nsel, &item);
  70.         if(!m_dc.Attach(lpDrawItemStruct->hDC))
  71.                 return;
  72.         CRect rect = CRect(&(lpDrawItemStruct->rcItem));
  73.         rect.NormalizeRect(); //使CRect正常化,即宽度和高度都是正的。sunxin
  74.         rect.DeflateRect(CX_BORDER, CY_BORDER); //是矩形的左上角的left和top增加1,
  75. //矩形的右下角的right和bottom减少1,也就是宽度和高度都减2,因为CX_BORDER和
  76. //CY_BORDER定义为1。
  77. //当每一个标签需要被绘制的时候,标签控件都会发送WM_DRAWITEM。
  78. //在MFC中,调用DrawItem这个函数。为每一个标签定义一种颜色的画刷。sunixn
  79.         CBrush brush(g_colorRef[nsel - (nsel / MAX_COLORS) * MAX_COLORS]);
  80.         
  81.         m_dc.FillRect(rect, &brush);
  82.         
  83.         COLORREF tcolor;
  84.         if (nsel == GetCurSel())
  85.         {
  86.                 m_selFont.DeleteObject();
  87.                 m_selFont.CreatePointFont(100, LPCTSTR(m_strSelfont), &m_dc);
  88.                 m_dc.SelectObject(m_selFont);
  89.                 tcolor = RGB(0,0,0);
  90.                 
  91.         }
  92.         else
  93.         {
  94.                 m_selFont.DeleteObject();
  95.                 m_selFont.CreatePointFont(80, LPCTSTR(m_strGrayfont), &m_dc);
  96.                 m_dc.SelectObject(m_selFont);
  97. //GetSysColor得到当前指定显示元素的颜色。显示元素可以是窗口的
  98. //一部分。sunxin
  99.                 tcolor = GetSysColor(COLOR_3DSHADOW);
  100.         }
  101.         m_dc.SetBkMode(TRANSPARENT);
  102.         m_dc.SetTextColor(tcolor);
  103. m_dc.DrawText(text, rect, DT_VCENTER|DT_CENTER);
  104.         m_dc.Detach();
  105.         return;
  106. }
  107. void CViewTabCtrl::RecalcLayout(CRect &rect, CWnd *pWnd)
  108. {
  109. SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, 
  110. rect.bottom - rect.top, SWP_NOZORDER);
  111. //调用AdjustRect函数来计算一个标签控件的显示区域(通过传递一个窗口矩形,
  112. //第一个参数为FALSE),或者计算一个窗口区域(通过传递一个给定的显示区域,
  113. //第一个参数为TRUE)。sunxin
  114. AdjustRect(FALSE, &rect);
  115. pWnd->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, 
  116. rect.bottom - rect.top, SWP_NOZORDER);
  117. }
  118. void CViewTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
  119. {
  120. // TODO: Add your control notification handler code here
  121. int nsel = GetCurSel();
  122.         
  123.     HandleTabs(nsel);
  124.     
  125.     *pResult = 0;//这句代码是MFC自动添加。sunxin
  126. }
  127. BOOL CViewTabCtrl::HandleTabs(int sel)
  128. {
  129. return m_pView->HandleTabs(sel);
  130. }
  131. void CViewTabCtrl::SetView(CTabCtrlView *pView)
  132. {
  133. m_pView=pView;
  134. }