CoolTabCtrl.cpp
上传用户:czfddz
上传日期:2013-03-20
资源大小:1517k
文件大小:18k
源码类别:

酒店行业

开发平台:

C/C++

  1. /*####################################################################
  2. Filename:  cooltabctrl.cpp
  3. ----------------------------------------------------
  4. Remarks: ...
  5. ----------------------------------------------------
  6.   ####################################################################*/
  7. #include "stdafx.h"
  8. #include "resource.h"
  9. #include "CoolTabCtrl.h"
  10. #include "tools.h"
  11. #include<MMSYSTEM.H>
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /*####################################################################
  18. ------------------------------------------------
  19. class CTabPageItem
  20. ------------------------------------------------
  21.   ####################################################################*/
  22. CTabPageItem::CTabPageItem(CCoolTabCtrl* pParentWnd, CWnd* pWnd, 
  23.    const CString &strText, int nNumber)
  24. {
  25. m_pParentWnd = pParentWnd;
  26. m_pWnd = pWnd;
  27. m_dwState = 0;
  28. m_strText = strText;
  29. m_nNumber = nNumber;
  30. m_hIcon = NULL;
  31. }
  32. CTabPageItem::~CTabPageItem()
  33. {
  34. if (m_hIcon != NULL)
  35. {
  36. DestroyIcon(m_hIcon);
  37. m_hIcon = NULL;
  38. }
  39. }
  40. void CTabPageItem::SetIcon(HICON hIcon)
  41. {
  42. if (m_hIcon != NULL)
  43. {
  44. DestroyIcon(m_hIcon);
  45. m_hIcon = NULL;
  46. }
  47. m_hIcon = hIcon;
  48. }
  49. void CTabPageItem::Expend()
  50. {
  51. m_pWnd->MoveWindow(m_rect);
  52. m_pWnd->ShowWindow(SW_SHOW);
  53. m_pWnd->UpdateWindow();
  54. }
  55. void CTabPageItem::SetRect(const CRect &rect)
  56. {
  57. m_rect = rect;
  58. }
  59. void CTabPageItem::Hide()
  60. {
  61. m_pWnd->ShowWindow(SW_HIDE);
  62. }
  63. void CTabPageItem::OnDraw(CDC *pDC, int nState)
  64. {
  65. CRect rect(m_rcLabel);
  66. switch (m_pParentWnd->m_nMode)
  67. {
  68. case TABMODE_NONE:
  69. break;
  70. case TABMODE_GROUP:
  71. {
  72. pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
  73. switch (m_dwState) 
  74. {
  75. case 0: pDC->Draw3dRect(rect, RGB(255,255,255), ::GetSysColor(COLOR_3DSHADOW));
  76. break;
  77. case 1: pDC->Draw3dRect(rect, ::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_3DFACE));
  78. break;
  79. }
  80. pDC->SetBkMode(TRANSPARENT);
  81. if (m_hIcon != NULL)
  82. {
  83. ::DrawIconEx( pDC->m_hDC, rect.left + 3, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
  84. }
  85. pDC->SetTextColor(RGB(0, 0, 0));
  86. pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
  87. }
  88. break;
  89. case TABMODE_BOTTOMTAB:
  90. {
  91. COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
  92. CPen pen(0, 1, AlphaBlendColor(backcolor, 180));
  93. CPen *oldpen = pDC->SelectObject(&pen);
  94. if (m_nNumber != m_pParentWnd->m_nActivePage)
  95. {
  96. rect.DeflateRect(1, 0);
  97. }
  98. else
  99. {
  100. rect.DeflateRect(-1, -1, -1, 0);
  101. }
  102. pDC->MoveTo(rect.left + 2,  rect.bottom);
  103. pDC->LineTo(rect.right - 1, rect.bottom);
  104. pDC->MoveTo(rect.left,  rect.top);
  105. pDC->LineTo(rect.left, rect.bottom - 1);
  106. pDC->MoveTo(rect.right,  rect.top);
  107. pDC->LineTo(rect.right, rect.bottom - 1);
  108. if (m_nNumber == m_pParentWnd->m_nActivePage)
  109. {
  110. CRect rc(rect);
  111. rc.DeflateRect(1, 0, 0, 0);
  112. FillGradient(pDC, rc, RGB(255, 255, 255), ::GetSysColor(COLOR_3DFACE));
  113. }
  114. else
  115. {
  116. CRect rc(rect);
  117. rc.DeflateRect(1, 0, 0, 0);
  118. FillGradient(pDC, rc, RGB(245, 245, 245), ::GetSysColor(COLOR_3DFACE));
  119. }
  120. pDC->SetPixel(rect.left + 1, rect.bottom - 1, AlphaBlendColor(backcolor, 180));
  121. pDC->SetPixel(rect.right - 1, rect.bottom - 1, AlphaBlendColor(backcolor, 180));
  122. pDC->SelectObject(oldpen);
  123. pDC->SetBkMode(TRANSPARENT);
  124. if (m_hIcon != NULL)
  125. {
  126. ::DrawIconEx( pDC->m_hDC, rect.left + 7, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
  127. rect.left += 18;
  128. }
  129. rect.top += 2;
  130. pDC->SetTextColor(RGB(0, 0, 0));
  131. pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
  132. }
  133. break;
  134. case TABMODE_TOPTAB:
  135. {
  136. COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
  137. CPen pen(0, 1, AlphaBlendColor(backcolor, 180));
  138. CPen *oldpen = pDC->SelectObject(&pen);
  139. if (m_nNumber != m_pParentWnd->m_nActivePage)
  140. {
  141. rect.DeflateRect(1, 0);
  142. }
  143. else
  144. {
  145. rect.DeflateRect(-1, 0, -1, -1);
  146. }
  147. pDC->MoveTo(rect.left + 2,  rect.top);
  148. pDC->LineTo(rect.right - 1, rect.top);
  149. pDC->MoveTo(rect.left,  rect.top +2);
  150. pDC->LineTo(rect.left, rect.bottom);
  151. pDC->MoveTo(rect.right,  rect.top + 2);
  152. pDC->LineTo(rect.right, rect.bottom);
  153. if (m_nNumber == m_pParentWnd->m_nActivePage)
  154. {
  155. CRect rc(rect);
  156. rc.DeflateRect(1, 1, 0, 0);
  157. FillGradient(pDC, rc, ::GetSysColor(COLOR_3DFACE), RGB(255, 255, 255));
  158. }
  159. else
  160. {
  161. CRect rc(rect);
  162. rc.DeflateRect(1, 1, 0, 0);
  163. FillGradient(pDC, rc, ::GetSysColor(COLOR_3DFACE), RGB(245, 245, 245));
  164. }
  165. pDC->SetPixel(rect.left + 1, rect.top + 1, AlphaBlendColor(backcolor, 180));
  166. pDC->SetPixel(rect.right - 1, rect.top + 1, AlphaBlendColor(backcolor, 180));
  167. pDC->SelectObject(oldpen);
  168. pDC->SetBkMode(TRANSPARENT);
  169. if (m_hIcon != NULL)
  170. {
  171. ::DrawIconEx( pDC->m_hDC, rect.left + 7, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
  172. rect.left += 18;
  173. }
  174. rect.top += 2;
  175. pDC->SetTextColor(RGB(0, 0, 0));
  176. pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
  177. }
  178. break;
  179. default:
  180. ASSERT(FALSE);
  181. break;
  182. }
  183. }
  184. /*#################################################################
  185. ------------------------
  186.   构建,析构函数
  187. ------------------------
  188.   #################################################################*/
  189. IMPLEMENT_DYNCREATE(CCoolTabCtrl, CWnd)
  190. CCoolTabCtrl::CCoolTabCtrl()
  191. {
  192. m_nActivePage = 0;
  193. m_dwStyle = 0;
  194. m_dwBorderStyle = 0;
  195. m_nHotItem = 0;
  196. m_nMode = TABMODE_NONE;
  197. }
  198. CCoolTabCtrl::~CCoolTabCtrl()
  199. {
  200. int count = m_aTabPage.GetSize();
  201. for (int i = 0; i < count; i++)
  202. {
  203. delete m_aTabPage.GetAt(i);
  204. }
  205. m_aTabPage.RemoveAll();
  206. }
  207. BOOL CCoolTabCtrl::Create(const CRect &rect, CWnd *pParentWnd, UINT dwStyle, UINT dwCtrlStyle, UINT nID)
  208. {
  209. m_dwStyle = dwCtrlStyle;
  210. if (CWnd::Create(AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)GetStockObject(LTGRAY_BRUSH), NULL),
  211.    NULL, dwStyle, rect, pParentWnd, nID))
  212. {
  213. LOGFONT logFont;
  214. ZeroMemory((void*)&logFont,sizeof(logFont));
  215. strcpy(logFont.lfFaceName,"宋体");
  216. logFont.lfHeight = -12;
  217. logFont.lfWeight = 400;
  218. logFont.lfCharSet = GB2312_CHARSET;
  219. logFont.lfOutPrecision = 3;
  220. logFont.lfClipPrecision = 2; 
  221. logFont.lfQuality = 1;
  222. logFont.lfPitchAndFamily = 2;
  223. m_fontWnd.CreateFontIndirect(&logFont);
  224. SetFont(&m_fontWnd);
  225. return TRUE;
  226. }
  227. return FALSE;
  228. }
  229. /*#################################################################
  230. -------------------------------
  231.   消息处理函数
  232.  CCoolTabCtrl message handlers
  233. -------------------------------
  234.   #################################################################*/
  235. BEGIN_MESSAGE_MAP(CCoolTabCtrl, CWnd)
  236. //{{AFX_MSG_MAP(CCoolTabCtrl)
  237. ON_WM_PAINT()
  238. ON_WM_ERASEBKGND()
  239. ON_WM_NCPAINT()
  240. ON_WM_CREATE()
  241. ON_WM_NCCALCSIZE()
  242. ON_WM_WINDOWPOSCHANGING()
  243. ON_WM_NCHITTEST()
  244. ON_WM_NCLBUTTONDOWN()
  245. ON_WM_MOUSEMOVE()
  246. ON_WM_LBUTTONUP()
  247. ON_WM_SIZE()
  248. ON_WM_LBUTTONDOWN()
  249. //}}AFX_MSG_MAP
  250. END_MESSAGE_MAP()
  251. void CCoolTabCtrl::OnPaint() 
  252. {
  253. CPaintDC dc(this); // device context for painting
  254. }
  255. void CCoolTabCtrl::OnNcPaint()
  256. {
  257. CWindowDC windc(this); // device context for painting
  258. int count = m_aTabPage.GetSize();
  259. CRect rcWindow, rcClient;
  260. GetWindowRect(rcWindow);
  261.     GetClientRect(&rcClient);
  262. ClientToScreen(&rcClient);
  263.     rcClient.OffsetRect(-rcWindow.TopLeft());
  264.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  265. if (rcClient.bottom > rcClient.top && rcClient.right > rcClient.left)
  266. {
  267. windc.ExcludeClipRect(rcClient);
  268. }
  269. CMemDC dc(&windc, rcWindow);
  270. CFont *oldfont = dc.SelectObject(&m_fontWnd);
  271. dc.FillSolidRect(rcWindow, ::GetSysColor(COLOR_3DFACE));
  272. switch (m_nMode) 
  273. {
  274. case TABMODE_NONE:
  275. {
  276. DrawBoder(&dc, rcClient);
  277. }
  278. break;
  279. case TABMODE_GROUP:
  280. {
  281. dc.Draw3dRect(rcWindow, RGB(157,157,155), RGB(255,255,255));
  282. }
  283. break;
  284. case TABMODE_BOTTOMTAB:
  285. {
  286. DrawBoder(&dc, rcClient);
  287. }
  288. break;
  289. case TABMODE_TOPTAB:
  290. {
  291. DrawBoder(&dc, rcClient);
  292. }
  293. break;
  294. default:
  295. ASSERT(FALSE);
  296. break;
  297. }
  298. if (m_nMode != TABMODE_NONE && count > 0)
  299. {
  300. for (int i = 0; i < count; i++)
  301. {
  302. if (i != m_nActivePage)
  303. {
  304. m_aTabPage.GetAt(i)->OnDraw(&dc, 0);
  305. }
  306. }
  307. ASSERT(m_nActivePage >= 0 && m_nActivePage < count);
  308. if (m_nActivePage >= 0 && m_nActivePage < count)
  309. {
  310. m_aTabPage.GetAt(m_nActivePage)->OnDraw(&dc, 0);
  311. }
  312. }
  313. dc.SelectObject(oldfont);
  314. }
  315. BOOL CCoolTabCtrl::OnEraseBkgnd(CDC* pDC) 
  316. {
  317. CRect rect;
  318. GetClientRect(rect);
  319. // pDC->FillSolidRect(rect, RGB(255, 255, 255));
  320. return TRUE;
  321. }
  322. int CCoolTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  323. {
  324. if (CWnd::OnCreate(lpCreateStruct) == -1)
  325. return -1;
  326. return 0;
  327. }
  328. void CCoolTabCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
  329. {
  330. CRect rect(lpncsp->rgrc[0]);
  331. switch (m_nMode) 
  332. {
  333. case TABMODE_NONE:
  334. rect.DeflateRect(2, 2, 4, 4);
  335. break;
  336. case TABMODE_GROUP:
  337. {
  338. rect.DeflateRect(1, 1);
  339. int count = m_aTabPage.GetSize();
  340. if (count > 0 && m_nActivePage >= 0 && m_nActivePage < count)
  341. {
  342. rect.top += (m_nActivePage + 1) * 18;
  343. rect.bottom -= (count - m_nActivePage - 1) * 18;
  344. }
  345. }
  346. break;
  347. case TABMODE_BOTTOMTAB:
  348. rect.DeflateRect(2, 2, 4, 20);
  349. break;
  350. case TABMODE_TOPTAB:
  351. rect.DeflateRect(2, 20, 4, 4);
  352. break;
  353. default:
  354. break;
  355. }
  356. lpncsp->rgrc[0] = rect;
  357. }
  358. void CCoolTabCtrl::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
  359. {
  360. lpwndpos->flags |= SWP_FRAMECHANGED;
  361. CWnd::OnWindowPosChanging(lpwndpos);
  362. }
  363. UINT CCoolTabCtrl::OnNcHitTest(CPoint point) 
  364. {
  365. return HTCAPTION;
  366. }
  367. void CCoolTabCtrl::OnNcLButtonDown(UINT nHitTest, CPoint point) 
  368. {
  369. SetCapture();//获得鼠标的输入行为
  370. CRect rcWindow;
  371. GetWindowRect(rcWindow);
  372. int count = m_aTabPage.GetSize();
  373. for (int i = 0; i < count; i++)
  374. {
  375. CRect rect = m_aTabPage.GetAt(i)->m_rcLabel;
  376. rect.OffsetRect(rcWindow.TopLeft());
  377. if (rect.PtInRect(point))
  378. {
  379. m_nHotItem = i;
  380. m_aTabPage.GetAt(i)->m_dwState = 1;
  381. SendMessage(WM_NCPAINT);
  382. break;
  383. }
  384. }
  385. PlayResource(IDR_CLICK);//播放声音
  386. }
  387. BOOL CCoolTabCtrl::PlayResource(WORD wResourceID)
  388. {
  389. // Get the handle to the current instance of the application
  390. HINSTANCE hInstance = AfxGetInstanceHandle();
  391.     ASSERT (hInstance != NULL);
  392. // Find the WAVE resource
  393. HRSRC hResInfo = 
  394. FindResource(hInstance, MAKEINTRESOURCE(wResourceID), _T("WAVE"));
  395. if(hResInfo == NULL)
  396. return FALSE;
  397. // Load the WAVE resource
  398.     HANDLE hRes = LoadResource(hInstance, hResInfo);
  399. if (hRes == NULL)
  400. return FALSE;
  401.     
  402. // Lock the WAVE resource and play it
  403.     LPSTR lpRes = (LPSTR) LockResource(hRes);
  404. if(lpRes==NULL)
  405. return FALSE;
  406.     
  407. if (sndPlaySound(lpRes, SND_MEMORY | SND_ASYNC) == NULL)
  408. return FALSE;
  409.     // Free the WAVE resource and return success or failure.
  410.     FreeResource(hRes);
  411. return TRUE;
  412. }
  413. void CCoolTabCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  414. {
  415. ClientToScreen(&point);
  416. int count = m_aTabPage.GetSize();
  417. if ((nFlags & VK_LBUTTON) && m_nHotItem >= 0 && m_nHotItem < count)
  418. {
  419. CRect rcWindow;
  420. GetWindowRect(rcWindow);
  421. CRect rect = m_aTabPage.GetAt(m_nHotItem)->m_rcLabel;
  422. rect.OffsetRect(rcWindow.TopLeft());
  423. UINT state = rect.PtInRect(point) ? 1 : 0;
  424. if (m_aTabPage.GetAt(m_nHotItem)->m_dwState != state)
  425. {
  426. m_aTabPage.GetAt(m_nHotItem)->m_dwState = state;
  427. SendMessage(WM_NCPAINT);
  428. }
  429. }
  430. CWnd::OnMouseMove(nFlags, point);
  431. }
  432. void CCoolTabCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  433. {
  434. ReleaseCapture();
  435. int count = m_aTabPage.GetSize();
  436. if (m_nHotItem >= 0 && m_nHotItem < count)
  437. {
  438. ClientToScreen(&point);
  439. CRect rcWindow;
  440. GetWindowRect(rcWindow);
  441. CRect rect = m_aTabPage.GetAt(m_nHotItem)->m_rcLabel;
  442. rect.OffsetRect(rcWindow.TopLeft());
  443. m_aTabPage.GetAt(m_nHotItem)->m_dwState = 0;
  444. if (rect.PtInRect(point) && m_nHotItem != m_nActivePage)
  445. {
  446. SetActivePage(m_nHotItem);
  447. AutoSize();
  448. }
  449. SendMessage(WM_NCPAINT);
  450. }
  451. CWnd::OnLButtonUp(nFlags, point);
  452. }
  453. /*#################################################################
  454. -------------------------------
  455. 控件尺寸处理函数
  456.   CCoolTabCtrl size handlers
  457. -------------------------------
  458.   #################################################################*/
  459. void CCoolTabCtrl::AutoSize()
  460. {
  461. int count = m_aTabPage.GetSize();
  462. if (count == 0) return;
  463. CTabPageItem* page = NULL;
  464. if (m_nMode == TABMODE_GROUP && GetSafeHwnd() != NULL)
  465. {
  466. //强迫窗口重新计算非客户区大小-----------------------------
  467. SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOACTIVATE);
  468. }
  469. CRect rcWindow, rcClient;
  470. GetWindowRect(rcWindow);
  471. GetClientRect(rcClient);
  472. rcWindow.OffsetRect(-rcWindow.TopLeft());
  473. switch (m_nMode) 
  474. {
  475. case TABMODE_NONE:
  476. {
  477. for (int i = 0; i < count; i++)
  478. {
  479. page = m_aTabPage.GetAt(i);
  480. if (i != m_nActivePage)
  481. {
  482. page->Hide();
  483. }
  484. else
  485. {
  486. GetClientRect(rcWindow);
  487. page->SetRect(rcWindow);
  488. page->Expend();
  489. }
  490. }
  491. }
  492. break;
  493. case TABMODE_GROUP:
  494. {
  495. rcWindow.DeflateRect(1, 1);
  496. for (int i = 0; i < count; i++)
  497. {
  498. page = m_aTabPage.GetAt(i);
  499. if (i != m_nActivePage)
  500. {
  501. page->m_rcLabel = rcWindow;
  502. if (m_nActivePage > i)
  503. {
  504. page->m_rcLabel.top += (i * 18);
  505. page->m_rcLabel.bottom = page->m_rcLabel.top + 18;
  506. }
  507. else
  508. {
  509. page->m_rcLabel.bottom -= 18 * (count - i - 1);
  510. page->m_rcLabel.top = page->m_rcLabel.bottom - 18;
  511. }
  512. page->m_rect = rcClient;
  513. page->Hide();
  514. }
  515. else
  516. {
  517. page->m_rcLabel = rcWindow;
  518. page->m_rcLabel.top += (i * 18);
  519. page->m_rcLabel.bottom = page->m_rcLabel.top + 18;
  520. page->m_rect = rcClient;
  521. page->Expend();
  522. }
  523. }
  524. }
  525. break;
  526. case TABMODE_BOTTOMTAB:
  527. {
  528. CRect rc(rcWindow);
  529. rc.right =  1;
  530. for (int i = 0; i < count; i++)
  531. {
  532. page = m_aTabPage.GetAt(i);
  533. if (i != m_nActivePage)
  534. {
  535. page->Hide();
  536. }
  537. else
  538. {
  539. page->SetRect(rcClient);
  540. page->Expend();
  541. }
  542. rc.top = rc.bottom - 18;
  543. rc.left = rc.right;
  544. rc.right = rc.left + 6 * page->m_strText.GetLength() + 10;
  545. if (page->m_hIcon != NULL) rc.right += 20;
  546. page->m_rcLabel = rc;
  547. }
  548. }
  549. break;
  550. case TABMODE_TOPTAB:
  551. {
  552. CRect rc(rcWindow);
  553. rc.right = 1;
  554. for (int i = 0; i < count; i++)
  555. {
  556. page = m_aTabPage.GetAt(i);
  557. if (i != m_nActivePage)
  558. {
  559. page->Hide();
  560. }
  561. else
  562. {
  563. page->SetRect(rcClient);
  564. page->Expend();
  565. }
  566. rc.bottom = rc.top + 18;
  567. rc.left = rc.right;
  568. rc.right = rc.left + 6 * page->m_strText.GetLength() + 10;
  569. if (page->m_hIcon != NULL) rc.right += 20;
  570. page->m_rcLabel = rc;
  571. }
  572. }
  573. break;
  574. default:
  575. ASSERT(FALSE);
  576. break;
  577. }
  578. }
  579. /*#################################################################
  580. -------------------------------
  581. 控件页面处理函数
  582.   CCoolTabCtrl page handlers
  583. -------------------------------
  584.   #################################################################*/
  585. BOOL CCoolTabCtrl::AddPage(CRuntimeClass *pClass, UINT nIDTemplate, LPCTSTR strText, UINT IconID)
  586. {
  587. CDialog *pDlg = (CDialog*)pClass->CreateObject();
  588. if (pDlg != NULL && pDlg->Create(nIDTemplate, this))
  589. {
  590. CTabPageItem *pItem;
  591. pItem = new CTabPageItem(this, (CWnd*)pDlg, strText, m_aTabPage.GetSize());
  592. if(IconID != NULL)
  593. {
  594. pItem->SetIcon(AfxGetApp()->LoadIcon(IconID));
  595. }
  596. m_aTabPage.Add(pItem);
  597. AutoSize();
  598. return TRUE;
  599. }
  600. return FALSE;
  601. }
  602. BOOL CCoolTabCtrl::AddPage(CWnd *pWnd, LPCTSTR strText, UINT IconID)
  603. {
  604. if (pWnd != NULL)
  605. {
  606. CTabPageItem *pItem;
  607. pItem = new CTabPageItem(this, pWnd, strText, m_aTabPage.GetSize());
  608. if(IconID != NULL)
  609. {
  610. pItem->SetIcon(AfxGetApp()->LoadIcon(IconID));
  611. }
  612. m_aTabPage.Add(pItem);
  613. AutoSize();
  614. return TRUE;
  615. }
  616. return FALSE;
  617. }
  618. void CCoolTabCtrl::SetCtrlStyle(DWORD dwStyle)
  619. {
  620. m_dwStyle = dwStyle;
  621. }
  622. void CCoolTabCtrl::SetBorderStyle(DWORD dwStyle)
  623. {
  624. m_dwBorderStyle = dwStyle;
  625. }
  626. void CCoolTabCtrl::SetActivePage(int nindex)
  627. {
  628. if (m_nActivePage >= 0 && m_nActivePage < m_aTabPage.GetSize())
  629. {
  630. m_nActivePage = nindex;
  631. AutoSize();
  632. }
  633. }
  634. void CCoolTabCtrl::SetMode(int nMode)
  635. {
  636. if (nMode >= 0 && nMode <= TABMODE_BOTTOMTAB)
  637. {
  638. m_nMode = nMode;
  639. if (GetSafeHwnd() != NULL)
  640. {
  641. AutoSize();
  642. }
  643. }
  644. }
  645. CWnd* CCoolTabCtrl::GetPage(int number)
  646. {
  647. if (number >= 0 && number < m_aTabPage.GetSize())
  648. {
  649. return m_aTabPage.GetAt(number)->m_pWnd;
  650. }
  651. return NULL;
  652. }
  653. void CCoolTabCtrl::DrawBoder(CDC *pDC, CRect rect)
  654. {
  655. COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
  656. rect.InflateRect(1, 1);
  657. pDC->Draw3dRect(rect, RGB(255, 255, 255), RGB(255, 255, 255));
  658. rect.InflateRect(1, 1);
  659. pDC->Draw3dRect(rect, AlphaBlendColor(backcolor, 180), AlphaBlendColor(backcolor, 180));
  660. CPen pen(0, 1, AlphaBlendColor(backcolor, 220));
  661. CPen *oldpen = pDC->SelectObject(&pen);
  662. pDC->MoveTo(rect.left,rect.bottom);
  663. pDC->LineTo(rect.right, rect.bottom);
  664. pDC->MoveTo(rect.right, rect.top);
  665. pDC->LineTo(rect.right, rect.bottom);
  666. pen.DeleteObject();
  667. pen.CreatePen(0, 1, AlphaBlendColor(backcolor, 245));
  668. pDC->SelectObject(&pen);
  669. pDC->MoveTo(rect.left + 1,rect.bottom + 1);
  670. pDC->LineTo(rect.right - 1, rect.bottom + 1);
  671. pDC->MoveTo(rect.right + 1, rect.top + 1);
  672. pDC->LineTo(rect.right + 1, rect.bottom);
  673. pDC->SelectObject(oldpen);
  674. }
  675. void CCoolTabCtrl::OnSize(UINT nType, int cx, int cy) 
  676. {
  677. CWnd::OnSize(nType, cx, cy);
  678. if (GetSafeHwnd() != NULL)
  679. {
  680. AutoSize();
  681. }
  682. }
  683. void CCoolTabCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  684. {
  685. // TODO: Add your message handler code here and/or call default
  686. CWnd::OnLButtonDown(nFlags, point);
  687. }