EditColorDlg.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:13k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // EditColorDlg.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include "MyColorPaletteWnd.h"
  22. #include "EditColorDlg.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CEditColorDlg dialog
  30. CEditColorDlg::CEditColorDlg(C3dColorList* pList, C3dColor* pColor, CWnd* pParent /*=NULL*/)
  31. : CDialog(CEditColorDlg::IDD, pParent)
  32. {
  33. m_pList = pList;
  34. if(pColor)
  35. {
  36. m_Color.SetColor4fv(pColor);
  37. m_ColorRef.SetColor4fv(pColor);
  38. m_Color.m_szName = pColor->m_szName;
  39. }
  40. else
  41. {
  42. m_Color.SetColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Default to White
  43. m_ColorRef.SetColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  44. m_Color.m_szName = "White";
  45. }
  46. // initialize our class variables
  47. m_iSliderMaxRange = 255;
  48. //{{AFX_DATA_INIT(CEditColorDlg)
  49. m_fBlu = 0.0f;
  50. m_fGrn = 0.0f;
  51. m_fRed = 0.0f;
  52. m_fAlpha = 0.0f;
  53. //}}AFX_DATA_INIT
  54. }
  55. BOOL CEditColorDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  56. {
  57. // TODO: Add your specialized code here and/or call the base class
  58. return CDialog::Create(IDD, pParentWnd);
  59. }
  60. void CEditColorDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CEditColorDlg)
  64. DDX_Control(pDX, IDC_SLIDER_GRADIENT, m_wndGradientSlider);
  65. DDX_Control(pDX, IDC_COLOR_COMBO, m_wndColorComboBox);
  66. DDX_Text(pDX, IDC_BLU, m_fBlu);
  67. DDV_MinMaxFloat(pDX, m_fBlu, 0.f, 1.f);
  68. DDX_Text(pDX, IDC_GRN, m_fGrn);
  69. DDV_MinMaxFloat(pDX, m_fGrn, 0.f, 1.f);
  70. DDX_Text(pDX, IDC_RED, m_fRed);
  71. DDV_MinMaxFloat(pDX, m_fRed, 0.f, 1.f);
  72. DDX_Text(pDX, IDC_ALPHA, m_fAlpha);
  73. DDV_MinMaxFloat(pDX, m_fAlpha, 0.f, 1.f);
  74. //}}AFX_DATA_MAP
  75. }
  76. BEGIN_MESSAGE_MAP(CEditColorDlg, CDialog)
  77. //{{AFX_MSG_MAP(CEditColorDlg)
  78. ON_WM_VSCROLL()
  79. ON_CBN_DROPDOWN(IDC_COLOR_COMBO, OnDropdownColorCombo)
  80. ON_CBN_SELCHANGE(IDC_COLOR_COMBO, OnSelchangeColorCombo)
  81. ON_WM_CREATE()
  82. ON_WM_PAINT()
  83. ON_EN_KILLFOCUS(IDC_RED, OnKillfocusRed)
  84. ON_EN_KILLFOCUS(IDC_GRN, OnKillfocusGrn)
  85. ON_EN_KILLFOCUS(IDC_BLU, OnKillfocusBlu)
  86. ON_EN_KILLFOCUS(IDC_ALPHA, OnKillfocusAlpha)
  87. ON_WM_DESTROY()
  88. //}}AFX_MSG_MAP
  89. // USER defined messages
  90. ON_MESSAGE( WM_CPW_LBUTTONDOWN, OnColorPaletteLButtonDown)
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CEditColorDlg message handlers
  94. int CEditColorDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  95. {
  96. if (CDialog::OnCreate(lpCreateStruct) == -1)
  97. return -1;
  98. return 0;
  99. }
  100. BOOL CEditColorDlg::OnInitDialog() 
  101. {
  102. RECT rect; // Used to get window coordinates
  103. // Let the base class do the initializing..
  104. CDialog::OnInitDialog();
  105. // Get the Color Palette Window rect size
  106. GetDlgItem(IDC_COLOR_CUBE_WND)->GetWindowRect(&rect);
  107. ScreenToClient(&rect);
  108. // Create the Color Palette Cube window
  109. if (!m_wndColorCube.Create(NULL, // dwExtStyle
  110. NULL, // Class Name
  111. "Palette Cube", // Window name
  112. WS_CHILD | WS_VISIBLE | // dwStyle
  113. WS_DLGFRAME |
  114. WS_HSCROLL | WS_VSCROLL,
  115. rect, // rect
  116. this, // CWnd* pParentWnd
  117. IDC_COLOR_CUBE_WND, // UINT  nID
  118. 0)) { // pContext
  119. return -1;
  120. }
  121. // Get the 'Selected Color' window rect size
  122. GetDlgItem(IDC_SELECTED_COLOR_WND)->GetWindowRect(&rect);
  123. ScreenToClient(&rect);
  124. // Create the 'Selected Color' window
  125. if (!m_wndSelColor.Create(NULL, // lpszClassName
  126. NULL, // lpszWindowName
  127. WS_CHILD | WS_VISIBLE | // dwStyle
  128. WS_DLGFRAME |
  129. WS_CLIPSIBLINGS,
  130. rect, // rect
  131. this, // CWnd* pParentWnd
  132. IDC_SELECTED_COLOR_WND, // UINT  nID
  133. 0)) { // pContext
  134. return -1;
  135. }
  136. // Get the Gradient color Window rect size
  137. GetDlgItem(IDC_GRADIENT_WND)->GetWindowRect(&rect);
  138. ScreenToClient(&rect);
  139. // Create the Gradient color window
  140. if (!m_wndGradient.Create(NULL, // lpszClassName
  141. NULL, // lpszWindowName
  142. WS_CHILD | WS_VISIBLE | // dwStyle
  143. WS_DLGFRAME |
  144. WS_CLIPSIBLINGS,
  145. rect, // rect
  146. this, // CWnd* pParentWnd
  147. IDC_GRADIENT_WND, // UINT  nID
  148. 0)) { // pContext
  149. return -1;
  150. }
  151. // Set the range of our gradient slider
  152. CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_GRADIENT);
  153. pSlider->SetRange(0, m_iSliderMaxRange, TRUE);
  154. UpDateRGBValues();
  155. return TRUE;  // return TRUE unless you set the focus to a control
  156.               // EXCEPTION: OCX Property Pages should return FALSE
  157. }
  158. void CEditColorDlg::UpDateRGBValues()
  159. {
  160. // Set our local values to the colors' values
  161. m_fRed   = m_Color.m_fColor[0];
  162. m_fGrn   = m_Color.m_fColor[1];
  163. m_fBlu   = m_Color.m_fColor[2];
  164. m_fAlpha = m_Color.m_fColor[3];
  165. // Dialog box is being initialized (FALSE)
  166. // or data is being retrieved (TRUE).
  167. UpdateData(FALSE);
  168. }
  169. void CEditColorDlg::OnDestroy() 
  170. {
  171. CDialog::OnDestroy();
  172. // Destroy the color cube window
  173. m_wndColorCube.DestroyWindow();
  174. // Destroy the gradient color window
  175. m_wndGradient.DestroyWindow();
  176. // Destroy the selected color window
  177. m_wndSelColor.DestroyWindow();
  178. }
  179. void CEditColorDlg::OnPaint() 
  180. {
  181. CPaintDC dc(this); // device context for painting
  182. // Paint our 'Selected Color' window
  183. PaintSelColorWnd();
  184. // Position our gradient slider control; (this will inturn
  185. // paint our gradient color window)
  186. PosnGradientSlider();
  187. // Do not call CDialog::OnPaint() for painting messages
  188. }
  189. void CEditColorDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  190. {
  191. // Note:  MFC maps vertically oriented CSliderCtrl to WM_VSCROLL
  192. //   and horizontally oriented CSliderCtrl to WM_HSCROLL
  193. // Get the position of our color slider and calculate the 
  194. // difference in position to our initial position
  195. int posn = m_wndGradientSlider.GetPos();
  196. int delta = posn - m_iInitColorSliderPos;
  197. if(delta > 0)
  198. {
  199. m_Color.m_fColor[0] = m_ColorRef.m_fColor[0]+(m_fRedPlus*delta);
  200. m_Color.m_fColor[1] = m_ColorRef.m_fColor[1]+(m_fGrnPlus*delta);
  201. m_Color.m_fColor[2] = m_ColorRef.m_fColor[2]+(m_fBluPlus*delta);
  202. }
  203. else
  204. {
  205. m_Color.m_fColor[0] = m_ColorRef.m_fColor[0]+(m_fRedMinus*delta);
  206. m_Color.m_fColor[1] = m_ColorRef.m_fColor[1]+(m_fGrnMinus*delta);
  207. m_Color.m_fColor[2] = m_ColorRef.m_fColor[2]+(m_fBluMinus*delta);
  208. }
  209. // Limit check our color values
  210. if( m_Color.m_fColor[0] > 1.0f) // red
  211. m_Color.m_fColor[0] = 1.0f;
  212. if( m_Color.m_fColor[0] < 0.0f)
  213. m_Color.m_fColor[0] = 0.0f;
  214. if( m_Color.m_fColor[1] > 1.0f) // green
  215. m_Color.m_fColor[1] = 1.0f;
  216. if( m_Color.m_fColor[1] < 0.0f)
  217. m_Color.m_fColor[1] = 0.0f;
  218. if( m_Color.m_fColor[2] > 1.0f) // blue
  219. m_Color.m_fColor[2] = 1.0f;
  220. if( m_Color.m_fColor[2] < 0.0f)
  221. m_Color.m_fColor[2] = 0.0f;
  222. PaintSelColorWnd();
  223. UpDateRGBValues();
  224. CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
  225. }
  226. void CEditColorDlg::OnDropdownColorCombo() 
  227. {
  228. // Fill the color ComboBox listbox if we have a valid
  229. // C3dColorList class pointer
  230. if(!m_pList)
  231. return;
  232. m_pList->LoadComboBox(&m_wndColorComboBox, &m_Color);
  233. }
  234. void CEditColorDlg::OnSelchangeColorCombo() 
  235. {
  236. int index = m_wndColorComboBox.GetCurSel();
  237. if(index == CB_ERR)
  238. return;
  239. // Cast the user selected list box items' lParam to
  240. // a C3dColor pointer..
  241. C3dColor* pColor = (C3dColor*)m_wndColorComboBox.GetItemData(index);
  242. if(pColor)
  243. {
  244. // Set the world's background color and name, then 
  245. // and paint the color button window
  246. m_Color.SetColor4fv(pColor);
  247. m_Color.m_szName = pColor->m_szName;
  248. PaintSelColorWnd();
  249. // Update our RGB values
  250. UpDateRGBValues();
  251. // Position gradient slider control
  252. PosnGradientSlider();
  253. }
  254. }
  255. void CEditColorDlg::PosnGradientSlider()
  256. {
  257. int iStepsPlus;
  258. int iStepsMinus;
  259. // Save our colors initial values.  We will use this to 
  260. // calculate our new colors as the user repositions the 
  261. // gradient slider
  262. m_ColorRef.m_fColor[0] = m_Color.m_fColor[0];
  263. m_ColorRef.m_fColor[1] = m_Color.m_fColor[1];
  264. m_ColorRef.m_fColor[2] = m_Color.m_fColor[2];
  265. // Bias our initial slider position based on the rgb color
  266. // values of our selected color
  267. m_iInitColorSliderPos = (int)(((m_Color.m_fColor[0]+m_Color.m_fColor[1]+m_Color.m_fColor[2])/3)*255);
  268. // Set the slider to our starting position
  269. m_wndGradientSlider.SetPos(m_iInitColorSliderPos);
  270. // Determine the number of incremental steps
  271. iStepsPlus  = m_iSliderMaxRange-m_iInitColorSliderPos;
  272. iStepsMinus = m_iInitColorSliderPos;
  273. // Define our color index values
  274. if(iStepsPlus)
  275. {
  276. m_fRedPlus = (1-m_Color.m_fColor[0])/iStepsPlus;
  277. m_fGrnPlus = (1-m_Color.m_fColor[1])/iStepsPlus;
  278. m_fBluPlus = (1-m_Color.m_fColor[2])/iStepsPlus;
  279. }
  280. else
  281. {
  282. m_fRedPlus = 0.0f;
  283. m_fGrnPlus = 0.0f;
  284. m_fBluPlus = 0.0f;
  285. }
  286. if(iStepsMinus)
  287. {
  288. m_fRedMinus = m_Color.m_fColor[0]/iStepsMinus;
  289. m_fGrnMinus = m_Color.m_fColor[1]/iStepsMinus;
  290. m_fBluMinus = m_Color.m_fColor[2]/iStepsMinus;
  291. }
  292. else
  293. {
  294. m_fRedMinus = 0.0f;
  295. m_fGrnMinus = 0.0f;
  296. m_fBluMinus = 0.0f;
  297. }
  298. PaintGradientWnd();
  299. }
  300. void CEditColorDlg::PaintGradientWnd()
  301. {
  302. CRect rect; // window rect
  303. CDC* pDC; // pointer to a device context
  304. int i, x, cx;
  305. // Get the size of the gradient window
  306. m_wndGradient.GetWindowRect(&rect);
  307. // Get a pointer to the windows device context
  308. pDC = m_wndGradient.GetDC();
  309. // Calcualte a few constants for later use...
  310. float fWindowHeight = (float)(rect.bottom-rect.top);
  311. float fGradientHeight = fWindowHeight/m_iSliderMaxRange;
  312. cx = (int)fGradientHeight;
  313. if(cx<1)
  314. cx=1;
  315. // Display gradient fill for colors below the CSliderCtrl
  316. // position.
  317. for(i=0; i<m_iInitColorSliderPos; i++)
  318. {
  319. float fColorScale = (float)i/m_iInitColorSliderPos;
  320. float gradientX = (fWindowHeight/m_iSliderMaxRange)*i;
  321. x = (int)gradientX;
  322. pDC->FillSolidRect(0, x,
  323.   (rect.right-rect.left), cx,
  324.   COLORREF RGB(m_Color.m_fColor[0]*fColorScale*255,
  325.    m_Color.m_fColor[1]*fColorScale*255,
  326.    m_Color.m_fColor[2]*fColorScale*255));
  327. }
  328. // Display gradient fill for colors above the CSliderCtrl
  329. // position.
  330. for(i=m_iInitColorSliderPos; i<=m_iSliderMaxRange; i++)
  331. {
  332. float gradientX = (fWindowHeight/m_iSliderMaxRange)*i;
  333. x = (int)gradientX;
  334. float red = m_Color.m_fColor[0]+(m_fRedPlus*(i-m_iInitColorSliderPos));
  335. float grn = m_Color.m_fColor[1]+(m_fGrnPlus*(i-m_iInitColorSliderPos));
  336. float blu = m_Color.m_fColor[2]+(m_fBluPlus*(i-m_iInitColorSliderPos));
  337. pDC->FillSolidRect(0, x,
  338.   (rect.right-rect.left), cx,
  339.   COLORREF RGB(red*255, grn*255, blu*255));
  340. }
  341. ReleaseDC(pDC);
  342. }
  343. void CEditColorDlg::PaintSelColorWnd()
  344. {
  345. CRect rect; // window rect
  346. CDC* pDC; // pointer to a device context
  347. // Get the size of the gradient window
  348. m_wndSelColor.GetWindowRect(&rect);
  349. // Get a pointer to the windows device context
  350. pDC = m_wndSelColor.GetDC();
  351. if(pDC)
  352. pDC->FillSolidRect(0,
  353.    0,
  354.    rect.right-rect.left,
  355.    rect.bottom-rect.top,
  356.    COLORREF RGB(m_Color.m_fColor[0]*255,
  357. m_Color.m_fColor[1]*255,
  358. m_Color.m_fColor[2]*255));
  359. ReleaseDC(pDC);
  360. }
  361. long CEditColorDlg::OnColorPaletteLButtonDown(WPARAM wParam, LPARAM lParam)
  362. {
  363. m_Color.m_fColor[0] = m_wndColorCube.m_fRed;
  364. m_Color.m_fColor[1] = m_wndColorCube.m_fGrn;
  365. m_Color.m_fColor[2] = m_wndColorCube.m_fBlu;
  366. PaintSelColorWnd();
  367. UpDateRGBValues();
  368. PosnGradientSlider();
  369. return 0L;
  370. }
  371. void CEditColorDlg::OnKillfocusRed() 
  372. {
  373. // Dialog box is being initialized (FALSE)
  374. // or data is being retrieved (TRUE).
  375. UpdateData(TRUE);
  376. m_Color.m_fColor[0] = m_fRed;
  377. m_Color.m_fColor[1] = m_fGrn;
  378. m_Color.m_fColor[2] = m_fBlu;
  379. m_Color.m_fColor[3] = m_fAlpha;
  380. PaintSelColorWnd();
  381. PosnGradientSlider();
  382. }
  383. void CEditColorDlg::OnKillfocusGrn() 
  384. {
  385. // Dialog box is being initialized (FALSE)
  386. // or data is being retrieved (TRUE).
  387. UpdateData(TRUE);
  388. m_Color.m_fColor[0] = m_fRed;
  389. m_Color.m_fColor[1] = m_fGrn;
  390. m_Color.m_fColor[2] = m_fBlu;
  391. m_Color.m_fColor[3] = m_fAlpha;
  392. PaintSelColorWnd();
  393. PosnGradientSlider();
  394. }
  395. void CEditColorDlg::OnKillfocusBlu() 
  396. {
  397. // Dialog box is being initialized (FALSE)
  398. // or data is being retrieved (TRUE).
  399. UpdateData(TRUE);
  400. m_Color.m_fColor[0] = m_fRed;
  401. m_Color.m_fColor[1] = m_fGrn;
  402. m_Color.m_fColor[2] = m_fBlu;
  403. m_Color.m_fColor[3] = m_fAlpha;
  404. PaintSelColorWnd();
  405. PosnGradientSlider();
  406. }
  407. void CEditColorDlg::OnKillfocusAlpha() 
  408. {
  409. // Dialog box is being initialized (FALSE)
  410. // or data is being retrieved (TRUE).
  411. UpdateData(TRUE);
  412. m_Color.m_fColor[0] = m_fRed;
  413. m_Color.m_fColor[1] = m_fGrn;
  414. m_Color.m_fColor[2] = m_fBlu;
  415. m_Color.m_fColor[3] = m_fAlpha;
  416. }