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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditColorComboBox.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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 SYNTAX EDIT 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. // common includes
  24. #include "Common/XTPVC50Helpers.h"
  25. #include "Common/XTPColorManager.h"
  26. #include "Common/XTPResourceManager.h"
  27. // syntax editor includes
  28. #include "XTPSyntaxEditColorComboBox.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. #define COLOR_ITEM_WIDTH   11
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTPSyntaxEditColorComboBox
  37. CXTPSyntaxEditColorComboBox::CXTPSyntaxEditColorComboBox()
  38. : m_bPreInit(true)
  39. , m_crAuto(COLORREF_NULL)
  40. , m_crUser(COLORREF_NULL)
  41. , m_iPrevSel(CB_ERR)
  42. {
  43. }
  44. CXTPSyntaxEditColorComboBox::~CXTPSyntaxEditColorComboBox()
  45. {
  46. }
  47. IMPLEMENT_DYNAMIC(CXTPSyntaxEditColorComboBox, CComboBox)
  48. BEGIN_MESSAGE_MAP(CXTPSyntaxEditColorComboBox, CComboBox)
  49. //{{AFX_MSG_MAP(CXTPSyntaxEditColorComboBox)
  50. ON_WM_CREATE()
  51. ON_WM_MOUSEWHEEL()
  52. ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CXTPSyntaxEditColorComboBox message handlers
  57. int CXTPSyntaxEditColorComboBox::SetSelColor(COLORREF crColor)
  58. {
  59. int iIndex = FindColor(crColor);
  60. if (iIndex == CB_ERR)
  61. {
  62. iIndex = SetUserColor(crColor);
  63. if (iIndex == CB_ERR)
  64. {
  65. return CB_ERR;
  66. }
  67. }
  68. return SetCurSel(iIndex);
  69. }
  70. COLORREF CXTPSyntaxEditColorComboBox::GetSelColor()
  71. {
  72. int iIndex = GetCurSel();
  73. if (iIndex == CB_ERR)
  74. {
  75. return COLORREF_NULL;
  76. }
  77. return (COLORREF)GetItemData(iIndex);
  78. }
  79. int CXTPSyntaxEditColorComboBox::DeleteColor(COLORREF crColor)
  80. {
  81. int iIndex = FindColor(crColor);
  82. if (iIndex != CB_ERR)
  83. {
  84. return DeleteString(iIndex);
  85. }
  86. return CB_ERR;
  87. }
  88. int CXTPSyntaxEditColorComboBox::FindColor(COLORREF crColor)
  89. {
  90. for (int iIndex = 0; iIndex < GetCount(); ++iIndex)
  91. {
  92. COLORREF crItem = (COLORREF)GetItemData(iIndex);
  93. if (crItem == crColor)
  94. {
  95. return iIndex;
  96. }
  97. }
  98. return CB_ERR;
  99. }
  100. int CXTPSyntaxEditColorComboBox::AddColor(COLORREF crColor, UINT nID)
  101. {
  102. CString csName;
  103. XTPResourceManager()->LoadString(&csName, nID);
  104. if (!csName.IsEmpty())
  105. {
  106. int iIndex = AddString(csName);
  107. if (iIndex != CB_ERR)
  108. SetItemData(iIndex, (DWORD)crColor);
  109. return iIndex;
  110. }
  111. return CB_ERR;
  112. }
  113. bool CXTPSyntaxEditColorComboBox::Init()
  114. {
  115. // MFCBUG: adjust height so display is the same as non-owner drawn
  116. // CComboBoxes. MFC sets the height of an owner-drawn CComboBox
  117. // 2-3 pixels larger than a non owner-drawn combo.
  118. SetItemHeight(-1, (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE)));
  119. ResetContent();
  120. AddColor( RGB(0x00,0x00,0x00), XTP_IDS_CLR_BLACK ),
  121. AddColor( RGB(0xff,0xff,0xff), XTP_IDS_CLR_WHITE ),
  122. AddColor( RGB(0x80,0x00,0x00), XTP_IDS_CLR_MAROON ),
  123. AddColor( RGB(0x00,0x80,0x00), XTP_IDS_CLR_DARK_GREEN ),
  124. AddColor( RGB(0x80,0x80,0x00), XTP_IDS_CLR_OLIVE ),
  125. AddColor( RGB(0x00,0x00,0x80), XTP_IDS_CLR_DARK_BLUE ),
  126. AddColor( RGB(0x80,0x00,0x80), XTP_IDS_CLR_PURPLE ),
  127. AddColor( RGB(0x00,0x80,0x80), XTP_IDS_CLR_TEAL ),
  128. AddColor( RGB(0xC0,0xC0,0xC0), XTP_IDS_CLR_GRAY25 ),
  129. AddColor( RGB(0x80,0x80,0x80), XTP_IDS_CLR_GRAY50 ),
  130. AddColor( RGB(0xFF,0x00,0x00), XTP_IDS_CLR_RED ),
  131. AddColor( RGB(0x00,0xFF,0x00), XTP_IDS_CLR_GREEN ),
  132. AddColor( RGB(0xFF,0xFF,0x00), XTP_IDS_CLR_YELLOW ),
  133. AddColor( RGB(0x00,0x00,0xFF), XTP_IDS_CLR_BLUE ),
  134. AddColor( RGB(0xFF,0x00,0xFF), XTP_IDS_CLR_PINK ),
  135. AddColor( RGB(0x00,0xFF,0xFF), XTP_IDS_CLR_TURQUOISE ),
  136. SetCurSel(0);
  137. return true;
  138. }
  139. void CXTPSyntaxEditColorComboBox::PreSubclassWindow()
  140. {
  141. CComboBox::PreSubclassWindow();
  142. if (m_bPreInit)
  143. {
  144. // Initialize the control.
  145. Init();
  146. }
  147. }
  148. int CXTPSyntaxEditColorComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
  149. {
  150. if (CComboBox::OnCreate(lpCreateStruct) == -1)
  151. return -1;
  152. // Initialize the control.
  153. Init();
  154. return 0;
  155. }
  156. BOOL CXTPSyntaxEditColorComboBox::PreCreateWindow(CREATESTRUCT& cs)
  157. {
  158. if (!CComboBox::PreCreateWindow(cs))
  159. return FALSE;
  160. // When creating controls dynamically Init() must
  161. // be called from OnCreate() and not from
  162. // PreSubclassWindow().
  163. m_bPreInit = false;
  164. return TRUE;
  165. }
  166. int CXTPSyntaxEditColorComboBox::SelectUserColor()
  167. {
  168. CColorDialog dlg(GetSelColor(), CC_RGBINIT, this);
  169. if (dlg.DoModal() == IDOK)
  170. {
  171. COLORREF crUser = dlg.GetColor();
  172. if (FindColor(crUser) == CB_ERR)
  173. {
  174. SetUserColor(crUser);
  175. }
  176. else
  177. {
  178. SetUserColor(COLORREF_NULL);
  179. }
  180. return SetSelColor(crUser);
  181. }
  182. return CB_ERR;
  183. }
  184. int CXTPSyntaxEditColorComboBox::SetUserColor(COLORREF crColor, LPCTSTR lpszUserText/*=NULL*/)
  185. {
  186. CString csCustom;
  187. if (lpszUserText == NULL)
  188. {
  189. XTPResourceManager()->LoadString(
  190. &csCustom, XTP_IDS_EDIT_CUSTOM);
  191. }
  192. else
  193. {
  194. csCustom = lpszUserText;
  195. }
  196. if (crColor == COLORREF_NULL)
  197. {
  198. m_crUser = COLORREF_NULL;
  199. int iIndex = FindStringExact(-1, csCustom);
  200. if (iIndex != CB_ERR)
  201. {
  202. return DeleteString(iIndex);
  203. }
  204. return CB_ERR;
  205. }
  206. if (m_crUser == COLORREF_NULL)
  207. {
  208. int iIndex = AddString(csCustom);
  209. if (iIndex != CB_ERR)
  210. {
  211. m_crUser = crColor;
  212. SetItemData(iIndex, (DWORD)m_crUser);
  213. RedrawWindow();
  214. return iIndex;
  215. }
  216. }
  217. else
  218. {
  219. int iIndex = FindStringExact(-1, csCustom);
  220. if (iIndex != CB_ERR)
  221. {
  222. m_crUser = crColor;
  223. SetItemData(iIndex, (DWORD)m_crUser);
  224. RedrawWindow();
  225. return iIndex;
  226. }
  227. }
  228. return CB_ERR;
  229. }
  230. int CXTPSyntaxEditColorComboBox::SetAutoColor(COLORREF crColor, LPCTSTR lpszAutoText/*=NULL*/)
  231. {
  232. CString csAuto;
  233. if (lpszAutoText == NULL)
  234. {
  235. XTPResourceManager()->LoadString(
  236. &csAuto, XTP_IDS_CLR_AUTOMATIC);
  237. int nTipIndex = FIND_S(csAuto, _T('n'), 0);
  238. if (nTipIndex > 0)
  239. csAuto.ReleaseBuffer(nTipIndex);
  240. }
  241. else
  242. {
  243. csAuto = lpszAutoText;
  244. }
  245. if (crColor == COLORREF_NULL)
  246. {
  247. m_crAuto = COLORREF_NULL;
  248. int iIndex = FindStringExact(-1, csAuto);
  249. if (iIndex != CB_ERR)
  250. {
  251. return DeleteString(iIndex);
  252. }
  253. return CB_ERR;
  254. }
  255. if (m_crAuto == COLORREF_NULL)
  256. {
  257. int iIndex = InsertString(0, csAuto);
  258. if (iIndex != CB_ERR)
  259. {
  260. m_crAuto = crColor;
  261. SetItemData(iIndex, (DWORD)m_crAuto);
  262. RedrawWindow();
  263. return iIndex;
  264. }
  265. }
  266. else
  267. {
  268. int iIndex = FindStringExact(-1, csAuto);
  269. if (iIndex != CB_ERR)
  270. {
  271. m_crAuto = crColor;
  272. SetItemData(iIndex, (DWORD)m_crAuto);
  273. RedrawWindow();
  274. return iIndex;
  275. }
  276. }
  277. return CB_ERR;
  278. }
  279. void CXTPSyntaxEditColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  280. {
  281. CDC*  pDC       = CDC::FromHandle(lpDIS->hDC);
  282. UINT  itemState = lpDIS->itemState;
  283. UINT  itemID    = lpDIS->itemID;
  284. CRect rcItem    = lpDIS->rcItem;
  285. if (itemID == (UINT)-1)
  286. {
  287. return;
  288. }
  289. BOOL bDisabled = ((itemState & ODS_DISABLED) == ODS_DISABLED);
  290. BOOL bSelected = ((itemState & ODS_SELECTED) == ODS_SELECTED);
  291. BOOL bFocus    = ((itemState & ODS_FOCUS)    == ODS_FOCUS);
  292. // draw background.
  293. if (bDisabled)
  294. {
  295. pDC->SetTextColor(GetXtremeColor(COLOR_GRAYTEXT));
  296. pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE));
  297. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_3DFACE));
  298. }
  299. else
  300. {
  301. if (bSelected)
  302. {
  303. pDC->SetTextColor(GetXtremeColor(COLOR_HIGHLIGHTTEXT));
  304. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  305. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_HIGHLIGHT));
  306. }
  307. else
  308. {
  309. pDC->SetTextColor(GetXtremeColor(COLOR_WINDOWTEXT));
  310. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  311. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_WINDOW));
  312. }
  313. // draw focus rectangle.
  314. if (bFocus)
  315. {
  316. pDC->DrawFocusRect(&rcItem);
  317. }
  318. }
  319. // determine the size of the color rectangle.
  320. CRect rColor(rcItem);
  321. rColor.DeflateRect(2,2);
  322. rColor.right = rColor.left + COLOR_ITEM_WIDTH;
  323. rColor.bottom = rColor.top + COLOR_ITEM_WIDTH;
  324. // draw color rectangle.
  325. pDC->FillSolidRect(rColor,
  326. bDisabled? GetXtremeColor(COLOR_3DFACE): (COLORREF)lpDIS->itemData);
  327. pDC->Draw3dRect(rColor,
  328. GetXtremeColor(bDisabled? COLOR_GRAYTEXT: COLOR_WINDOWTEXT),
  329. GetXtremeColor(bDisabled? COLOR_GRAYTEXT: COLOR_WINDOWTEXT));
  330. // determine the size of the text display.
  331. CRect rText(rColor);
  332. rText.top -= 2;
  333. rText.bottom = rText.top + (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE));
  334. rText.left = rText.right + 4;
  335. rText.right = rcItem.right;
  336. // draw text.
  337. CString csItemText;
  338. GetLBText(itemID, csItemText);
  339. if (!csItemText.IsEmpty())
  340. {
  341. pDC->SetBkMode(TRANSPARENT);
  342. pDC->DrawText(csItemText, rText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
  343. }
  344. }
  345. void CXTPSyntaxEditColorComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  346. {
  347. ASSERT(lpMIS->CtlType == ODT_COMBOBOX);
  348. lpMIS->itemHeight = (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE));
  349. lpMIS->itemWidth = 0;
  350. }
  351. int CXTPSyntaxEditColorComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
  352. {
  353. COLORREF color1 = (COLORREF)lpCIS->itemData1;
  354. COLORREF color2 = (COLORREF)lpCIS->itemData2;
  355. // exact match
  356. if (color1 == color2)
  357. return 0;
  358. // first do an intensity sort, lower intensities go first
  359. int intensity1 = GetRValue(color1) + GetGValue(color1) + GetBValue(color1);
  360. int intensity2 = GetRValue(color2) + GetGValue(color2) + GetBValue(color2);
  361. // lower intensity goes first
  362. if (intensity1 < intensity2)
  363. return -1;
  364. // higher intensity goes second
  365. else if (intensity1 > intensity2)
  366. return 1;
  367. // if same intensity, sort by color (blues first, reds last)
  368. if (GetBValue(color1) > GetBValue(color2))
  369. return -1;
  370. else if (GetGValue(color1) > GetGValue(color2))
  371. return -1;
  372. else if (GetRValue(color1) > GetRValue(color2))
  373. return -1;
  374. return 1;
  375. }
  376. BOOL CXTPSyntaxEditColorComboBox::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
  377. {
  378. if (GetDroppedState() == TRUE)
  379. {
  380. HWND hWnd = ::FindWindow(_T("ComboLBox"), NULL);
  381. if (::IsWindow(hWnd))
  382. {
  383. ::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
  384. BOOL bRet = CComboBox::OnMouseWheel(nFlags, zDelta, pt);
  385. ::SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);
  386. ::RedrawWindow(hWnd, NULL, (HRGN)NULL,
  387. RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_FRAME | RDW_INVALIDATE | RDW_ERASE);
  388. return bRet;
  389. }
  390. }
  391. return CComboBox::OnMouseWheel(nFlags, zDelta, pt);
  392. }
  393. void CXTPSyntaxEditColorComboBox::NotifyOwner(UINT nCode)
  394. {
  395. CWnd* pWndOwner = CWnd::GetOwner();
  396. if (::IsWindow(pWndOwner->GetSafeHwnd()))
  397. {
  398. pWndOwner->SendMessage(WM_COMMAND,
  399. MAKEWPARAM(GetDlgCtrlID(), nCode), (LPARAM)m_hWnd);
  400. }
  401. }
  402. int CXTPSyntaxEditColorComboBox::GetLBCurSel() const
  403. {
  404. if (GetDroppedState() == TRUE)
  405. {
  406. HWND hWnd = ::FindWindow(_T("ComboLBox"), NULL);
  407. if (::IsWindow(hWnd))
  408. {
  409. return (int)::SendMessage(hWnd, LB_GETCURSEL, 0, 0);
  410. }
  411. }
  412. return LB_ERR;
  413. }
  414. BOOL CXTPSyntaxEditColorComboBox::PreTranslateMessage(MSG* pMsg)
  415. {
  416. switch (pMsg->message)
  417. {
  418. case WM_KEYDOWN:
  419. {
  420. switch (pMsg->wParam)
  421. {
  422. case VK_ESCAPE:
  423. {
  424. if (GetDroppedState() == TRUE)
  425. {
  426. ShowDropDown(FALSE);
  427. NotifyOwner(CBN_SELENDCANCEL);
  428. return TRUE;
  429. }
  430. }
  431. break;
  432. case VK_SPACE:
  433. case VK_RETURN:
  434. {
  435. if (GetDroppedState() == TRUE)
  436. {
  437. m_iPrevSel = GetLBCurSel();
  438. ShowDropDown(FALSE);
  439. NotifyOwner(CBN_SELENDOK);
  440. return TRUE;
  441. }
  442. }
  443. break;
  444. case VK_UP:
  445. case VK_DOWN:
  446. {
  447. if (GetDroppedState() == FALSE)
  448. {
  449. m_iPrevSel = GetCurSel();
  450. ShowDropDown(TRUE);
  451. return TRUE;
  452. }
  453. }
  454. break;
  455. }
  456. }
  457. }
  458. return CComboBox::PreTranslateMessage(pMsg);
  459. }
  460. void CXTPSyntaxEditColorComboBox::OnCloseUp()
  461. {
  462. if (m_iPrevSel != CB_ERR)
  463. {
  464. if (m_iPrevSel != GetCurSel())
  465. SetCurSel(m_iPrevSel);
  466. m_iPrevSel = CB_ERR;
  467. }
  468. }
  469. _XTP_EXT_CLASS void AFXAPI DDX_CBSyntaxColor(CDataExchange *pDX, int nIDC, COLORREF& value)
  470. {
  471. HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  472. ASSERT(hWndCtrl != NULL);
  473. CXTPSyntaxEditColorComboBox* pColorCombo = (CXTPSyntaxEditColorComboBox*)CWnd::FromHandle(hWndCtrl);
  474. if (pDX->m_bSaveAndValidate)
  475. {
  476. value = pColorCombo->GetSelColor();
  477. }
  478. else
  479. {
  480. pColorCombo->SetSelColor(value);
  481. }
  482. }