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

对话框与窗口

开发平台:

Visual C++

  1. // XTPPropertyGridItemColor.cpp : implementation of the CXTPPropertyGridItemColor class.
  2. //
  3. // This file is a part of the XTREME PROPERTYGRID 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 "Common/XTPVC80Helpers.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "XTPPropertyGridInplaceEdit.h"
  24. #include "XTPPropertyGridInplaceButton.h"
  25. #include "XTPPropertyGridInplaceList.h"
  26. #include "XTPPropertyGridItem.h"
  27. #include "XTPPropertyGridItemColor.h"
  28. #include "XTPPropertyGrid.h"
  29. #include "XTPPropertyGridDefines.h"
  30. #ifdef _XTP_INCLUDE_CONTROLS
  31. #include "Controls/XTColorDialog.h"
  32. #include "Controls/XTColorSelectorCtrl.h"
  33. #include "Controls/XTColorPopup.h"
  34. #include "Controls/XTNotify.h"
  35. #include "Controls/XTGlobal.h"
  36. #endif
  37. #ifdef _DEBUG
  38. #define new DEBUG_NEW
  39. #undef THIS_FILE
  40. static char THIS_FILE[] = __FILE__;
  41. #endif
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CXTPPropertyGridItemColor
  44. IMPLEMENT_DYNAMIC(CXTPPropertyGridItemColor, CXTPPropertyGridItem)
  45. CXTPPropertyGridItemColor::CXTPPropertyGridItemColor(LPCTSTR strCaption, COLORREF clr, COLORREF* pBindColor)
  46. : CXTPPropertyGridItem(strCaption)
  47. {
  48. m_pBindColor = pBindColor;
  49. SetColor(clr);
  50. m_nFlags = xtpGridItemHasEdit | xtpGridItemHasExpandButton;
  51. m_strDefaultValue = m_strValue;
  52. m_colorEditor = xtpGridItemColorExtendedDialog;
  53. }
  54. CXTPPropertyGridItemColor::CXTPPropertyGridItemColor(UINT nID, COLORREF clr, COLORREF* pBindColor)
  55. : CXTPPropertyGridItem(nID)
  56. {
  57. m_pBindColor = pBindColor;
  58. SetColor(clr);
  59. m_nFlags = xtpGridItemHasEdit | xtpGridItemHasExpandButton;
  60. m_strDefaultValue = m_strValue;
  61. m_colorEditor = xtpGridItemColorExtendedDialog;
  62. }
  63. CXTPPropertyGridItemColor::~CXTPPropertyGridItemColor()
  64. {
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. //
  68. BOOL CXTPPropertyGridItemColor::OnDrawItemValue(CDC& dc, CRect rcValue)
  69. {
  70. COLORREF clr = dc.GetTextColor();
  71. CRect rcSample(rcValue.left - 2, rcValue.top + 1, rcValue.left + 18, rcValue.bottom - 1);
  72. CXTPPenDC pen(dc, clr);
  73. CXTPBrushDC brush(dc, m_clrValue);
  74. dc.Rectangle(rcSample);
  75. CRect rcText(rcValue);
  76. rcText.left += 25;
  77. dc.DrawText(m_strValue, rcText, DT_SINGLELINE | DT_VCENTER);
  78. return TRUE;
  79. }
  80. CRect CXTPPropertyGridItemColor::GetValueRect()
  81. {
  82. CRect rcValue(CXTPPropertyGridItem::GetValueRect());
  83. rcValue.left += 25;
  84. return rcValue;
  85. }
  86. COLORREF AFX_CDECL CXTPPropertyGridItemColor::StringToRGB(LPCTSTR str)
  87. {
  88. CString strRed, strGreen, strBlue;
  89. AfxExtractSubString(strRed, str, 0, ';');
  90. AfxExtractSubString(strGreen, str, 1, ';');
  91. AfxExtractSubString(strBlue, str, 2, ';');
  92. return RGB(__min(_ttoi(strRed), 255), __min(_ttoi(strGreen), 255), __min(_ttoi(strBlue), 255));
  93. }
  94. CString AFX_CDECL CXTPPropertyGridItemColor::RGBToString(COLORREF clr)
  95. {
  96. CString str;
  97. str.Format(_T("%i; %i; %i"), GetRValue(clr), GetGValue(clr), GetBValue(clr));
  98. return str;
  99. }
  100. void CXTPPropertyGridItemColor::SetValue(CString strValue)
  101. {
  102. SetColor(StringToRGB(strValue));
  103. }
  104. void CXTPPropertyGridItemColor::SetColor(COLORREF clr)
  105. {
  106. m_clrValue = clr;
  107. if (m_pBindColor)
  108. {
  109. *m_pBindColor = clr;
  110. }
  111. CXTPPropertyGridItem::SetValue(RGBToString(clr));
  112. }
  113. void CXTPPropertyGridItemColor::BindToColor(COLORREF* pBindColor)
  114. {
  115. m_pBindColor = pBindColor;
  116. if (m_pBindColor)
  117. {
  118. *m_pBindColor = m_clrValue;
  119. }
  120. }
  121. void CXTPPropertyGridItemColor::OnBeforeInsert()
  122. {
  123. if (m_pBindColor && *m_pBindColor != m_clrValue)
  124. {
  125. SetColor(*m_pBindColor);
  126. }
  127. }
  128. void CXTPPropertyGridItemColor::SetEditorStyle(XTPPropertyGridItemColorEditor editor)
  129. {
  130. m_colorEditor = editor;
  131. if (m_colorEditor == xtpGridItemColorPopup)
  132. SetFlags(xtpGridItemHasEdit | xtpGridItemHasComboButton);
  133. else
  134. SetFlags(xtpGridItemHasEdit | xtpGridItemHasExpandButton);
  135. }
  136. XTPPropertyGridItemColorEditor CXTPPropertyGridItemColor::GetEditorStyle()
  137. {
  138. return m_colorEditor;
  139. }
  140. void CXTPPropertyGridItemColor::OnInplaceButtonDown(CXTPPropertyGridInplaceButton* pButton)
  141. {
  142. if (m_pGrid->SendNotifyMessage(XTP_PGN_INPLACEBUTTONDOWN, (LPARAM)pButton) == TRUE)
  143. return;
  144. if (!OnRequestEdit())
  145. return;
  146. CWnd* pGrid = m_pGrid;
  147. #ifdef _XTP_INCLUDE_CONTROLS
  148. if (m_colorEditor == xtpGridItemColorPopup)
  149. {
  150. class CPropertyGridItemColorColorPopup: public CXTColorPopup
  151. {
  152. public:
  153. CPropertyGridItemColorColorPopup()
  154. : CXTColorPopup(TRUE)
  155. {
  156. m_pItem = NULL;
  157. }
  158. BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  159. {
  160. if (message == CPN_XT_SELENDOK)
  161. {
  162. CString strValue = m_pItem->RGBToString((COLORREF)wParam);
  163. if (m_pItem->OnAfterEdit(strValue))
  164. {
  165. m_pItem->OnValueChanged(strValue);
  166. }
  167. *pResult = 0;
  168. return TRUE;
  169. }
  170. if (message == CPN_XT_SELENDCANCEL)
  171. {
  172. m_pItem->OnCancelEdit();
  173. }
  174. return CXTColorPopup::OnWndMsg(message, wParam, lParam, pResult);
  175. }
  176. CXTPPropertyGridItemColor* m_pItem;
  177. };
  178. CPropertyGridItemColorColorPopup *pColorPopup = new CPropertyGridItemColorColorPopup();
  179. pColorPopup->SetTheme(xtThemeOfficeXP);
  180. CRect rcItem= GetItemRect();
  181. m_pGrid->ClientToScreen(&rcItem);
  182. COLORREF clrDefault = StringToRGB(m_strDefaultValue);
  183. pColorPopup->Create(rcItem, m_pGrid, CPS_XT_RIGHTALIGN|CPS_XT_USERCOLORS|CPS_XT_EXTENDED|CPS_XT_MORECOLORS|CPS_XT_SHOW3DSELECTION|CPS_XT_SHOWHEXVALUE, GetColor(), clrDefault);
  184. pColorPopup->SetOwner(m_pGrid);
  185. pColorPopup->SetFocus();
  186. pColorPopup->AddListener(pColorPopup->GetSafeHwnd());
  187. pColorPopup->m_pItem = this;
  188. }
  189. else if (m_colorEditor == xtpGridItemColorExtendedDialog)
  190. {
  191. InternalAddRef();
  192. CXTColorDialog dlg(m_clrValue, m_clrValue, 0, m_pGrid);
  193. if (dlg.DoModal() == IDOK)
  194. {
  195. CString strValue = RGBToString(dlg.GetColor());
  196. if (OnAfterEdit(strValue))
  197. {
  198. OnValueChanged(strValue);
  199. SAFE_INVALIDATE(pGrid);
  200. }
  201. }
  202. else
  203. {
  204. OnCancelEdit();
  205. }
  206. InternalRelease();
  207. }
  208. else
  209. #endif
  210. {
  211. InternalAddRef();
  212. CColorDialog dlg(m_clrValue, 0, m_pGrid);
  213. if (dlg.DoModal() == IDOK)
  214. {
  215. CString strValue = RGBToString(dlg.GetColor());
  216. if (OnAfterEdit(strValue))
  217. {
  218. OnValueChanged(strValue);
  219. SAFE_INVALIDATE(pGrid);
  220. }
  221. }
  222. else
  223. {
  224. OnCancelEdit();
  225. }
  226. InternalRelease();
  227. }
  228. }