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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // EditColorsDlg.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. #include "EditColorsDlg.h"
  24. #include "EditNameDlg.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CEditColorsDlg dialog
  32. CEditColorsDlg::CEditColorsDlg(C3dColorList* pColorList, CWnd* pParent /*=NULL*/)
  33. : CDialog(CEditColorsDlg::IDD, pParent)
  34. {
  35. m_hPalette = NULL;
  36. m_pList = pColorList;
  37. m_pListSelColor = NULL;
  38. //{{AFX_DATA_INIT(CEditColorsDlg)
  39. m_fRed   = 0.0f;
  40. m_fGrn = 0.0f;
  41. m_fBlu  = 0.0f;
  42. m_szColorName = _T("");
  43. m_fAlpha = 0.0f;
  44. //}}AFX_DATA_INIT
  45. }
  46. void CEditColorsDlg::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CDialog::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CEditColorsDlg)
  50. DDX_Control(pDX, IDC_COLOR_LIST, m_ListBox);
  51. DDX_Text(pDX, IDC_RED, m_fRed);
  52. DDV_MinMaxFloat(pDX, m_fRed, 0.f, 1.f);
  53. DDX_Text(pDX, IDC_GRN, m_fGrn);
  54. DDV_MinMaxFloat(pDX, m_fGrn, 0.f, 1.f);
  55. DDX_Text(pDX, IDC_BLU, m_fBlu);
  56. DDV_MinMaxFloat(pDX, m_fBlu, 0.f, 1.f);
  57. DDX_Text(pDX, IDC_COLOR_NAME, m_szColorName);
  58. DDX_Text(pDX, IDC_ALPHA, m_fAlpha);
  59. DDV_MinMaxFloat(pDX, m_fAlpha, 0.f, 1.f);
  60. //}}AFX_DATA_MAP
  61. }
  62. BEGIN_MESSAGE_MAP(CEditColorsDlg, CDialog)
  63. //{{AFX_MSG_MAP(CEditColorsDlg)
  64. ON_WM_SHOWWINDOW()
  65. ON_LBN_SELCHANGE(IDC_COLOR_LIST, OnSelchangeColorList)
  66. ON_BN_CLICKED(IDNEW, OnNew)
  67. ON_BN_CLICKED(IDC_BUTTON_COLOR_WND, OnButtonColor)
  68. ON_WM_DRAWITEM()
  69. ON_EN_KILLFOCUS(IDC_RED, OnKillfocusRed)
  70. ON_EN_KILLFOCUS(IDC_GRN, OnKillfocusGrn)
  71. ON_EN_KILLFOCUS(IDC_BLU, OnKillfocusBlu)
  72. ON_EN_KILLFOCUS(IDC_ALPHA, OnKillfocusAlpha)
  73. //}}AFX_MSG_MAP
  74. END_MESSAGE_MAP()
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CEditColorsDlg function implimentation
  77. void CEditColorsDlg::LoadDialogData(C3dColor* pColor)
  78. {
  79. if(pColor)
  80. {
  81. // Set our local values to the colors' values
  82. m_szColorName = pColor->m_szName;
  83. m_fRed   = pColor->m_fColor[0];
  84. m_fGrn   = pColor->m_fColor[1];
  85. m_fBlu   = pColor->m_fColor[2];
  86. m_fAlpha = pColor->m_fColor[3];
  87. }
  88. // Dialog box is being initialized (FALSE)
  89. // or data is being retrieved (TRUE).
  90. UpdateData(FALSE);
  91. // Paint our button window
  92. PaintButtonWnd();
  93. }
  94. void CEditColorsDlg::SaveDialogData(C3dColor* pColor)
  95. {
  96. // Dialog box is being initialized (FALSE)
  97. // or data is being retrieved (TRUE).
  98. UpdateData(TRUE);
  99. // Set our colors values to the local values
  100. pColor->m_szName = m_szColorName;
  101. pColor->m_fColor[0] = m_fRed;
  102. pColor->m_fColor[1] = m_fGrn;
  103. pColor->m_fColor[2] = m_fBlu;
  104. }
  105. void CEditColorsDlg::PaintButtonWnd() 
  106. {
  107. CRect rect; // window rect
  108. CDC* pDC; // pointer to a device context
  109. // Get the size of the gradient window
  110. m_wndButtonColor.GetWindowRect(&rect);
  111. // Get a pointer to the windows device context
  112. pDC = m_wndButtonColor.GetDC();
  113. if(pDC)
  114. pDC->FillSolidRect(0,
  115.    0,
  116.    rect.right-rect.left,
  117.    rect.bottom-rect.top,
  118.    COLORREF RGB(m_fRed*255,
  119. m_fGrn*255,
  120. m_fBlu*255));
  121. ReleaseDC(pDC);
  122. }
  123. void CEditColorsDlg::ResetDlg(C3dColorList* pColorList) 
  124. {
  125. if(pColorList)
  126. {
  127. // If this is the same C3dColorList pointer
  128. // that we last updated the dialog box with
  129. // then the data is current. Do not clear.
  130. if(pColorList == m_pList)
  131. return;
  132. else
  133. {
  134. m_pList = pColorList;
  135. // reset our variables, since we may have 
  136. m_fRed = 0.0f;
  137. m_fGrn = 0.0f;
  138. m_fBlu = 0.0f;
  139. m_fAlpha = 0.0f;
  140. m_szColorName = _T("");
  141. m_pListSelColor = NULL;
  142. // Reload the Color list box
  143. C3dColor* pColor = m_pList->LoadListBox(&m_ListBox);
  144. // initializ the Dialog window
  145. LoadDialogData(NULL);
  146. }
  147. }
  148. }
  149. /////////////////////////////////////////////////////////////////////////////
  150. // CEditColorsDlg message handlers
  151. BOOL CEditColorsDlg::OnInitDialog() 
  152. {
  153. // let the base class do the default work
  154. CDialog::OnInitDialog();
  155. // Create the button color window
  156. CRect rect;
  157. GetDlgItem(IDC_BUTTON_COLOR_WND)->GetWindowRect(&rect);
  158. ScreenToClient(&rect);
  159. m_wndButtonColor.Create(NULL, // lpszClassName
  160. NULL, // lpszWindowName
  161. WS_CHILD | WS_VISIBLE | // dwStyle
  162. WS_DLGFRAME,
  163. rect, // rect
  164. this, // CWnd* pParentWnd
  165. IDC_BUTTON_COLOR_WND, // UINT  nID
  166. 0); // pContext
  167. // Load the Color list box
  168. if(m_pList)
  169. C3dColor* pColor = m_pList->LoadListBox(&m_ListBox);
  170. return TRUE;  // return TRUE unless you set the focus to a control
  171.               // EXCEPTION: OCX Property Pages should return FALSE
  172. }
  173. void CEditColorsDlg::OnSelchangeColorList() 
  174. {
  175. C3dColor* pColor;
  176. // Get the zero-based index of the item selected
  177. int index = m_ListBox.GetCurSel();
  178. // Save the last selected color and reload the list
  179. // box.  (The user may have changed the name of the
  180. // color..)
  181. if(m_pListSelColor)
  182. {
  183. SaveDialogData(m_pListSelColor);
  184. // Reload the Color list box
  185. if(m_pList)
  186. pColor = m_pList->LoadListBox(&m_ListBox);
  187. }
  188. // Cast the user selected list box items' lParam to
  189. // a C3dColor pointer..
  190. m_pListSelColor = (C3dColor*)m_ListBox.GetItemData(index);
  191. if(m_pListSelColor)
  192. // Display the colors values
  193. LoadDialogData(m_pListSelColor);
  194. }
  195. void CEditColorsDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  196. {
  197. // Let the base class draw the control item first
  198. CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
  199. if(nIDCtl == IDC_BUTTON_COLOR_WND && m_pListSelColor)
  200. PaintButtonWnd();
  201. }
  202. void CEditColorsDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
  203. {
  204. CDialog::OnShowWindow(bShow, nStatus);
  205. // if(bShow) // Reload list box
  206. // LoadListBox();
  207. }
  208. void CEditColorsDlg::OnOK() 
  209. {
  210. if(m_pListSelColor)
  211. // Save the dialog data to the color
  212. SaveDialogData(m_pListSelColor);
  213. CDialog::OnOK();
  214. }
  215. void CEditColorsDlg::OnNew() 
  216. {
  217. // Get the name of the new color
  218. CEditNameDlg newNameDlg(this);
  219. if(newNameDlg.DoModal() == IDOK)
  220. {
  221. if(m_pList)
  222. {
  223. C3dColor* pColor = NULL;
  224. pColor = C3dColor::Create();
  225. pColor->m_szName = newNameDlg.m_szName;
  226. if(!m_pList->Find(pColor))
  227. {
  228. // pColor is not in the list, so add to to list,
  229. // reload the list box, select the color, reload
  230. // the dialog data, and pop up the color dialog
  231. // window
  232. m_pList->Append(pColor);
  233. // Reload the Color list box
  234. m_pList->LoadListBox(&m_ListBox);
  235. // Cast the user selected list box items' lParam to
  236. // a C3dColor pointer..
  237. m_pListSelColor = pColor;
  238. // Display the colors values
  239. LoadDialogData(m_pListSelColor);
  240. // Pop up the color dialog window
  241. OnButtonColor();
  242. }
  243. else
  244. C3dColor::Delete(pColor);
  245. }
  246. }
  247. }
  248. void CEditColorsDlg::OnButtonColor() 
  249. {
  250. if(m_pListSelColor) 
  251. {
  252. // Create the dialog
  253. CEditColorDlg colorDlg(m_pList, m_pListSelColor, this);
  254. // Invoke the modal dialog box and return the
  255. // dialog-box result when done.
  256. if(colorDlg.DoModal() == IDOK)
  257. {
  258. // Save any changes the user may have made
  259. m_pListSelColor->m_fColor[0] = colorDlg.m_Color.m_fColor[0];
  260. m_pListSelColor->m_fColor[1] = colorDlg.m_Color.m_fColor[1];
  261. m_pListSelColor->m_fColor[2] = colorDlg.m_Color.m_fColor[2];
  262. LoadDialogData(m_pListSelColor);
  263. }
  264. }
  265. else
  266. AfxMessageBox("A Color has not been selected.  Create a new color or select one from the list.", MB_OK); 
  267. }
  268. void CEditColorsDlg::OnKillfocusRed() 
  269. {
  270. if(m_pListSelColor)
  271. {
  272. // Dialog box is being initialized (FALSE)
  273. // or data is being retrieved (TRUE).
  274. UpdateData(TRUE);
  275. m_pListSelColor->m_fColor[0] = m_fRed;
  276. m_pListSelColor->m_fColor[1] = m_fGrn;
  277. m_pListSelColor->m_fColor[2] = m_fBlu;
  278. m_pListSelColor->m_fColor[3] = m_fAlpha;
  279. PaintButtonWnd();
  280. }
  281. }
  282. void CEditColorsDlg::OnKillfocusGrn() 
  283. {
  284. if(m_pListSelColor)
  285. {
  286. // Dialog box is being initialized (FALSE)
  287. // or data is being retrieved (TRUE).
  288. UpdateData(TRUE);
  289. m_pListSelColor->m_fColor[0] = m_fRed;
  290. m_pListSelColor->m_fColor[1] = m_fGrn;
  291. m_pListSelColor->m_fColor[2] = m_fBlu;
  292. m_pListSelColor->m_fColor[3] = m_fAlpha;
  293. PaintButtonWnd();
  294. }
  295. }
  296. void CEditColorsDlg::OnKillfocusBlu() 
  297. {
  298. if(m_pListSelColor)
  299. {
  300. // Dialog box is being initialized (FALSE)
  301. // or data is being retrieved (TRUE).
  302. UpdateData(TRUE);
  303. m_pListSelColor->m_fColor[0] = m_fRed;
  304. m_pListSelColor->m_fColor[1] = m_fGrn;
  305. m_pListSelColor->m_fColor[2] = m_fBlu;
  306. m_pListSelColor->m_fColor[3] = m_fAlpha;
  307. PaintButtonWnd();
  308. }
  309. }
  310. void CEditColorsDlg::OnKillfocusAlpha() 
  311. {
  312. if(m_pListSelColor)
  313. {
  314. // Dialog box is being initialized (FALSE)
  315. // or data is being retrieved (TRUE).
  316. UpdateData(TRUE);
  317. m_pListSelColor->m_fColor[0] = m_fRed;
  318. m_pListSelColor->m_fColor[1] = m_fGrn;
  319. m_pListSelColor->m_fColor[2] = m_fBlu;
  320. m_pListSelColor->m_fColor[3] = m_fAlpha;
  321. PaintButtonWnd();
  322. }
  323. }