XTGlobal.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:14k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTGlobal.cpp : implementation of the CXTAuxData struct.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/Resource.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/XTPVersion.h"
  25. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  26. #include "Common/XTPResourceManager.h"
  27. #include "Common/XTPColorManager.h"
  28. #include "Common/XTPSystemHelpers.h"
  29. #include "XTGlobal.h"
  30. #include "XTThemeManager.h"
  31. #ifdef _DEBUG
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #define new DEBUG_NEW
  35. #endif
  36. //=============================================================================
  37. // CXTNonClientMetrics
  38. //=============================================================================
  39. CXTNonClientMetrics::CXTNonClientMetrics()
  40. {
  41. ::ZeroMemory(this, sizeof(NONCLIENTMETRICS));
  42. cbSize = sizeof(NONCLIENTMETRICS);
  43. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
  44. sizeof(NONCLIENTMETRICS), this, 0));
  45. }
  46. //=============================================================================
  47. // CXTFontManager
  48. //=============================================================================
  49. CXTLogFont::CXTLogFont()
  50. : dwType(0)
  51. {
  52. ::ZeroMemory(this, sizeof(CXTLogFont));
  53. }
  54. CXTLogFont::CXTLogFont(LOGFONT& logfont)
  55. : dwType(0)
  56. {
  57. MEMCPY_S((void*)&*this, (const void*)&logfont, (DWORD)sizeof(LOGFONT));
  58. }
  59. void CXTLogFont::operator=(LOGFONT& logfont)
  60. {
  61. MEMCPY_S((void*)&*this, (const void*)&logfont, (DWORD)sizeof(LOGFONT));
  62. }
  63. //////////////////////////////////////////////////////////////////////////
  64. // CXTAuxDataTheme
  65. CXTAuxDataTheme::operator BOOL()
  66. {
  67. return XTThemeManager()->GetTheme() == xtThemeDefault ? FALSE : TRUE;
  68. }
  69. BOOL CXTAuxDataTheme::operator=(BOOL bXPMode)
  70. {
  71. XTThemeManager()->SetTheme(bXPMode ? xtThemeOfficeXP : xtThemeDefault);
  72. return bXPMode;
  73. }
  74. //=============================================================================
  75. // CXTAuxData
  76. //=============================================================================
  77. CXTAuxData::CXTAuxData()
  78. {
  79. iComCtlVersion = -1;
  80. hcurDragCopy = NULL;
  81. hcurDragMove = NULL;
  82. hcurDragNone = NULL;
  83. hcurHand = NULL;
  84. hcurHSplitBar = NULL;
  85. hcurVSplitBar = NULL;
  86. hcurMove = NULL;
  87. bUseOfficeFont = FALSE;
  88. bUseSolidShadows = FALSE;
  89. bMenuShadows = TRUE;
  90. bWin95 = XTOSVersionInfo()->IsWin95();
  91. bWin98 = XTOSVersionInfo()->IsWin98();
  92. bWinNT = XTOSVersionInfo()->IsWinNT4();
  93. bWin2K = XTOSVersionInfo()->IsWin2K();
  94. bWinXP = XTOSVersionInfo()->IsWinXP();
  95. // Internet Explorer 4.0 or higher.
  96. GetComCtlVersion();
  97. VERIFY(IsComCtlValid());
  98. UpdateSysColors();
  99. UpdateSysMetrics();
  100. // Load cursors and fonts.
  101. LoadSysCursors();
  102. LoadSysFonts();
  103. }
  104. CXTAuxData::~CXTAuxData()
  105. {
  106. FreeSysFonts();
  107. }
  108. // If LoadCursors() returns FALSE and your application is linking to the
  109. // static version of the library you most likely need to include the following
  110. // line in your .rc2 file: #include "XTResourcePro.rc".  This name will vary
  111. // depending on the library you are linking to.
  112. BOOL CXTAuxData::LoadSysCursors()
  113. {
  114. hcurDragNone = XTPResourceManager()->LoadCursor(XT_IDC_DRAGNONE);
  115. if (hcurDragNone == NULL)
  116. return FALSE;
  117. hcurDragCopy = XTPResourceManager()->LoadCursor(XT_IDC_DRAGCOPY);
  118. if (hcurDragCopy == NULL)
  119. return FALSE;
  120. hcurDragMove = XTPResourceManager()->LoadCursor(XT_IDC_DRAGMOVE);
  121. if (hcurDragMove == NULL)
  122. return FALSE;
  123. hcurHand = AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649));
  124. if (hcurHand == NULL)
  125. hcurHand = XTPResourceManager()->LoadCursor(XTP_IDC_HAND);
  126. if (hcurHand == NULL)
  127. return FALSE;
  128. hcurHSplitBar = XTPResourceManager()->LoadCursor(XTP_IDC_HSPLITBAR);
  129. if (hcurHSplitBar == NULL)
  130. return FALSE;
  131. hcurVSplitBar = XTPResourceManager()->LoadCursor(XTP_IDC_VSPLITBAR);
  132. if (hcurVSplitBar == NULL)
  133. return FALSE;
  134. hcurMove = AfxGetApp()->LoadStandardCursor(IDC_SIZEALL);
  135. if (hcurMove == NULL)
  136. return FALSE;
  137. return TRUE;
  138. }
  139. void CXTAuxData::UpdateSysColors()
  140. {
  141. RefreshXtremeColors();
  142. // Initialize standard color for windows components.
  143. clr3DFace = GetXtremeColor(COLOR_3DFACE);
  144. clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);
  145. clr3DDkShadow = GetXtremeColor(COLOR_3DDKSHADOW);
  146. clr3DHilight = GetXtremeColor(COLOR_3DHILIGHT);
  147. clr3DLight = GetXtremeColor(COLOR_3DLIGHT);
  148. clrBtnText = GetXtremeColor(COLOR_BTNTEXT);
  149. clrGrayText = GetXtremeColor(COLOR_GRAYTEXT);
  150. clrHighlight = GetXtremeColor(COLOR_HIGHLIGHT);
  151. clrHighlightText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
  152. clrMenu = GetXtremeColor(COLOR_MENU);
  153. clrMenuText = GetXtremeColor(COLOR_MENUTEXT);
  154. clrWindow = GetXtremeColor(COLOR_WINDOW);
  155. clrWindowFrame = GetXtremeColor(COLOR_WINDOWFRAME);
  156. clrWindowText = GetXtremeColor(COLOR_WINDOWTEXT);
  157. clrActiveCaption = GetXtremeColor(COLOR_ACTIVECAPTION);
  158. clrInActiveCaption = GetXtremeColor(COLOR_INACTIVECAPTION);
  159. clrGradActiveCapt = GetXtremeColor(COLOR_GRADIENTACTIVECAPTION);
  160. clrGradInActiveCapt = GetXtremeColor(COLOR_GRADIENTINACTIVECAPTION);
  161. clrActiveCaptText = GetXtremeColor(COLOR_CAPTIONTEXT);
  162. clrInactiveCaptText = GetXtremeColor(COLOR_INACTIVECAPTIONTEXT);
  163. // Initialize special colors for XP style interfaces.
  164. clrXPBarFace = GetXtremeColor(XPCOLOR_TOOLBAR_FACE);
  165. clrXPHighlight = GetXtremeColor(XPCOLOR_HIGHLIGHT);
  166. clrXPHighlightBorder = GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER);
  167. clrXPHighlightPushed = GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED);
  168. clrXPIconShadow = GetXtremeColor(XPCOLOR_ICONSHADDOW);
  169. clrXPGrayText = GetXtremeColor(XPCOLOR_GRAYTEXT);
  170. clrXPHighlightChecked = GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED);
  171. clrXPHighlightCheckedBorder = GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED_BORDER);
  172. clrXPGripper = GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER);
  173. clrXPSeparator = GetXtremeColor(XPCOLOR_SEPARATOR);
  174. clrXPDisabled = GetXtremeColor(XPCOLOR_DISABLED);
  175. clrXPMenuTextBack = GetXtremeColor(XPCOLOR_MENUBAR_FACE);
  176. clrXPMenuExpanded = GetXtremeColor(XPCOLOR_MENUBAR_EXPANDED);
  177. clrXPMenuBorder = GetXtremeColor(XPCOLOR_MENUBAR_BORDER);
  178. clrXPMenuText = GetXtremeColor(XPCOLOR_MENUBAR_TEXT);
  179. clrXPHighlightText = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
  180. clrXPBarText = GetXtremeColor(XPCOLOR_TOOLBAR_TEXT);
  181. clrXPBarTextPushed = GetXtremeColor(XPCOLOR_PUSHED_TEXT);
  182. clrXPTabInactiveBack = GetXtremeColor(XPCOLOR_TAB_INACTIVE_BACK);
  183. clrXPTabInactiveText = GetXtremeColor(XPCOLOR_TAB_INACTIVE_TEXT);
  184. }
  185. void CXTAuxData::UpdateSysMetrics()
  186. {
  187. cxSmIcon = ::GetSystemMetrics(SM_CXSMICON);
  188. cySmIcon = ::GetSystemMetrics(SM_CYSMICON);
  189. cxHThumb = ::GetSystemMetrics(SM_CXHTHUMB);
  190. cyVThumb = ::GetSystemMetrics(SM_CYVTHUMB);
  191. cyMenuItem = ::GetSystemMetrics(SM_CYMENU);
  192. cxSize = 18; //::GetSystemMetrics(SM_CXSIZE);
  193. cySize = 18; //::GetSystemMetrics(SM_CYSIZE);
  194. }
  195. BOOL CXTAuxData::LoadSysFonts(LPCTSTR strHorzFaceName/*= _T("")*/, LPCTSTR strVertFaceName/*= _T("")*/)
  196. {
  197. CString strFaceTahoma(_T("Tahoma"));
  198. CString strFaceArial(_T("Arial"));
  199. // Free up any resources previously allocated.
  200. FreeSysFonts();
  201. CXTNonClientMetrics ncm;
  202. LOGFONT lfMenuFont;
  203. MEMCPY_S(&lfMenuFont, &ncm.lfMenuFont, sizeof(LOGFONT));
  204. if (strHorzFaceName != NULL)
  205. {
  206. if (FontExists(strHorzFaceName))
  207. {
  208. STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
  209. STRCPY_S(ncm.lfStatusFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
  210. STRCPY_S(ncm.lfSmCaptionFont.lfFaceName, LF_FACESIZE, strHorzFaceName);
  211. }
  212. }
  213. // check to see if we can use the "Tahoma" font.
  214. else if (bUseOfficeFont && !(ncm.lfMenuFont.lfCharSet > SYMBOL_CHARSET))
  215. {
  216. if (FontExists(strFaceTahoma))
  217. {
  218. STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strFaceTahoma);
  219. }
  220. }
  221. // create the menu fonts.
  222. if (!CreateSysFont(lfMenuFont, font))
  223. return FALSE;
  224. if (!CreateSysFont(lfMenuFont, fontBold, FW_BOLD))
  225. return FALSE;
  226. if (!CreateSysFont(lfMenuFont, fontULine, -1, 1))
  227. return FALSE;
  228. // If the "Tahoma" font is not used see if we can use "Arial" for vertical
  229. // fonts because it displays better than MS Sans Serif on older operating
  230. // systems...
  231. if (strVertFaceName != NULL)
  232. {
  233. if (FontExists(strVertFaceName))
  234. {
  235. STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strVertFaceName);
  236. }
  237. }
  238. else if (strFaceTahoma.CompareNoCase(ncm.lfMenuFont.lfFaceName) != 0)
  239. {
  240. if (FontExists(strFaceArial))
  241. {
  242. STRCPY_S(lfMenuFont.lfFaceName, LF_FACESIZE, strFaceArial);
  243. }
  244. }
  245. // create the vertical menu fonts.
  246. if (!CreateSysFont(lfMenuFont, fontVert, -1, -1, 900, 2700))
  247. return FALSE;
  248. if (!CreateSysFont(lfMenuFont, fontVertBold, FW_BOLD, -1, 900, 2700))
  249. return FALSE;
  250. // create the icon title fonts.
  251. CXTLogFont lfIconTitleFont;
  252. VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT,
  253. sizeof(LOGFONT), &lfIconTitleFont, 0));
  254. if (!CreateSysFont(lfIconTitleFont, fontIconTitle))
  255. return FALSE;
  256. if (!CreateSysFont(lfIconTitleFont, fontIconTitleBold, FW_BOLD))
  257. return FALSE;
  258. // Create the status bar font.
  259. if (!CreateSysFont(ncm.lfStatusFont, fontStatus))
  260. return FALSE;
  261. // Create the small caption font.
  262. if (!CreateSysFont(ncm.lfSmCaptionFont, fontSmCaption))
  263. return FALSE;
  264. // Create the marlett icon font.
  265. LOGFONT lfMarlettIcon = {lfIconTitleFont.lfHeight, 0, 0, 0, 0, 0, 0, 0,
  266. DEFAULT_CHARSET, 0, 0, 0, 0, _T("Marlett")};
  267. if (!CreateSysFont(lfMarlettIcon, fontMarlettIcon))
  268. return FALSE;
  269. return TRUE;
  270. }
  271. void CXTAuxData::FreeSysFonts()
  272. {
  273. if (font.GetSafeHandle())
  274. font.DeleteObject();
  275. if (fontBold.GetSafeHandle())
  276. fontBold.DeleteObject();
  277. if (fontULine.GetSafeHandle())
  278. fontULine.DeleteObject();
  279. if (fontVert.GetSafeHandle())
  280. fontVert.DeleteObject();
  281. if (fontVertBold.GetSafeHandle())
  282. fontVertBold.DeleteObject();
  283. if (fontIconTitle.GetSafeHandle())
  284. fontIconTitle.DeleteObject();
  285. if (fontIconTitleBold.GetSafeHandle())
  286. fontIconTitleBold.DeleteObject();
  287. if (fontMarlettIcon.GetSafeHandle())
  288. fontMarlettIcon.DeleteObject();
  289. if (fontStatus.GetSafeHandle())
  290. fontStatus.DeleteObject();
  291. if (fontSmCaption.GetSafeHandle())
  292. fontSmCaption.DeleteObject();
  293. }
  294. void CXTAuxData::UseOfficeFont(BOOL bOfficeFont)
  295. {
  296. bUseOfficeFont = bOfficeFont;
  297. LoadSysFonts();
  298. }
  299. BOOL CXTAuxData::FontExists(LPCTSTR strFaceName)
  300. {
  301. return CXTPDrawHelpers::FontExists(strFaceName);
  302. }
  303. BOOL CXTAuxData::CreateSysFont(const CXTLogFont& logFont, CFont& font, long lfWeight/*= -1*/, char lfUnderline/*= -1*/, long lfOrientation/*= -1*/, long lfEscapement/*= -1*/)
  304. {
  305. // delete the font if it has already been created.
  306. if (font.GetSafeHandle())
  307. {
  308. font.DeleteObject();
  309. }
  310. // construct the log font.
  311. CXTLogFont lf(logFont);
  312. // set font weight.
  313. if (lfWeight != -1)
  314. {
  315. lf.lfWeight = lfWeight;
  316. }
  317. // set font orientation.
  318. if (lfOrientation != -1)
  319. {
  320. lf.lfOrientation = lfOrientation;
  321. }
  322. // set font escapement.
  323. if (lfEscapement != -1)
  324. {
  325. lf.lfEscapement = lfEscapement;
  326. }
  327. // set font underline style.
  328. if (lfUnderline != -1)
  329. {
  330. lf.lfUnderline = lfUnderline;
  331. }
  332. // create the font using the log font we constructed.
  333. return font.CreateFontIndirect(&lf);
  334. }
  335. BOOL CXTAuxData::SetGlobalFont(LPCTSTR lpszFaceName, LPCTSTR lpszVertFaceName/*= NULL*/)
  336. {
  337. return LoadSysFonts(lpszFaceName, lpszVertFaceName);
  338. }
  339. BOOL CXTAuxData::SetGlobalFont(CFont* pHorzFont, CFont* pVertFont/*= NULL*/)
  340. {
  341. if (pHorzFont != NULL && pHorzFont->GetSafeHandle() != NULL)
  342. {
  343. CXTLogFont lf;
  344. pHorzFont->GetLogFont(&lf);
  345. // create the menu fonts.
  346. if (!CreateSysFont(lf, font))
  347. return FALSE;
  348. if (!CreateSysFont(lf, fontBold, FW_BOLD))
  349. return FALSE;
  350. if (!CreateSysFont(lf, fontULine, -1, 1))
  351. return FALSE;
  352. if (!CreateSysFont(lf, fontStatus))
  353. return FALSE;
  354. }
  355. if (pVertFont != NULL && pVertFont->GetSafeHandle() != NULL)
  356. {
  357. CXTLogFont lf;
  358. pVertFont->GetLogFont(&lf);
  359. if (!CreateSysFont(lf, fontVert, -1, -1, 900, 2700))
  360. return FALSE;
  361. if (!CreateSysFont(lf, fontVertBold, FW_BOLD, -1, 900, 2700))
  362. return FALSE;
  363. }
  364. return TRUE;
  365. }
  366. DWORD CXTAuxData::GetComCtlVersion()
  367. {
  368. iComCtlVersion = XTPSystemVersion()->GetComCtlVersion();
  369. return iComCtlVersion;
  370. }
  371. BOOL CXTAuxData::IsComCtlValid() const
  372. {
  373. return TRUE;
  374. }
  375. CString CXTAuxData::GetXTVersion(bool bVerNumOnly/*= false*/)
  376. {
  377. CString strVersion;
  378. if (bVerNumOnly)
  379. {
  380. strVersion.Format(_T("%d.%02d"),
  381. _XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR);
  382. }
  383. else
  384. {
  385. strVersion.Format(_T("Xtreme Toolkit v%d.%02d"),
  386. _XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR);
  387. }
  388. return strVersion;
  389. }
  390. void CXTAuxData::InitResources(HINSTANCE hInst)
  391. {
  392. // Set the resource handle used by the library.
  393. XTPResourceManager()->SetResourceHandle(hInst);
  394. LoadSysCursors(); // Load cursors.
  395. }
  396. _XTP_EXT_CLASS CXTAuxData& AFXAPI XTAuxData()
  397. {
  398. static CXTAuxData instance;
  399. return instance;
  400. }
  401. // CXTTcbItem
  402. CXTTcbItem::CXTTcbItem()
  403. : uiToolTipId(0)
  404. , pWnd(0)
  405. , dwStyle(0)
  406. , dwExStyle(0)
  407. , crTabBack(COLORREF_NULL)
  408. , crTabText(COLORREF_NULL)
  409. , crTabSelBack(COLORREF_NULL)
  410. , crTabSelText(COLORREF_NULL)
  411. {
  412. }