XPTabDlg.cpp
上传用户:tangjiazm
上传日期:2007-07-14
资源大小:4295k
文件大小:8k
源码类别:

Tab控件

开发平台:

Visual C++

  1. /***********************************************************************************************************/
  2. // XPTabDlg.cpp : implementation file
  3. /***********************************************************************************************************/
  4. #include "StdAfx.h"
  5. #include "Resource.h"
  6. #include "XPTabDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. LPCSTR g_szProfile= "XPTabDlg";
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CXPTabDlg dialog
  15. CXPTabDlg::CXPTabDlg(CWnd* pParent /*=NULL*/)
  16. : CDialog(CXPTabDlg::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CXPTabDlg)
  19. m_bTabExtended = 0;
  20. m_eTabOrientation =0;
  21. //}}AFX_DATA_INIT
  22. CWinApp* pApp=AfxGetApp();
  23. m_hIcon = pApp->LoadIcon(IDR_MAINFRAME);
  24. // Optional: restore state from the registry
  25. if(!IsThemeActiveXP()) m_bTabExtended=FALSE;
  26. else m_bTabExtended=pApp->GetProfileInt(g_szProfile, "TabExtended",TRUE);
  27. m_eTabOrientation  =pApp->GetProfileInt(g_szProfile, "TabOrientation",e_tabBottom);
  28. }
  29. /////////////////////////////////////////////////////////////////////////////
  30. void CXPTabDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialog::DoDataExchange(pDX);
  33. //{{AFX_DATA_MAP(CXPTabDlg)
  34. DDX_Control(pDX, IDC_TAB_XP, m_tabCtrl);
  35. DDX_Radio(pDX, IDC_TAB_STANDARD, m_bTabExtended);
  36. DDX_Radio(pDX, IDC_TAB_TOP, m_eTabOrientation);
  37. //}}AFX_DATA_MAP
  38. }
  39. /////////////////////////////////////////////////////////////////////////////
  40. BEGIN_MESSAGE_MAP(CXPTabDlg, CDialog)
  41. //{{AFX_MSG_MAP(CXPTabDlg)
  42. ON_WM_SYSCOMMAND()
  43. ON_BN_CLICKED(IDC_TAB_STANDARD, OnTabExtended)
  44. ON_BN_CLICKED(IDC_TAB_EXTENDED, OnTabExtended)
  45. ON_BN_CLICKED(IDC_TAB_TOP,   OnTabOrientation)
  46. ON_BN_CLICKED(IDC_TAB_BOTTOM,OnTabOrientation)
  47. ON_BN_CLICKED(IDC_TAB_LEFT,  OnTabOrientation)
  48. ON_BN_CLICKED(IDC_TAB_RIGHT, OnTabOrientation)
  49. //}}AFX_MSG_MAP
  50. ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnNeedText) // Optional tab tootips
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. #define IDM_ABOUTBOX 0x0010
  54. // CXPTabDlg message handlers
  55. BOOL CXPTabDlg::OnInitDialog()
  56. {
  57. CDialog::OnInitDialog();
  58. //--------------------------
  59. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); // Add "About..." menu item to system menu.
  60. ASSERT(IDM_ABOUTBOX < 0xF000); // IDM_ABOUTBOX must be in the system command range.
  61. CMenu* pSysMenu = GetSystemMenu(FALSE);
  62. if (pSysMenu != NULL)
  63. { CString strAboutMenu((LPCTSTR)IDS_ABOUTBOX);
  64. if(!strAboutMenu.IsEmpty())
  65. { pSysMenu->AppendMenu(MF_SEPARATOR);
  66. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  67. pSysMenu->RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);
  68. pSysMenu->RemoveMenu(SC_SIZE, MF_BYCOMMAND);
  69. } }
  70. SetIcon(m_hIcon, TRUE); // Set big icon
  71. SetIcon(m_hIcon, FALSE); // Set small icon
  72. //--------------------------
  73. m_tabCtrl.InitImageList(IDB_TABIMAGES); // only necessary to call if tabs have images
  74. m_tabCtrl.InsertItem(0, "Tab 1", 0); // add some test pages to the tab
  75. m_tabCtrl.InsertItem(1, "Tab 2", 1);
  76. m_tabCtrl.InsertItem(2, "Tab 3", 2);
  77. m_tabCtrl.InsertItem(3, "Tab 4", 3);
  78. TabExtended(m_bTabExtended); // Switching on/off windows tab extension (default is "on")
  79. //--------------------------
  80. // Optional: for Themes XP dialogs: enable Themes dialog texture
  81. EnableThemeDialogTexture(GetSafeHwnd());
  82. return TRUE;
  83. }
  84. /////////////////////////////////////////////////////////////////////////////
  85. // enable/disable tab control to be extended
  86. void CXPTabDlg::TabExtended(BOOL bTabExtended)
  87. {
  88. m_tabCtrl.SetExtended(bTabExtended);
  89. TabOrientation((ETabOrientation)m_eTabOrientation); // update orientation
  90. RedrawTab();
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // change tab control orientation
  94. void CXPTabDlg::TabOrientation(ETabOrientation eTabOrientation) 
  95. {
  96. m_tabCtrl.ModifyStyle(TCS_VERTICAL|TCS_BOTTOM|TCS_MULTILINE,(eTabOrientation&1?TCS_BOTTOM:0) | 
  97. (eTabOrientation>e_tabBottom?(TCS_VERTICAL|(m_bTabExtended && IsThemeActiveXP()?0:TCS_MULTILINE)):0));
  98. CWnd* pWnd=GetDlgItem(IDC_TAB_EXTENDED);
  99. if(pWnd) pWnd->EnableWindow(IsThemeActiveXP()?TRUE:FALSE);
  100. }
  101. /////////////////////////////////////////////////////////////////////////////
  102. void CXPTabDlg::RedrawTab() 
  103. {
  104. CWnd* pWnd=GetDlgItem(IDC_TAB_XP);
  105. if(pWnd)
  106. { CRect rcInv;
  107. pWnd->GetWindowRect(rcInv); ScreenToClient(rcInv);
  108. InvalidateRect(rcInv);
  109. }
  110. else Invalidate();
  111. }
  112. /////////////////////////////////////////////////////////////////////////////
  113. void CXPTabDlg::OnTabExtended() 
  114. {
  115. BOOL bTabExtendedOld=m_bTabExtended;
  116. UpdateData();
  117. if(bTabExtendedOld!=m_bTabExtended)
  118. TabExtended(m_bTabExtended);
  119. }
  120. /////////////////////////////////////////////////////////////////////////////
  121. void CXPTabDlg::OnTabOrientation() 
  122. {
  123. UpdateData();
  124. TabOrientation((ETabOrientation)m_eTabOrientation);
  125. RedrawTab();
  126. }
  127. //////////////////////////////////////////////////////////////////////////////
  128. // Optional: tab tootips
  129. BOOL CXPTabDlg::OnNeedText(UINT id, NMHDR * pNotifyStruct, LRESULT * result)
  130. {
  131. static CString c_sLastToolTip;
  132.     TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNotifyStruct;
  133.     UINT nID =pNotifyStruct->idFrom;
  134.     if (pTTT->uFlags & TTF_IDISHWND)   // idFrom is actually the HWND of the tool
  135.         nID = ::GetDlgCtrlID((HWND)nID);
  136.     //if(nID!=IDC_TAB_XP) return FALSE;
  137.     
  138. TCHITTESTINFO hti; hti.flags=0;
  139. ::GetCursorPos(&hti.pt); m_tabCtrl.ScreenToClient(&hti.pt);
  140. int ixItem=m_tabCtrl.HitTest(&hti);
  141.     if(ixItem<0)
  142. return FALSE;
  143. TC_ITEM tci; tci.mask=TCIF_TEXT;
  144. tci.pszText=c_sLastToolTip.GetBuffer(128);
  145. tci.cchTextMax=127;
  146. m_tabCtrl.GetItem(ixItem,&tci);
  147. c_sLastToolTip.ReleaseBuffer();
  148.     if(c_sLastToolTip.GetLength()<0)
  149. return FALSE;
  150. pTTT->hinst=NULL;
  151. pTTT->lpszText=(char*)(LPCSTR)c_sLastToolTip;
  152. return TRUE;
  153. }
  154. /////////////////////////////////////////////////////////////////////////////
  155. // Optional: save state to the registry
  156. BOOL CXPTabDlg::DestroyWindow() 
  157. {
  158. CWinApp* pApp=AfxGetApp();
  159. pApp->WriteProfileInt(g_szProfile, "TabExtended", m_bTabExtended);
  160. pApp->WriteProfileInt(g_szProfile, "TabOrientation",m_eTabOrientation);
  161. return CDialog::DestroyWindow();
  162. }
  163. /////////////////////////////////////////////////////////////////////////////
  164. void CXPTabDlg::OnSysCommand(UINT nID, LPARAM lParam)
  165. {
  166. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  167. {
  168. CAboutDlg dlgAbout;
  169. dlgAbout.DoModal();
  170. }
  171. else
  172. CDialog::OnSysCommand(nID, lParam);
  173. }
  174. /***********************************************************************************************************/
  175. // CAboutDlg dialog used for App About
  176. /***********************************************************************************************************/
  177. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  178. {
  179. //{{AFX_DATA_INIT(CAboutDlg)
  180. //}}AFX_DATA_INIT
  181. }
  182. /////////////////////////////////////////////////////////////////////////////
  183. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  184. {
  185. CDialog::DoDataExchange(pDX);
  186. //{{AFX_DATA_MAP(CAboutDlg)
  187. //}}AFX_DATA_MAP
  188. }
  189. /////////////////////////////////////////////////////////////////////////////
  190. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  191. //{{AFX_MSG_MAP(CAboutDlg)
  192. //}}AFX_MSG_MAP
  193. END_MESSAGE_MAP()
  194. /***********************************************************************************************************/
  195. // Helper functions
  196. /***********************************************************************************************************/
  197. // constant string definitions here (or you can put it into resource string table)
  198. #define IDS_UTIL_UXTHEME        "UxTheme.dll"
  199. #define IDS_UTIL_THEMETEXTURE   "EnableThemeDialogTexture"
  200. /////////////////////////////////////////////////////////////////////////////
  201. void EnableThemeDialogTexture(HWND hwndDlg)
  202. {
  203. HINSTANCE hDll=LoadLibrary(CString((LPCTSTR)IDS_UTIL_UXTHEME)); // 'UxTheme.dll'
  204. if(hDll==NULL)
  205. return; // the DLL won't be available on anything except Windows XP
  206. ULONG (PASCAL *lpfnEnableTheme)(HWND, DWORD);
  207. (FARPROC&)lpfnEnableTheme=GetProcAddress(hDll,CString((LPCTSTR)IDS_UTIL_THEMETEXTURE)); // 'EnableThemeDialogTexture'
  208. if(lpfnEnableTheme)
  209. lpfnEnableTheme(hwndDlg, 6); // ETDT_ENABLETAB = (ETDT_ENABLE | ETDT_USETABTEXTURE) = (2|4) = 6
  210. else ASSERT(FALSE);
  211. FreeLibrary(hDll);
  212. }
  213. /***********************************************************************************************************/
  214. //
  215. /***********************************************************************************************************/