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

对话框与窗口

开发平台:

Visual C++

  1. // XTColorDialog.cpp : implementation file
  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/XTPResourceManager.h"
  23. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  24. #include "Common/XTPColorManager.h"
  25. #include "Common/XTPDrawHelpers.h"
  26. #include "XTDefines.h"
  27. #include "XTColorDialog.h"
  28. #include "XTColorPageCustom.h"
  29. #include "XTColorPageStandard.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTColorDialog
  37. IMPLEMENT_DYNAMIC(CXTColorDialog, CPropertySheet)
  38. CXTColorDialog::CXTColorDialog(COLORREF clrNew, COLORREF clrCurrent,
  39. DWORD dwFlags/*= 0L*/, CWnd* pWndParent/*= NULL*/)
  40. {
  41. CString strCaption;
  42. XTPResourceManager()->LoadString(&strCaption, XT_IDS_COLOR_CAPTION);
  43. Construct(strCaption, pWndParent);
  44. m_psh.dwFlags = (m_psh.dwFlags & ~PSH_HASHELP) | PSH_NOAPPLYNOW;
  45. m_clrNew = clrNew;
  46. m_clrCurrent = clrCurrent;
  47. m_dwStyle = dwFlags;
  48. AddPage(new CXTColorPageStandard(this));
  49. AddPage(new CXTColorPageCustom(this));
  50. }
  51. void CXTColorDialog::AddPage(CPropertyPage* pPage)
  52. {
  53. CPropertySheet::AddPage(pPage);
  54. LPCDLGTEMPLATE pResource = XTPResourceManager()->LoadDialogTemplate((UINT)(UINT_PTR)pPage->m_psp.pszTemplate);
  55. if (pResource)
  56. {
  57. pPage->m_psp.pResource = pResource;
  58. pPage->m_psp.dwFlags |= PSP_DLGINDIRECT;
  59. }
  60. }
  61. CXTColorDialog::~CXTColorDialog()
  62. {
  63. int iPage;
  64. for (iPage = 0; iPage < GetPageCount(); ++iPage)
  65. {
  66. CPropertyPage* pPage = GetPage(iPage);
  67. SAFE_DELETE (pPage);
  68. }
  69. }
  70. BEGIN_MESSAGE_MAP(CXTColorDialog, CPropertySheet)
  71. //{{AFX_MSG_MAP(CXTColorDialog)
  72. ON_WM_PAINT()
  73. ON_WM_CREATE()
  74. //}}AFX_MSG_MAP
  75. END_MESSAGE_MAP()
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CXTColorDialog message handlers
  78. void CXTColorDialog::CalculateRects()
  79. {
  80. CRect rcBtnOK;
  81. CRect rcBtnCancel;
  82. CRect rcTabCtrl;
  83. CRect rcItem;
  84. // get the tab control size.
  85. CTabCtrl* pTabCtrl = GetTabControl();
  86. pTabCtrl->GetWindowRect(&rcTabCtrl);
  87. ScreenToClient(&rcTabCtrl);
  88. // get the size of the first tab item.
  89. pTabCtrl->GetItemRect(0, &rcItem);
  90. // get the OK button size.
  91. CButton* pBtnOK = (CButton*)GetDlgItem(IDOK);
  92. pBtnOK->GetWindowRect(&rcBtnOK);
  93. ScreenToClient(&rcBtnOK);
  94. // get the Cancel button size.
  95. CButton* pBtnCancel = (CButton*)GetDlgItem(IDCANCEL);
  96. pBtnCancel->GetWindowRect(&rcBtnCancel);
  97. ScreenToClient(&rcBtnCancel);
  98. rcBtnCancel.OffsetRect(-15, 0);
  99. // resize the tab control
  100. rcTabCtrl.right = rcBtnCancel.left - 5;
  101. rcTabCtrl.bottom = rcBtnCancel.top - 15;
  102. pTabCtrl->MoveWindow(&rcTabCtrl);
  103. // reposition the OK button.
  104. rcBtnOK = rcBtnCancel;
  105. rcBtnOK.top = rcTabCtrl.top + rcItem.Height() + 1;
  106. rcBtnOK.bottom = rcBtnOK.top + rcBtnCancel.Height();
  107. pBtnOK->MoveWindow(&rcBtnOK);
  108. // reposition the Cancel button.
  109. rcBtnCancel = rcBtnOK;
  110. rcBtnCancel.top = rcBtnOK.bottom + 5;
  111. rcBtnCancel.bottom = rcBtnCancel.top + rcBtnOK.Height();
  112. pBtnCancel->MoveWindow(&rcBtnCancel);
  113. // reposition the hex display
  114. if (::IsWindow(m_editHex.m_hWnd))
  115. {
  116. CRect rcHex;
  117. rcHex = rcBtnCancel;
  118. rcHex.top = rcBtnCancel.bottom + 5;
  119. rcHex.bottom = rcHex.top + 18;
  120. m_editHex.MoveWindow(&rcHex);
  121. }
  122. // resize the property sheet.
  123. CXTPWindowRect rcWindow(this);
  124. ClientToScreen(&rcTabCtrl);
  125. rcWindow.bottom = rcTabCtrl.bottom + 10;
  126. rcWindow.right -= 15;
  127. MoveWindow(&rcWindow);
  128. }
  129. BOOL CXTColorDialog::OnInitDialog()
  130. {
  131. BOOL bResult = CPropertySheet::OnInitDialog();
  132. CalculateRects();
  133. SetActivePage(0);
  134. if (m_editHex.GetSafeHwnd())
  135. {
  136. m_editHex.SetFont(GetFont());
  137. }
  138. return bResult;
  139. }
  140. void CXTColorDialog::OnPaint()
  141. {
  142. CPaintDC dc(this); // device context for painting
  143. dc.SetBkMode(TRANSPARENT);
  144. dc.SetTextColor(GetXtremeColor(COLOR_WINDOWTEXT));
  145. CXTPFontDC fontDC(&dc, GetFont());
  146. // get the Cancel button size.
  147. CXTPWindowRect rcBtnCancel(GetDlgItem(IDCANCEL));
  148. ScreenToClient(&rcBtnCancel);
  149. // construct the size for the the new / current color box.
  150. CXTPClientRect rect(this);
  151. rect.right = rcBtnCancel.right;
  152. rect.left = rcBtnCancel.left;
  153. rect.bottom -= 32;
  154. rect.top = rect.bottom - 66;
  155. // draw the borders for teh new / current color box.
  156. if (m_dwStyle & CPS_XT_SHOW3DSELECTION)
  157. {
  158. rect.InflateRect(3, 3);
  159. dc.Draw3dRect(&rect, GetXtremeColor(COLOR_3DHILIGHT),
  160. GetXtremeColor(COLOR_3DDKSHADOW));
  161. rect.DeflateRect(3, 3);
  162. dc.Draw3dRect(&rect, GetXtremeColor(COLOR_3DSHADOW),
  163. GetXtremeColor(COLOR_3DHILIGHT));
  164. }
  165. else
  166. {
  167. dc.Draw3dRect(&rect, GetXtremeColor(COLOR_WINDOWFRAME),
  168. GetXtremeColor(COLOR_WINDOWFRAME));
  169. }
  170. // draw the new text string.
  171. CRect rcText = rect;
  172. rcText = rect;
  173. rcText.top -= 22;
  174. rcText.bottom = rcText.top + 22;
  175. CString strText;
  176. VERIFY(XTPResourceManager()->LoadString(&strText, XT_IDS_NEW));
  177. dc.DrawText(strText, rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  178. // draw the current text string.
  179. rcText = rect;
  180. rcText.top = rcText.bottom;
  181. rcText.bottom = rcText.top + 22;
  182. VERIFY(XTPResourceManager()->LoadString(&strText, XT_IDS_CURRENT));
  183. dc.DrawText(strText, rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  184. rect.DeflateRect(1, 1);
  185. int cy = rect.Height()/2;
  186. // fill the new color box.
  187. m_rcNew = rect;
  188. m_rcNew.bottom = rect.top + cy;
  189. dc.FillSolidRect(&m_rcNew, m_clrNew);
  190. // fill the current color box.
  191. m_rcCurrent = rect;
  192. m_rcCurrent.top = rect.bottom - cy;
  193. dc.FillSolidRect(&m_rcCurrent, m_clrCurrent);
  194. }
  195. void CXTColorDialog::SetNewColor(COLORREF clr, BOOL bNotify/*= TRUE*/)
  196. {
  197. m_clrNew = clr;
  198. if (IsWindowVisible())
  199. {
  200. CClientDC dc(this);
  201. dc.FillSolidRect(&m_rcNew, m_clrNew);
  202. if (m_dwStyle & CPS_XT_SHOWHEXVALUE)
  203. {
  204. m_editHex.SetWindowText(RGBtoHex(m_clrNew));
  205. }
  206. }
  207. if (bNotify && GetTabControl() && GetTabControl()->GetSafeHwnd())
  208. {
  209. int iPage;
  210. for (iPage = 0; iPage < GetPageCount(); ++iPage)
  211. {
  212. GetPage(iPage)->SendMessage(XTWM_UPDATECOLOR,
  213. (WPARAM)(COLORREF)m_clrNew);
  214. }
  215. }
  216. }
  217. void CXTColorDialog::SetCurrentColor(COLORREF clr)
  218. {
  219. m_clrCurrent = clr;
  220. if (IsWindowVisible())
  221. {
  222. CClientDC dc(this);
  223. dc.FillSolidRect(&m_rcCurrent, m_clrCurrent);
  224. }
  225. }
  226. BOOL CXTColorDialog::CopyToClipboard(const CString& strText)
  227. {
  228. if (::OpenClipboard(m_hWnd))
  229. {
  230. ::EmptyClipboard();
  231. HGLOBAL hGlobalBuff = ::GlobalAlloc(GMEM_MOVEABLE, strText.GetLength() + 1);
  232. if (!hGlobalBuff)
  233. {
  234. ::CloseClipboard();
  235. return FALSE;
  236. }
  237. CHAR* szBuffer = (CHAR*)::GlobalLock(hGlobalBuff);
  238. WCSTOMBS_S(szBuffer, strText, strText.GetLength() + 1);
  239. ::GlobalUnlock(hGlobalBuff);
  240. if (::SetClipboardData(CF_TEXT, hGlobalBuff) == NULL)
  241. return FALSE;
  242. ::CloseClipboard();
  243. return TRUE;
  244. }
  245. return FALSE;
  246. }
  247. CString CXTColorDialog::RGBtoHex(COLORREF clr)
  248. {
  249. int r = GetRValue(clr);
  250. int g = GetGValue(clr);
  251. int b = GetBValue(clr);
  252. CString strHex;
  253. if (r < 16 && g < 16 && b < 16)
  254. strHex.Format(_T("Hex= 0%X0%X0%X"), r, g, b);
  255. else if (r < 16 && g < 16)
  256. strHex.Format(_T("Hex= 0%X0%X%X"), r, g, b);
  257. else if (r < 16 && b < 16)
  258. strHex.Format(_T("Hex= 0%X%X0%X"), r, g, b);
  259. else if (g < 16 && b < 16)
  260. strHex.Format(_T("Hex=%X0%X0%X"), r, g, b);
  261. else if (r < 16)
  262. strHex.Format(_T("Hex= 0%X%X%X"), r, g, b);
  263. else if (g < 16)
  264. strHex.Format(_T("Hex=%X0%X%X"), r, g, b);
  265. else if (b < 16)
  266. strHex.Format(_T("Hex=%X%X0%X"), r, g, b);
  267. else
  268. strHex.Format(_T("Hex=%X%X%X"), r, g, b);
  269. return strHex;
  270. }
  271. int CXTColorDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
  272. {
  273. if (CPropertySheet::OnCreate(lpCreateStruct) == -1)
  274. return -1;
  275. if (m_dwStyle & CPS_XT_SHOWHEXVALUE)
  276. {
  277. if (!m_editHex.CreateEx(WS_EX_STATICEDGE, _T("EDIT"), RGBtoHex(m_clrNew),
  278. WS_CHILD | WS_VISIBLE | ES_READONLY, CRect(0, 0, 0, 0), this, AFX_IDC_CHANGE))
  279. {
  280. TRACE0("Failed to create edit control.n");
  281. return -1;
  282. }
  283. }
  284. ((CXTColorPageStandard*)GetPage(0))->SetColor(m_clrNew);
  285. return 0;
  286. }