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

对话框与窗口

开发平台:

Visual C++

  1. // XTColorPageCustom.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/XTPDrawHelpers.h"
  23. #include "Common/XTPColorManager.h"
  24. #include "Common/XTPSystemHelpers.h"
  25. #include "XTNotify.h"
  26. #include "XTColorRef.h"
  27. #include "XTColorDialog.h"
  28. #include "XTColorPageCustom.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. #define DEFAULT_LUMINANCE 0.50f
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTColorBase
  37. CXTColorBase::CXTColorBase()
  38. {
  39. m_nLum = 0.0;
  40. m_nSat = 0.0;
  41. m_nHue = 0.0;
  42. m_ptMousePos = CPoint(0, 0);
  43. m_bPreSubclassInit = true;
  44. }
  45. CXTColorBase::~CXTColorBase()
  46. {
  47. }
  48. CXTColorBase::FocusedControl CXTColorBase::m_eHasFocus = focusNone;
  49. BEGIN_MESSAGE_MAP(CXTColorBase, CStatic)
  50. //{{AFX_MSG_MAP(CXTColorBase)
  51. ON_WM_LBUTTONDOWN()
  52. ON_WM_MOUSEMOVE()
  53. ON_WM_LBUTTONUP()
  54. ON_WM_LBUTTONDBLCLK()
  55. ON_WM_CREATE()
  56. //}}AFX_MSG_MAP
  57. END_MESSAGE_MAP()
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CXTColorBase message handlers
  60. bool CXTColorBase::Init()
  61. {
  62. if (::IsWindow(m_hWnd))
  63. {
  64. // Set the style to SS_NOTIFY.
  65. DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
  66. ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY);
  67. return true;
  68. }
  69. return false;
  70. }
  71. void CXTColorBase::PreSubclassWindow()
  72. {
  73. CWnd::PreSubclassWindow();
  74. if (m_bPreSubclassInit)
  75. {
  76. // Initialize the control.
  77. Init();
  78. }
  79. }
  80. int CXTColorBase::OnCreate(LPCREATESTRUCT lpCreateStruct)
  81. {
  82. if (CWnd::OnCreate(lpCreateStruct) == -1)
  83. return -1;
  84. // Initialize the control.
  85. Init();
  86. return 0;
  87. }
  88. BOOL CXTColorBase::PreCreateWindow(CREATESTRUCT& cs)
  89. {
  90. if (!CWnd::PreCreateWindow(cs))
  91. return FALSE;
  92. // When creating controls dynamically Init() must
  93. // be called from OnCreate() and not from
  94. // PreSubclassWindow().
  95. m_bPreSubclassInit = false;
  96. return TRUE;
  97. }
  98. void CXTColorBase::OnLButtonDown(UINT nFlags, CPoint point)
  99. {
  100. CWnd::OnLButtonDown(nFlags, point);
  101. SetCapture();
  102. UpdateCursorPos(point);
  103. if (GetFocus() != this)
  104. {
  105. SetFocus();
  106. }
  107. }
  108. void CXTColorBase::OnLButtonUp(UINT nFlags, CPoint point)
  109. {
  110. ReleaseCapture();
  111. CStatic::OnLButtonUp(nFlags, point);
  112. }
  113. void CXTColorBase::OnMouseMove(UINT nFlags, CPoint point)
  114. {
  115. CWnd::OnMouseMove(nFlags, point);
  116. if (nFlags & MK_LBUTTON)
  117. {
  118. UpdateCursorPos(point);
  119. if (GetFocus() != this)
  120. {
  121. SetFocus();
  122. }
  123. }
  124. }
  125. void CXTColorBase::OnLButtonDblClk(UINT nFlags, CPoint point)
  126. {
  127. CStatic::OnLButtonDblClk(nFlags, point);
  128. UpdateCursorPos(point);
  129. CPropertyPage* pParentPage = (CPropertyPage*)GetParent();
  130. ASSERT_VALID(pParentPage);
  131. CPropertySheet* pParentSheet = (CPropertySheet*)pParentPage->GetParent();
  132. ASSERT_VALID(pParentSheet);
  133. pParentSheet->EndDialog(IDOK);
  134. }
  135. void CXTColorBase::UpdateCursorPos(CPoint /*point*/)
  136. {
  137. }
  138. COLORREF CXTColorBase::HLStoRGB(double h, double l, double s)
  139. {
  140. return CXTColorRef::fromHSL(h, s, l);
  141. }
  142. void CXTColorBase::RGBtoHSL(COLORREF color, double* h, double* s, double* l)
  143. {
  144. CXTColorRef(color).toHSL(*h, *s, *l);
  145. }
  146. /////////////////////////////////////////////////////////////////////////////
  147. // CXTColorWnd
  148. CXTColorWnd::CXTColorWnd()
  149. {
  150. }
  151. CXTColorWnd::~CXTColorWnd()
  152. {
  153. }
  154. BEGIN_MESSAGE_MAP(CXTColorWnd, CXTColorBase)
  155. //{{AFX_MSG_MAP(CXTColorWnd)
  156. ON_WM_PAINT()
  157. ON_WM_SETFOCUS()
  158. ON_WM_KILLFOCUS()
  159. ON_WM_ERASEBKGND()
  160. //}}AFX_MSG_MAP
  161. END_MESSAGE_MAP()
  162. /////////////////////////////////////////////////////////////////////////////
  163. // CXTColorWnd message handlers
  164. void CXTColorWnd::OnPaint()
  165. {
  166. CPaintDC dc(this); // device context for painting
  167. CRect rc;
  168. GetClientRect(&rc);
  169. CXTPBufferDC memDC(dc);
  170. int cy = rc.Height();
  171. int cx = rc.Width();
  172. if (m_bmpPicker.GetSafeHandle() == NULL)
  173. {
  174. // create bitmap
  175. m_bmpPicker.CreateCompatibleBitmap(&memDC, cx, cy);
  176. // create picker DC
  177. CXTPCompatibleDC dcPicker(&memDC, m_bmpPicker);
  178. // fill color picker bitmap
  179. int x;
  180. for (x = 0; x < cx; x++)
  181. {
  182. int y;
  183. for (y = 0; y < cy; y++)
  184. {
  185. COLORREF clr = HLStoRGB((double)x/(double)cx,
  186. DEFAULT_LUMINANCE, (double)y/(double)cy);
  187. dcPicker.SetPixelV(x, (cy-1)-y, clr);
  188. }
  189. }
  190. }
  191. memDC.DrawState(CPoint(0, 0), CSize(0, 0), &m_bmpPicker, DSS_NORMAL, NULL);
  192. DrawCrossHair(&memDC);
  193. }
  194. BOOL CXTColorWnd::OnEraseBkgnd(CDC* /*pDC*/)
  195. {
  196. return TRUE;
  197. }
  198. void CXTColorWnd::UpdateCursorPos(CPoint point)
  199. {
  200. CRect rcClient;
  201. GetClientRect(rcClient);
  202. if (point.y < 0) point.y = 0;
  203. if (point.x < 0) point.x = 0;
  204. if (point.y > rcClient.bottom) point.y = rcClient.bottom;
  205. if (point.x > rcClient.right) point.x = rcClient.right;
  206. m_ptMousePos = point;
  207. m_nHue = (double)point.x / (double)rcClient.Width();
  208. m_nSat = (double)(rcClient.Height() - point.y) / (double)rcClient.Height();
  209. GetParent()->SendMessage(XTWM_UPDATECOLOR, 0, (LPARAM)m_hWnd);
  210. Invalidate(FALSE);
  211. }
  212. BOOL CXTColorWnd::PreTranslateMessage(MSG* pMsg)
  213. {
  214. if (m_eHasFocus == focusColorWheel)
  215. {
  216. switch (pMsg->message)
  217. {
  218. case WM_KEYDOWN:
  219. {
  220. CRect rect;
  221. GetClientRect(&rect);
  222. TCHAR vkey = (TCHAR)pMsg->wParam;
  223. switch (vkey)
  224. {
  225. case VK_LEFT:
  226. m_ptMousePos.x--;
  227. UpdateCursorPos(m_ptMousePos);
  228. return TRUE;
  229. case VK_UP:
  230. m_ptMousePos.y--;
  231. UpdateCursorPos(m_ptMousePos);
  232. return TRUE;
  233. case VK_RIGHT:
  234. m_ptMousePos.x++;
  235. UpdateCursorPos(m_ptMousePos);
  236. return TRUE;
  237. case VK_DOWN:
  238. m_ptMousePos.y++;
  239. UpdateCursorPos(m_ptMousePos);
  240. return TRUE;
  241. case VK_RETURN:
  242. case VK_SPACE:
  243. CPropertyPage* pParentPage = (CPropertyPage*)GetParent();
  244. ASSERT_VALID(pParentPage);
  245. CPropertySheet* pParentSheet = (CPropertySheet*)pParentPage->GetParent();
  246. ASSERT_VALID(pParentSheet);
  247. pParentSheet->EndDialog(IDOK);
  248. break;
  249. }
  250. }
  251. break;
  252. }
  253. }
  254. return CStatic::PreTranslateMessage(pMsg);
  255. }
  256. void CXTColorWnd::DrawCrossHair(CDC* pDC)
  257. {
  258. int x = m_ptMousePos.x;
  259. int y = m_ptMousePos.y;
  260. CPen pen1(PS_SOLID, 1, RGB(0xff, 0xff, 0xff));
  261. CPen pen2(PS_SOLID, 1, RGB(0x00, 0x00, 0x00));
  262. CPen* pOldPen = pDC->SelectObject((m_eHasFocus == focusColorWheel) ? &pen1 : &pen2);
  263. pDC->MoveTo(x-5, y-1);
  264. pDC->LineTo(x-10, y-1);
  265. pDC->MoveTo(x-5, y);
  266. pDC->LineTo(x-10, y);
  267. pDC->MoveTo(x-5, y + 1);
  268. pDC->LineTo(x-10, y + 1);
  269. pDC->MoveTo(x + 5, y-1);
  270. pDC->LineTo(x + 10, y-1);
  271. pDC->MoveTo(x + 5, y);
  272. pDC->LineTo(x + 10, y);
  273. pDC->MoveTo(x + 5, y + 1);
  274. pDC->LineTo(x + 10, y + 1);
  275. pDC->MoveTo(x-1, y-5);
  276. pDC->LineTo(x-1, y-10);
  277. pDC->MoveTo(x, y-5);
  278. pDC->LineTo(x, y-10);
  279. pDC->MoveTo(x + 1, y-5);
  280. pDC->LineTo(x + 1, y-10);
  281. pDC->MoveTo(x-1, y + 5);
  282. pDC->LineTo(x-1, y + 10);
  283. pDC->MoveTo(x, y + 5);
  284. pDC->LineTo(x, y + 10);
  285. pDC->MoveTo(x + 1, y + 5);
  286. pDC->LineTo(x + 1, y + 10);
  287. pDC->SelectObject(pOldPen);
  288. }
  289. void CXTColorWnd::SetColor(double nHue, double nSat)
  290. {
  291. SetHue(nHue);
  292. SetSaturation(nSat);
  293. }
  294. void CXTColorWnd::SetHue(double h)
  295. {
  296. m_nHue = h;
  297. CRect rc;
  298. GetClientRect(&rc);
  299. m_ptMousePos.x = (long)((double)rc.Width() * h);
  300. Invalidate(FALSE);
  301. }
  302. void CXTColorWnd::SetSaturation(double s)
  303. {
  304. m_nSat = s;
  305. CRect rc;
  306. GetClientRect(&rc);
  307. m_ptMousePos.y = rc.Height()-(long)((double)rc.Height() * s);
  308. Invalidate(FALSE);
  309. }
  310. void CXTColorWnd::OnSetFocus(CWnd* pOldWnd)
  311. {
  312. CXTColorBase::OnSetFocus(pOldWnd);
  313. m_eHasFocus = focusColorWheel;
  314. Invalidate(FALSE);
  315. }
  316. void CXTColorWnd::OnKillFocus(CWnd* pNewWnd)
  317. {
  318. CXTColorBase::OnKillFocus(pNewWnd);
  319. m_eHasFocus = focusNone;
  320. Invalidate(FALSE);
  321. }
  322. /////////////////////////////////////////////////////////////////////////////
  323. // CXTColorLum
  324. CXTColorLum::CXTColorLum()
  325. {
  326. m_ptMousePos.y = 0;
  327. }
  328. CXTColorLum::~CXTColorLum()
  329. {
  330. }
  331. BEGIN_MESSAGE_MAP(CXTColorLum, CXTColorBase)
  332. //{{AFX_MSG_MAP(CXTColorLum)
  333. ON_WM_PAINT()
  334. ON_WM_SETFOCUS()
  335. ON_WM_KILLFOCUS()
  336. ON_WM_ERASEBKGND()
  337. //}}AFX_MSG_MAP
  338. END_MESSAGE_MAP()
  339. /////////////////////////////////////////////////////////////////////////////
  340. // CXTColorLum message handlers
  341. void CXTColorLum::OnPaint()
  342. {
  343. CPaintDC dc(this); // device context for painting
  344. CRect rc;
  345. GetClientRect(&rc);
  346. CXTPBufferDC memDC(dc);
  347. HBRUSH hBrush = (HBRUSH)GetParent()->SendMessage(WM_CTLCOLORSTATIC, (WPARAM)memDC.GetSafeHdc(), (LPARAM)m_hWnd);
  348. if (hBrush)
  349. {
  350. ::FillRect(memDC.GetSafeHdc(), rc, hBrush);
  351. }
  352. else
  353. {
  354. memDC.FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  355. }
  356. DrawLuminanceBar(&memDC);
  357. DrawSliderArrow(&memDC);
  358. }
  359. BOOL CXTColorLum::OnEraseBkgnd(CDC* /*pDC*/)
  360. {
  361. return TRUE;
  362. }
  363. void CXTColorLum::GetLumBarRect(CRect& rect)
  364. {
  365. GetClientRect(&rect);
  366. rect.DeflateRect(0, 4);
  367. rect.right = rect.left + 14;
  368. }
  369. void CXTColorLum::SetColor(double nHue, double nSat)
  370. {
  371. m_nHue = nHue;
  372. m_nSat = nSat;
  373. Invalidate(FALSE);
  374. }
  375. void CXTColorLum::SetLuminance(double l)
  376. {
  377. m_nLum = l;
  378. CRect rcBar;
  379. GetLumBarRect(rcBar);
  380. // Set the slider position based on the current
  381. // luminance.
  382. m_ptMousePos.y = rcBar.top + rcBar.Height()-(long)((double)rcBar.Height() * l);
  383. Invalidate(FALSE);
  384. }
  385. void CXTColorLum::DrawLuminanceBar(CDC* pDC)
  386. {
  387. CRect rcBar;
  388. GetLumBarRect(rcBar);
  389. int  cy = rcBar.Height();
  390. int  cx = rcBar.Width();
  391. // fill color picker bitmap
  392. for (int y = 0; y < cy; y++)
  393. {
  394. COLORREF clr;
  395. if (y == cy)
  396. {
  397. clr = RGB(0x00, 0x00, 0x00);
  398. }
  399. else if (y == 0)
  400. {
  401. clr = RGB(0xff, 0xff, 0xff);
  402. }
  403. else
  404. {
  405. clr = HLStoRGB(m_nHue, (double)((double)(cy - y)/(double)cy), m_nSat);
  406. }
  407. pDC->FillSolidRect(rcBar.left, y + rcBar.top, cx, 1, clr);
  408. }
  409. }
  410. void CXTColorLum::DrawSliderArrow(CDC* pDC)
  411. {
  412. CRect rc;
  413. GetClientRect(&rc);
  414. rc.left += 17;
  415. int x = rc.left;
  416. int y = m_ptMousePos.y;
  417. CRect rcBar;
  418. GetLumBarRect(rcBar);
  419. y = max(rcBar.top, y);
  420. y = min(rcBar.bottom, y);
  421. CPen pen1(PS_SOLID, 1, RGB(0x00, 0x00, 0x00));
  422. CPen pen2(PS_SOLID, 1, GetXtremeColor(COLOR_3DSHADOW));
  423. CPen* pOldPen = pDC->SelectObject((m_eHasFocus == focusLumination) ? &pen1 : &pen2);
  424. pDC->MoveTo(x + 7, y-4);
  425. pDC->LineTo(x + 9, y-4);
  426. pDC->MoveTo(x + 5, y-3);
  427. pDC->LineTo(x + 9, y-3);
  428. pDC->MoveTo(x + 3, y-2);
  429. pDC->LineTo(x + 9, y-2);
  430. pDC->MoveTo(x + 1, y-1);
  431. pDC->LineTo(x + 9, y-1);
  432. pDC->MoveTo(x, y);
  433. pDC->LineTo(x + 9, y);
  434. pDC->MoveTo(x + 2, y + 1);
  435. pDC->LineTo(x + 9, y + 1);
  436. pDC->MoveTo(x + 4, y + 2);
  437. pDC->LineTo(x + 9, y + 2);
  438. pDC->MoveTo(x + 6, y + 3);
  439. pDC->LineTo(x + 9, y + 3);
  440. pDC->MoveTo(x + 8, y + 4);
  441. pDC->LineTo(x + 9, y + 4);
  442. if (m_eHasFocus != focusLumination)
  443. {
  444. COLORREF clr = RGB(0x00, 0x00, 0x00);
  445. pDC->SetPixel(x, y, clr);
  446. pDC->SetPixel(x + 1, y, clr);
  447. pDC->SetPixel(x + 1, y-1, clr);
  448. pDC->SetPixel(x + 2, y-1, clr);
  449. pDC->SetPixel(x + 3, y-2, clr);
  450. pDC->SetPixel(x + 4, y-2, clr);
  451. pDC->SetPixel(x + 5, y-3, clr);
  452. pDC->SetPixel(x + 6, y-3, clr);
  453. pDC->SetPixel(x + 7, y-4, clr);
  454. pDC->SetPixel(x + 8, y-4, clr);
  455. pDC->SetPixel(x + 8, y-3, clr);
  456. pDC->SetPixel(x + 8, y-2, clr);
  457. pDC->SetPixel(x + 8, y-1, clr);
  458. pDC->SetPixel(x + 8, y, clr);
  459. pDC->SetPixel(x + 8, y + 1, clr);
  460. pDC->SetPixel(x + 8, y + 2, clr);
  461. pDC->SetPixel(x + 8, y + 3, clr);
  462. pDC->SetPixel(x + 8, y + 4, clr);
  463. pDC->SetPixel(x + 7, y + 3, clr);
  464. pDC->SetPixel(x + 6, y + 3, clr);
  465. pDC->SetPixel(x + 5, y + 2, clr);
  466. pDC->SetPixel(x + 4, y + 2, clr);
  467. pDC->SetPixel(x + 3, y + 1, clr);
  468. pDC->SetPixel(x + 2, y + 1, clr);
  469. }
  470. pDC->SelectObject(pOldPen);
  471. }
  472. void CXTColorLum::UpdateCursorPos(CPoint point)
  473. {
  474. point.x = 0;
  475. CRect rcBar;
  476. GetLumBarRect(rcBar);
  477. point.y = max(rcBar.top, point.y);
  478. point.y = min(rcBar.bottom, point.y);
  479. double cy = (double)rcBar.Height();
  480. m_nLum = double(double(cy - (point.y - rcBar.top))/cy);
  481. GetParent()->SendMessage(XTWM_UPDATECOLOR, 0, (LPARAM)m_hWnd);
  482. m_ptMousePos = point;
  483. Invalidate(FALSE);
  484. }
  485. BOOL CXTColorLum::PreTranslateMessage(MSG* pMsg)
  486. {
  487. if (m_eHasFocus == focusLumination)
  488. {
  489. CRect rcBar;
  490. GetLumBarRect(rcBar);
  491. switch (pMsg->message)
  492. {
  493. case WM_KEYDOWN:
  494. {
  495. TCHAR vkey = (TCHAR)pMsg->wParam;
  496. switch (vkey)
  497. {
  498. case VK_UP:
  499. m_ptMousePos.y--;
  500. UpdateCursorPos(m_ptMousePos);
  501. return TRUE;
  502. case VK_DOWN:
  503. m_ptMousePos.y++;
  504. UpdateCursorPos(m_ptMousePos);
  505. return TRUE;
  506. case VK_RETURN:
  507. case VK_SPACE:
  508. CPropertyPage* pParentPage = (CPropertyPage*)GetParent();
  509. ASSERT_VALID(pParentPage);
  510. CPropertySheet* pParentSheet = (CPropertySheet*)pParentPage->GetParent();
  511. ASSERT_VALID(pParentSheet);
  512. pParentSheet->EndDialog(IDOK);
  513. break;
  514. }
  515. }
  516. break;
  517. }
  518. }
  519. return CStatic::PreTranslateMessage(pMsg);
  520. }
  521. void CXTColorLum::OnSetFocus(CWnd* pOldWnd)
  522. {
  523. CXTColorBase::OnSetFocus(pOldWnd);
  524. m_eHasFocus = focusLumination;
  525. Invalidate(FALSE);
  526. }
  527. void CXTColorLum::OnKillFocus(CWnd* pNewWnd)
  528. {
  529. CXTColorBase::OnKillFocus(pNewWnd);
  530. m_eHasFocus = focusNone;
  531. Invalidate(FALSE);
  532. }
  533. /////////////////////////////////////////////////////////////////////////////
  534. // CXTColorPageCustom
  535. BEGIN_MESSAGE_MAP(CXTColorPageCustom, CPropertyPage)
  536. //{{AFX_MSG_MAP(CXTColorPageCustom)
  537. ON_EN_CHANGE(XT_IDC_EDIT_RED, OnChangeEdit)
  538. ON_EN_CHANGE(XT_IDC_EDIT_GREEN, OnChangeEdit)
  539. ON_EN_CHANGE(XT_IDC_EDIT_BLUE, OnChangeEdit)
  540. ON_EN_CHANGE(XT_IDC_EDIT_LUM, OnChangeEditLum)
  541. ON_EN_CHANGE(XT_IDC_EDIT_HUE, OnChangeEditHue)
  542. ON_EN_CHANGE(XT_IDC_EDIT_SAT, OnChangeEditSat)
  543. //}}AFX_MSG_MAP
  544. ON_MESSAGE(XTWM_UPDATECOLOR, OnUpdateColor)
  545. END_MESSAGE_MAP()
  546. /////////////////////////////////////////////////////////////////////////////
  547. // CXTColorPageCustom construction/destruction
  548. CXTColorPageCustom::CXTColorPageCustom(CXTColorDialog* pParentSheet)
  549. : CPropertyPage(CXTColorPageCustom::IDD)
  550. {
  551. m_psp.dwFlags &= ~PSP_HASHELP;
  552. m_pParentSheet = pParentSheet;
  553. //{{AFX_DATA_INIT(CXTColorPageCustom)
  554. m_nR = 0;
  555. m_nB = 0;
  556. m_nG = 0;
  557. m_nH = 0;
  558. m_nL = 0;
  559. m_nS = 0;
  560. //}}AFX_DATA_INIT
  561. }
  562. CXTColorPageCustom::~CXTColorPageCustom()
  563. {
  564. }
  565. void CXTColorPageCustom::DoDataExchange(CDataExchange* pDX)
  566. {
  567. CPropertyPage::DoDataExchange(pDX);
  568. //{{AFX_DATA_MAP(CXTColorPageCustom)
  569. DDX_Control(pDX, XT_IDC_CLR_WND, m_colorWnd);
  570. DDX_Control(pDX, XT_IDC_CLR_LUM, m_colorLum);
  571. DDX_Control(pDX, XT_IDC_TXT_SAT, m_txtSat);
  572. DDX_Control(pDX, XT_IDC_TXT_RED, m_txtRed);
  573. DDX_Control(pDX, XT_IDC_TXT_LUM, m_txtLum);
  574. DDX_Control(pDX, XT_IDC_TXT_HUE, m_txtHue);
  575. DDX_Control(pDX, XT_IDC_TXT_GREEN, m_txtGreen);
  576. DDX_Control(pDX, XT_IDC_TXT_BLUE, m_txtBlue);
  577. DDX_Control(pDX, XT_IDC_SPIN_SAT, m_spinSat);
  578. DDX_Control(pDX, XT_IDC_SPIN_RED, m_spinRed);
  579. DDX_Control(pDX, XT_IDC_SPIN_LUM, m_spinLum);
  580. DDX_Control(pDX, XT_IDC_SPIN_HUE, m_spinHue);
  581. DDX_Control(pDX, XT_IDC_SPIN_GREEN, m_spinGreen);
  582. DDX_Control(pDX, XT_IDC_SPIN_BLUE, m_spinBlue);
  583. DDX_Control(pDX, XT_IDC_EDIT_HUE, m_editHue);
  584. DDX_Control(pDX, XT_IDC_EDIT_GREEN, m_editGreen);
  585. DDX_Control(pDX, XT_IDC_EDIT_BLUE, m_editBlue);
  586. DDX_Control(pDX, XT_IDC_EDIT_LUM, m_editLum);
  587. DDX_Control(pDX, XT_IDC_EDIT_RED, m_editRed);
  588. DDX_Control(pDX, XT_IDC_EDIT_SAT, m_editSat);
  589. DDX_Text(pDX, XT_IDC_EDIT_RED, m_nR);
  590. DDV_MinMaxInt(pDX, m_nR, 0, 255);
  591. DDX_Text(pDX, XT_IDC_EDIT_BLUE, m_nB);
  592. DDV_MinMaxInt(pDX, m_nB, 0, 255);
  593. DDX_Text(pDX, XT_IDC_EDIT_GREEN, m_nG);
  594. DDV_MinMaxInt(pDX, m_nG, 0, 255);
  595. DDX_Text(pDX, XT_IDC_EDIT_HUE, m_nH);
  596. DDV_MinMaxInt(pDX, m_nH, 0, 255);
  597. DDX_Text(pDX, XT_IDC_EDIT_LUM, m_nL);
  598. DDV_MinMaxInt(pDX, m_nL, 0, 255);
  599. DDX_Text(pDX, XT_IDC_EDIT_SAT, m_nS);
  600. DDV_MinMaxInt(pDX, m_nS, 0, 255);
  601. //}}AFX_DATA_MAP
  602. }
  603. BOOL CXTColorPageCustom::OnInitDialog()
  604. {
  605. CPropertyPage::OnInitDialog();
  606. // TODO: Add extra initialization here
  607. m_spinSat.SetBuddy(&m_editSat);
  608. m_spinSat.SetRange(0, 255);
  609. m_spinLum.SetBuddy(&m_editLum);
  610. m_spinLum.SetRange(0, 255);
  611. m_spinHue.SetBuddy(&m_editHue);
  612. m_spinHue.SetRange(0, 255);
  613. m_spinRed.SetBuddy(&m_editRed);
  614. m_spinRed.SetRange(0, 255);
  615. m_spinGreen.SetBuddy(&m_editGreen);
  616. m_spinGreen.SetRange(0, 255);
  617. m_spinBlue.SetBuddy(&m_editBlue);
  618. m_spinBlue.SetRange(0, 255);
  619. CRect rc;
  620. m_colorLum.GetWindowRect(&rc);
  621. ScreenToClient(rc);
  622. rc.InflateRect(0, 4);
  623. m_colorLum.MoveWindow(&rc);
  624. return TRUE;
  625. }
  626. BOOL CXTColorPageCustom::OnSetActive()
  627. {
  628. COLORREF clr = m_pParentSheet->GetColor();
  629. RGBtoHSL(clr, &m_nL, &m_nS, &m_nH);
  630. m_colorWnd.SetColor((double)m_nH/255, (double)m_nS/255);
  631. m_colorLum.SetColor((double)m_nH/255, (double)m_nS/255);
  632. m_colorLum.SetLuminance((double)m_nL/255);
  633. UpdateRGB(clr);
  634. return CPropertyPage::OnSetActive();
  635. }
  636. void CXTColorPageCustom::OnChangeEdit()
  637. {
  638. UpdateData();
  639. COLORREF clr = (COLORREF)RGB(m_nR, m_nG, m_nB);
  640. OnUpdateColor((WPARAM)clr, 0);
  641. }
  642. void CXTColorPageCustom::OnChangeEditLum()
  643. {
  644. UpdateData();
  645. m_colorLum.SetLuminance((double)m_nL/255);
  646. COLORREF clr = m_colorLum.HLStoRGB((double)m_nH/255, (double)m_nL/255, (double)m_nS/255);
  647. if (clr != m_pParentSheet->GetColor())
  648. m_pParentSheet->SetNewColor(clr, FALSE);
  649. UpdateRGB(clr);
  650. }
  651. void CXTColorPageCustom::UpdateRGB(COLORREF clr)
  652. {
  653. m_nR = GetRValue(clr);
  654. m_nG = GetGValue(clr);
  655. m_nB = GetBValue(clr);
  656. UpdateData(FALSE);
  657. }
  658. void CXTColorPageCustom::OnChangeEditHue()
  659. {
  660. UpdateData();
  661. m_colorWnd.SetHue((double)m_nH/255);
  662. COLORREF clr = m_colorWnd.HLStoRGB((double)m_nH/255, (double)m_nL/255, (double)m_nS/255);
  663. m_colorLum.SetColor((double)m_nH/255, (double)m_nS/255);
  664. if (clr != m_pParentSheet->GetColor())
  665. m_pParentSheet->SetNewColor(clr, FALSE);
  666. UpdateRGB(clr);
  667. }
  668. void CXTColorPageCustom::OnChangeEditSat()
  669. {
  670. UpdateData();
  671. m_colorWnd.SetSaturation((double)m_nS/255);
  672. COLORREF clr = m_colorWnd.HLStoRGB((double)m_nH/255, (double)m_nL/255, (double)m_nS/255);
  673. m_colorLum.SetColor((double)m_nH/255, (double)m_nS/255);
  674. if (clr != m_pParentSheet->GetColor())
  675. m_pParentSheet->SetNewColor(clr, FALSE);
  676. UpdateRGB(clr);
  677. }
  678. LRESULT CXTColorPageCustom::OnUpdateColor(WPARAM wParam, LPARAM lParam)
  679. {
  680. COLORREF clr = (COLORREF)wParam;
  681. if ((HWND)lParam == m_colorWnd)
  682. {
  683. m_nS = int(m_colorWnd.m_nSat * 255);
  684. m_nH = int(m_colorWnd.m_nHue * 255);
  685. clr = m_colorWnd.HLStoRGB((double)m_nH/255, (double)m_nL/255, (double)m_nS/255);
  686. m_colorLum.SetColor((double)m_nH/255, (double)m_nS/255);
  687. }
  688. if ((HWND)lParam == m_colorLum)
  689. {
  690. m_nL = int(m_colorLum.m_nLum * 255);
  691. clr = m_colorWnd.HLStoRGB((double)m_nH/255, (double)m_nL/255, (double)m_nS/255);
  692. }
  693. if (lParam == 0)
  694. {
  695. RGBtoHSL(clr, &m_nL, &m_nS, &m_nH);
  696. m_colorWnd.SetColor((double)m_nH/255, (double)m_nS/255);
  697. m_colorLum.SetColor((double)m_nH/255, (double)m_nS/255);
  698. m_colorLum.SetLuminance((double)m_nL/255);
  699. }
  700. if (clr != m_pParentSheet->GetColor())
  701. m_pParentSheet->SetNewColor(clr, FALSE);
  702. UpdateRGB(clr);
  703. return 0;
  704. }
  705. void CXTColorPageCustom::RGBtoHSL(COLORREF color, int* lum, int* sat, int* hue)
  706. {
  707. double r = (double)GetRValue(color)/255;
  708. double g = (double)GetGValue(color)/255;
  709. double b = (double)GetBValue(color)/255;
  710. double maxcolor = __max(r, __max(g, b));
  711. double mincolor = __min(r, __min(g, b));
  712. double l = (maxcolor + mincolor)/2;
  713. if (maxcolor == mincolor)
  714. {
  715. *hue = 0;
  716. *sat = 0;
  717. }
  718. else
  719. {
  720. double s;
  721. double h;
  722. if (l < 0.5)
  723. s = (maxcolor-mincolor)/(maxcolor + mincolor);
  724. else
  725. s = (maxcolor-mincolor)/(2.0-maxcolor-mincolor);
  726. if (r == maxcolor)
  727. h = (g-b)/(maxcolor-mincolor);
  728. else if (g == maxcolor)
  729. h = 2.0+(b-r)/(maxcolor-mincolor);
  730. else
  731. h = 4.0+(r-g)/(maxcolor-mincolor);
  732. h /= 6.0;
  733. if (h < 0.0)
  734. h += 1;
  735. *hue = (int)((double)h * 255);
  736. *sat = (int)((double)s * 255);
  737. }
  738. *lum = (int)((double)l * 255);
  739. }