ppgcolor.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFXCTL_PAGE_SEG
  12. #pragma code_seg(AFXCTL_PAGE_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. #define RGB_BUTTON_BLACK (GetSysColor(COLOR_WINDOWFRAME))
  20. #define RGB_BUTTON_WHITE (GetSysColor(COLOR_BTNHIGHLIGHT))
  21. #define RGB_BUTTON_LIGHT (GetSysColor(COLOR_BTNFACE))
  22. #define RGB_BUTTON_DARK (GetSysColor(COLOR_BTNSHADOW))
  23. //Colors : Standard colors for QcQp
  24. #define BLACK 0
  25. #define WHITE 1
  26. #define RED 2
  27. #define GREEN 3
  28. #define BLUE 4
  29. #define YELLOW 5
  30. #define MAGENTA 6
  31. #define CYAN 7
  32. #define GRAY 8
  33. #define LIGHTGRAY 9
  34. #define DARKRED 10
  35. #define DARKGREEN 11
  36. #define DARKBLUE 12
  37. #define LIGHTBROWN 13
  38. #define DARKMAGENTA 14
  39. #define DARKCYAN 15
  40. /////////////////////////////////////////////////////////////////////////////
  41. // Structure used to store information about the system colors
  42. struct SysColorsInfo
  43. {
  44. UINT nStrID; // The id of the resource describing this system color
  45. int nColor; // The system color index
  46. };
  47. // 3D Drawing helpers
  48. void _AfxDraw3DFrame(CDC *pDC, CRect rcBox, COLORREF colBottomRight,
  49. COLORREF colTopLeft);
  50. void _AfxDraw3DButtonFrame(CDC *pDC, CRect rcButton, BOOL fFocus);
  51. // Function to initialize the palette
  52. HPALETTE _AfxInitPalette(VOID);
  53. HPALETTE hPal;
  54. // The system colors information
  55. AFX_STATIC_DATA const SysColorsInfo _afxSysColorsList[] =
  56. {
  57. AFX_IDS_COLOR_DESKTOP, COLOR_BACKGROUND,
  58. AFX_IDS_COLOR_APPWORKSPACE, COLOR_APPWORKSPACE,
  59. AFX_IDS_COLOR_WNDBACKGND, COLOR_WINDOW,
  60. AFX_IDS_COLOR_WNDTEXT, COLOR_WINDOWTEXT,
  61. AFX_IDS_COLOR_MENUBAR, COLOR_MENU,
  62. AFX_IDS_COLOR_MENUTEXT, COLOR_MENUTEXT,
  63. AFX_IDS_COLOR_ACTIVEBAR, COLOR_ACTIVECAPTION,
  64. AFX_IDS_COLOR_INACTIVEBAR, COLOR_INACTIVECAPTION,
  65. AFX_IDS_COLOR_ACTIVETEXT, COLOR_CAPTIONTEXT,
  66. AFX_IDS_COLOR_INACTIVETEXT, COLOR_INACTIVECAPTIONTEXT,
  67. AFX_IDS_COLOR_ACTIVEBORDER, COLOR_ACTIVEBORDER,
  68. AFX_IDS_COLOR_INACTIVEBORDER, COLOR_INACTIVEBORDER,
  69. AFX_IDS_COLOR_WNDFRAME, COLOR_WINDOWFRAME,
  70. AFX_IDS_COLOR_SCROLLBARS, COLOR_SCROLLBAR,
  71. AFX_IDS_COLOR_BTNFACE, COLOR_BTNFACE,
  72. AFX_IDS_COLOR_BTNSHADOW, COLOR_BTNSHADOW,
  73. AFX_IDS_COLOR_BTNTEXT, COLOR_BTNTEXT,
  74. AFX_IDS_COLOR_BTNHIGHLIGHT, COLOR_BTNHIGHLIGHT,
  75. AFX_IDS_COLOR_DISABLEDTEXT, COLOR_GRAYTEXT,
  76. AFX_IDS_COLOR_HIGHLIGHT, COLOR_HIGHLIGHT,
  77. AFX_IDS_COLOR_HIGHLIGHTTEXT, COLOR_HIGHLIGHTTEXT,
  78. // End of list
  79. NULL, NULL
  80. };
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CColorButton class
  83. // All buttons are initially unselected
  84. CColorButton::CColorButton()
  85. {
  86. m_fSelected = FALSE;
  87. }
  88. // Set the face color of the button
  89. void CColorButton::SetFaceColor(COLORREF colFace)
  90. {
  91. m_colFace = colFace;
  92. }
  93. // Return the palette reference for the button
  94. COLORREF CColorButton::colGetFaceColor()
  95. {
  96. return m_colFace;
  97. }
  98. // Set a color button's selection state
  99. void CColorButton::SetState(BOOL fSelected)
  100. {
  101. m_fSelected = fSelected;
  102. }
  103. // Static ID shows which color button generated the BN_CLICKED message
  104. UINT CColorButton::idClicked = 0;
  105. // Redraw the color button, and record a change in selection status
  106. void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  107. {
  108. CDC *pDC;
  109. CPalette *pPal;
  110. CRect rcButton;
  111. CBrush *pBrush;
  112. // Get the palette for the item display context
  113. pPal = CPalette::FromHandle(hPal);
  114. VERIFY(pPal);
  115. // Get the device context from the context
  116. pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  117. VERIFY(pDC);
  118. VERIFY(pDC->SelectPalette(pPal,0));
  119. pDC->RealizePalette();
  120. switch(lpDrawItemStruct->itemAction)
  121. {
  122. case ODA_SELECT:
  123. if (CButton::GetState() & 0x0004)
  124. {
  125. idClicked = lpDrawItemStruct->CtlID;
  126. // Redraw done via the BN_CLICKED notification
  127. }
  128. break;
  129. case ODA_DRAWENTIRE:
  130. rcButton = lpDrawItemStruct->rcItem;
  131. rcButton.InflateRect(-2, -2);
  132. if (m_fSelected)
  133. {
  134. _AfxDraw3DFrame(pDC, rcButton, RGB_BUTTON_DARK, RGB_BUTTON_WHITE);
  135. rcButton.InflateRect(-1, -1);
  136. _AfxDraw3DFrame(pDC, rcButton, RGB_BUTTON_DARK, RGB_BUTTON_WHITE);
  137. rcButton.InflateRect(-1, -1);
  138. }
  139. // Then the button face in the correct color
  140. pBrush = new CBrush(pDC->GetNearestColor(m_colFace));
  141. pDC->FillRect(&rcButton, pBrush);
  142. delete pBrush;
  143. // Drop through to draw Frame.
  144. case ODA_FOCUS:
  145. rcButton = lpDrawItemStruct->rcItem;
  146. _AfxDraw3DButtonFrame(pDC, rcButton, GetState() & 0x0008);
  147. }
  148. }
  149. /////////////////////////////////////////////////////////////////////////////
  150. // CColorPropPage implementation
  151. BEGIN_MESSAGE_MAP(CColorPropPage, CStockPropPage)
  152. //{{AFX_MSG_MAP(CColorPropPage)
  153. ON_CBN_SELCHANGE(AFX_IDC_COLORPROP, OnSelchangeColorprop)
  154. ON_BN_CLICKED(AFX_IDC_COLOR_BLACK, OnSelect)
  155. ON_BN_CLICKED(AFX_IDC_COLOR_WHITE, OnSelect)
  156. ON_BN_CLICKED(AFX_IDC_COLOR_RED, OnSelect)
  157. ON_BN_CLICKED(AFX_IDC_COLOR_GREEN, OnSelect)
  158. ON_BN_CLICKED(AFX_IDC_COLOR_BLUE, OnSelect)
  159. ON_BN_CLICKED(AFX_IDC_COLOR_YELLOW, OnSelect)
  160. ON_BN_CLICKED(AFX_IDC_COLOR_MAGENTA, OnSelect)
  161. ON_BN_CLICKED(AFX_IDC_COLOR_CYAN, OnSelect)
  162. ON_BN_CLICKED(AFX_IDC_COLOR_GRAY, OnSelect)
  163. ON_BN_CLICKED(AFX_IDC_COLOR_LIGHTGRAY, OnSelect)
  164. ON_BN_CLICKED(AFX_IDC_COLOR_DARKRED, OnSelect)
  165. ON_BN_CLICKED(AFX_IDC_COLOR_DARKGREEN, OnSelect)
  166. ON_BN_CLICKED(AFX_IDC_COLOR_DARKBLUE, OnSelect)
  167. ON_BN_CLICKED(AFX_IDC_COLOR_LIGHTBROWN, OnSelect)
  168. ON_BN_CLICKED(AFX_IDC_COLOR_DARKMAGENTA, OnSelect)
  169. ON_BN_CLICKED(AFX_IDC_COLOR_DARKCYAN, OnSelect)
  170. ON_CBN_SELCHANGE(AFX_IDC_SYSTEMCOLORS, OnSelchangeSystemcolors)
  171. //}}AFX_MSG_MAP
  172. END_MESSAGE_MAP()
  173. CColorPropPage::CColorPropPage() :
  174. CStockPropPage(IDD, AFX_IDS_COLOR_PPG_CAPTION)
  175. {
  176. hPal = _AfxInitPalette();
  177. //{{AFX_DATA_INIT(CColorPropPage)
  178. //}}AFX_DATA_INIT
  179. }
  180. BOOL CColorPropPage::OnInitDialog()
  181. {
  182. UINT iButton;
  183. for (iButton = 0; iButton < NBUTTONS; iButton++)
  184. {
  185. VERIFY(m_Buttons[iButton].SubclassDlgItem(AFX_IDC_COLOR_BLACK + iButton, this));
  186. m_Buttons[iButton].SetFaceColor(PALETTEINDEX(iButton));
  187. }
  188. m_pSelectedButton = NULL;
  189. CStockPropPage::OnInitDialog();
  190. FillSysColors();
  191. OnObjectsChanged();
  192. IgnoreApply(AFX_IDC_COLORPROP);
  193. return TRUE;
  194. }
  195. void CColorPropPage::FillSysColors()
  196. {
  197. const SysColorsInfo* pInfo = &_afxSysColorsList[0];
  198. while (pInfo->nStrID != NULL)
  199. {
  200. CString strColor;
  201. strColor.LoadString(pInfo->nStrID);
  202. int nIndex = m_SysColors.AddString(strColor);
  203. if (nIndex != CB_ERR)
  204. m_SysColors.SetItemData(nIndex, (DWORD)pInfo->nColor);
  205. pInfo++;
  206. }
  207. // Initially no system color is selected
  208. m_SysColors.SetCurSel(-1);
  209. }
  210. void CColorPropPage::DoDataExchange(CDataExchange* pDX)
  211. {
  212. //{{AFX_DATA_MAP(CColorPropPage)
  213. DDX_Control(pDX, AFX_IDC_SYSTEMCOLORS, m_SysColors);
  214. DDX_Control(pDX, AFX_IDC_COLORPROP, m_ColorProp);
  215. //}}AFX_DATA_MAP
  216. if (pDX->m_bSaveAndValidate)
  217. {
  218. unsigned long color = 0;
  219. BOOL bChanged = TRUE;
  220. int nIndex = m_SysColors.GetCurSel();
  221. // did the user pick a particular button?
  222. // or did they select a system colour from the dropdown?
  223. if (m_pSelectedButton != NULL)
  224. {
  225. PALETTEENTRY pe;
  226. GetPaletteEntries(hPal, m_pSelectedButton->GetDlgCtrlID() - AFX_IDC_COLOR_BLACK, 1, &pe);
  227. color = RGB(pe.peRed, pe.peGreen, pe.peBlue);
  228. }
  229. else if (nIndex != CB_ERR)
  230. {
  231. color = 0x80000000 | m_SysColors.GetItemData(nIndex);
  232. }
  233. else
  234. bChanged = FALSE;
  235. if (bChanged)
  236. SetColorProp(pDX, color, m_strPropName);
  237. }
  238. else
  239. {
  240. unsigned long color;
  241. GetColorProp(pDX, &color, m_strPropName);
  242. if (color & 0x80000000)
  243. {
  244. // System color
  245. // Remove any previously selected buttons
  246. SetButton(NULL);
  247. int index;
  248. int cSysColors = m_SysColors.GetCount();
  249. unsigned long iSysColor = color & 0x000000ff;
  250. for (index = 0; index < cSysColors; index++)
  251. {
  252. if (m_SysColors.GetItemData(index) == iSysColor)
  253. {
  254. m_SysColors.SetCurSel(index);
  255. break;
  256. }
  257. }
  258. }
  259. else
  260. {
  261. // Normal color
  262. for (int index = 0; index < NBUTTONS; index++)
  263. {
  264. PALETTEENTRY pe;
  265. GetPaletteEntries(hPal, index, 1, &pe);
  266. if (color == RGB(pe.peRed, pe.peGreen, pe.peBlue))
  267. SetButton(&m_Buttons[index]);
  268. }
  269. }
  270. }
  271. }
  272. BOOL CColorPropPage::SetColorProp(CDataExchange* /* pDX */,
  273. unsigned long color, LPCTSTR pszPropName)
  274. {
  275. USES_CONVERSION;
  276. COleDispatchDriver PropDispDriver;
  277. ULONG nObjects;
  278. LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
  279. for (ULONG i = 0; i < nObjects; i++)
  280. {
  281. DISPID dwDispID;
  282. // Get the Dispatch ID for the property and if successful set the value
  283. LPCOLESTR lpOleStr = T2COLE(pszPropName);
  284. if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
  285. 1, m_lcid, &dwDispID)))
  286. {
  287. // Set property
  288. PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
  289. TRY
  290. {
  291. PropDispDriver.SetProperty(dwDispID, VT_I4, color);
  292. }
  293. CATCH(COleDispatchException, e)
  294. {
  295. // Display message box for dispatch exceptions.
  296. e->ReportError(MB_ICONEXCLAMATION | MB_OK);
  297. DELETE_EXCEPTION(e);
  298. }
  299. AND_CATCH_ALL(e)
  300. {
  301. // Ignore other exceptions.
  302. DELETE_EXCEPTION(e);
  303. }
  304. END_CATCH_ALL
  305. PropDispDriver.DetachDispatch();
  306. }
  307. }
  308. return TRUE;
  309. }
  310. BOOL CColorPropPage::GetColorProp(CDataExchange* /* pDX */,
  311. unsigned long* pcolor, LPCTSTR pszPropName)
  312. {
  313. USES_CONVERSION;
  314. COleDispatchDriver PropDispDriver;
  315. ULONG nObjects;
  316. LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
  317. for (ULONG i = 0; i < nObjects; i++)
  318. {
  319. DISPID dwDispID;
  320. // Get the Dispatch ID for the property and if successful get the value
  321. LPCOLESTR lpOleStr = T2COLE(pszPropName);
  322. if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
  323. 1, m_lcid, &dwDispID)))
  324. {
  325. // Get property
  326. unsigned long color = 0;
  327. PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
  328. TRY
  329. PropDispDriver.GetProperty(dwDispID, VT_I4, &color);
  330. END_TRY
  331. PropDispDriver.DetachDispatch();
  332. if (i != 0 && color != *pcolor)
  333. *pcolor = 0;
  334. else
  335. *pcolor = color;
  336. }
  337. }
  338. return TRUE;
  339. }
  340. /////////////////////////////////////////////////////////////////////////////
  341. // CColorPropPage message handlers
  342. void CColorPropPage::OnSelect()
  343. {
  344. SetButton((CColorButton *)(GetDlgItem(CColorButton::idClicked)));
  345. }
  346. void CColorPropPage::SetButton(CColorButton *Button)
  347. {
  348. if (m_pSelectedButton != NULL)
  349. {
  350. m_pSelectedButton->SetState(FALSE);
  351. m_pSelectedButton->Invalidate(FALSE);
  352. }
  353. m_pSelectedButton = Button;
  354. if (m_pSelectedButton != NULL)
  355. {
  356. Button->SetState(TRUE);
  357. Button->Invalidate(FALSE);
  358. }
  359. // Deselect any system color currently selected
  360. m_SysColors.SetCurSel(-1);
  361. }
  362. void CColorPropPage::OnSelchangeColorprop()
  363. {
  364. OnSelchangePropname(m_ColorProp);
  365. }
  366. ///////////////////////////////////////////////////////////////////////////////
  367. // 3D Drawing helpers
  368. void _AfxDraw3DFrame(CDC *pDC, CRect rcBox, COLORREF colBottomRight, COLORREF colTopLeft)
  369. {
  370. CPen *pPen2, *pPen, *pOldPen;
  371. pPen = new CPen(PS_SOLID, 1, colBottomRight);
  372. pOldPen = pDC->SelectObject(pPen);
  373. pDC->MoveTo(rcBox.right-1, rcBox.top);
  374. pDC->LineTo(rcBox.right-1, rcBox.bottom-1);
  375. pDC->LineTo(rcBox.left-1, rcBox.bottom-1);
  376. pPen2 = new CPen(PS_SOLID, 1, colTopLeft);
  377. pDC->SelectObject(pPen2);
  378. delete pPen;
  379. pDC->MoveTo(rcBox.left, rcBox.bottom-2);
  380. pDC->LineTo(rcBox.left, rcBox.top);
  381. pDC->LineTo(rcBox.right-1, rcBox.top);
  382. pDC->SelectObject(pOldPen);
  383. delete pPen2;
  384. }
  385. void _AfxDraw3DButtonFrame(CDC *pDC, CRect rcButton, BOOL fFocus)
  386. {
  387. CPen *pPen, *pOldPen;
  388. CBrush GrayBrush(RGB_BUTTON_LIGHT);
  389. CBrush BlackBrush(RGB_BUTTON_BLACK);
  390. pPen = new CPen(PS_SOLID, 1, RGB_BUTTON_BLACK);
  391. pOldPen = pDC->SelectObject(pPen);
  392. // Draw gray outside
  393. pDC->FrameRect(&rcButton, &GrayBrush);
  394. rcButton.InflateRect(-1, -1);
  395. if (fFocus)
  396. {
  397. // Draw inside of border
  398. pDC->FrameRect(&rcButton, &BlackBrush);
  399. // Draw curved border on outside;
  400. rcButton.InflateRect(1, 1);
  401. }
  402. else
  403. {
  404. // Prepare inside border
  405. pDC->FrameRect(&rcButton, &GrayBrush);
  406. }
  407. pDC->MoveTo(rcButton.left+1, rcButton.top);
  408. pDC->LineTo(rcButton.right-1, rcButton.top);
  409. pDC->MoveTo(rcButton.left+1, rcButton.bottom-1);
  410. pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
  411. pDC->MoveTo(rcButton.left, rcButton.top+1);
  412. pDC->LineTo(rcButton.left, rcButton.bottom-1);
  413. pDC->MoveTo(rcButton.right-1, rcButton.top+1);
  414. pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
  415. pDC->SelectObject(pOldPen);
  416. delete pPen;
  417. }
  418. HPALETTE _AfxInitPalette(VOID)
  419. {
  420. NPLOGPALETTE pPal; // Local palette
  421. HPALETTE pal;
  422. //Allocates space for QcQp Palette 'pPal'
  423. pPal = (NPLOGPALETTE) LocalAlloc(LPTR,
  424. (sizeof (LOGPALETTE) +
  425. (sizeof (PALETTEENTRY) * CColorPropPage::NBUTTONS)));
  426. if (pPal == NULL)
  427. return NULL;
  428. //Initialize 'pPal' fields
  429. pPal->palNumEntries = CColorPropPage::NBUTTONS;
  430. pPal->palVersion = 0x300;
  431. //Inits Every color of our palette
  432. pPal->palPalEntry[BLACK].peRed = 0;
  433. pPal->palPalEntry[BLACK].peGreen = 0;
  434. pPal->palPalEntry[BLACK].peBlue = 0;
  435. pPal->palPalEntry[BLACK].peFlags = (BYTE) 0;
  436. pPal->palPalEntry[WHITE].peRed = 255;
  437. pPal->palPalEntry[WHITE].peGreen = 255;
  438. pPal->palPalEntry[WHITE].peBlue = 255;
  439. pPal->palPalEntry[WHITE].peFlags = (BYTE) 0;
  440. pPal->palPalEntry[RED].peRed = 255;
  441. pPal->palPalEntry[RED].peGreen = 0;
  442. pPal->palPalEntry[RED].peBlue = 0;
  443. pPal->palPalEntry[RED].peFlags = (BYTE) 0;
  444. pPal->palPalEntry[GREEN].peRed = 0;
  445. pPal->palPalEntry[GREEN].peGreen = 255;
  446. pPal->palPalEntry[GREEN].peBlue = 0;
  447. pPal->palPalEntry[GREEN].peFlags = (BYTE) 0;
  448. pPal->palPalEntry[BLUE].peRed = 0;
  449. pPal->palPalEntry[BLUE].peGreen = 0;
  450. pPal->palPalEntry[BLUE].peBlue = 255;
  451. pPal->palPalEntry[BLUE].peFlags = (BYTE) 0;
  452. pPal->palPalEntry[YELLOW].peRed = 255;
  453. pPal->palPalEntry[YELLOW].peGreen = 255;
  454. pPal->palPalEntry[YELLOW].peBlue = 0;
  455. pPal->palPalEntry[YELLOW].peFlags = (BYTE) 0;
  456. pPal->palPalEntry[MAGENTA].peRed = 255;
  457. pPal->palPalEntry[MAGENTA].peGreen = 0;
  458. pPal->palPalEntry[MAGENTA].peBlue = 255;
  459. pPal->palPalEntry[MAGENTA].peFlags = (BYTE) 0;
  460. pPal->palPalEntry[CYAN].peRed = 0;
  461. pPal->palPalEntry[CYAN].peGreen = 255;
  462. pPal->palPalEntry[CYAN].peBlue = 255;
  463. pPal->palPalEntry[CYAN].peFlags = (BYTE) 0;
  464. pPal->palPalEntry[GRAY].peRed = 128;
  465. pPal->palPalEntry[GRAY].peGreen = 128;
  466. pPal->palPalEntry[GRAY].peBlue = 128;
  467. pPal->palPalEntry[GRAY].peFlags = (BYTE) 0;
  468. pPal->palPalEntry[LIGHTGRAY].peRed = 192;
  469. pPal->palPalEntry[LIGHTGRAY].peGreen = 192;
  470. pPal->palPalEntry[LIGHTGRAY].peBlue = 192;
  471. pPal->palPalEntry[LIGHTGRAY].peFlags = (BYTE) 0;
  472. pPal->palPalEntry[DARKRED].peRed = 128;
  473. pPal->palPalEntry[DARKRED].peGreen = 0;
  474. pPal->palPalEntry[DARKRED].peBlue = 0;
  475. pPal->palPalEntry[DARKRED].peFlags = (BYTE) 0;
  476. pPal->palPalEntry[DARKGREEN].peRed = 0;
  477. pPal->palPalEntry[DARKGREEN].peGreen = 128;
  478. pPal->palPalEntry[DARKGREEN].peBlue = 0;
  479. pPal->palPalEntry[DARKGREEN].peFlags = (BYTE) 0;
  480. pPal->palPalEntry[DARKBLUE].peRed = 0;
  481. pPal->palPalEntry[DARKBLUE].peGreen = 0;
  482. pPal->palPalEntry[DARKBLUE].peBlue = 128;
  483. pPal->palPalEntry[DARKBLUE].peFlags = (BYTE) 0;
  484. pPal->palPalEntry[LIGHTBROWN].peRed = 128;
  485. pPal->palPalEntry[LIGHTBROWN].peGreen = 128;
  486. pPal->palPalEntry[LIGHTBROWN].peBlue = 0;
  487. pPal->palPalEntry[LIGHTBROWN].peFlags = (BYTE) 0;
  488. pPal->palPalEntry[DARKMAGENTA].peRed = 128;
  489. pPal->palPalEntry[DARKMAGENTA].peGreen= 0;
  490. pPal->palPalEntry[DARKMAGENTA].peBlue = 128;
  491. pPal->palPalEntry[DARKMAGENTA].peFlags= (BYTE) 0;
  492. pPal->palPalEntry[DARKCYAN].peRed = 0;
  493. pPal->palPalEntry[DARKCYAN].peGreen = 128;
  494. pPal->palPalEntry[DARKCYAN].peBlue = 128;
  495. pPal->palPalEntry[DARKCYAN].peFlags = (BYTE) 0;
  496. //Creates the logical palette
  497. pal = ::CreatePalette((LPLOGPALETTE)pPal);
  498. //Free allocated memory
  499. VERIFY(LocalFree((HLOCAL)pPal) == NULL);
  500. return pal;
  501. }
  502. void CColorPropPage::OnSelchangeSystemcolors()
  503. {
  504. if (m_pSelectedButton != NULL)
  505. {
  506. m_pSelectedButton->SetState(FALSE);
  507. m_pSelectedButton->Invalidate(FALSE);
  508. m_pSelectedButton = NULL;
  509. }
  510. }
  511. BOOL CColorPropPage::OnEditProperty(DISPID dispid)
  512. {
  513. return CStockPropPage::OnEditProperty(dispid, m_ColorProp);
  514. }
  515. void CColorPropPage::OnObjectsChanged()
  516. {
  517. ULONG nObjects;
  518. if (GetObjectArray(&nObjects) != NULL && m_hWnd != NULL)
  519. {
  520. FillPropnameList(GUID_COLOR, 0, m_ColorProp);
  521. if ( m_ColorProp.GetCount() == 0 )
  522. {
  523. // No color properties: disable everything.
  524. UINT iButton;
  525. for (iButton = 0; iButton < NBUTTONS; iButton++)
  526. m_Buttons[iButton].EnableWindow(FALSE);
  527. m_SysColors.EnableWindow(FALSE);
  528. }
  529. }
  530. if (m_hWnd != NULL)
  531. OnSelchangeColorprop();
  532. }
  533. /////////////////////////////////////////////////////////////////////////////
  534. // Class factory for Color property page
  535. #ifdef _AFXDLL
  536. #ifdef AFXCTL_FACT_SEG
  537. #pragma code_seg(AFXCTL_FACT_SEG)
  538. #endif
  539. IMPLEMENT_OLECREATE_EX(CColorPropPage, "OCxx.CColorPropPage",
  540. 0x0be35201,0x8f91,0x11ce,0x9d,0xe3,0x00,0xaa,0x00,0x4b,0xb8,0x51)
  541. BOOL CColorPropPage::CColorPropPageFactory::UpdateRegistry(BOOL bRegister)
  542. {
  543. if (bRegister)
  544. return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
  545. m_clsid, AFX_IDS_COLOR_PPG);
  546. else
  547. return AfxOleUnregisterClass(m_clsid, NULL);
  548. }
  549. #endif //_AFXDLL
  550. /////////////////////////////////////////////////////////////////////////////
  551. // Force any extra compiler-generated code into AFX_INIT_SEG
  552. #ifdef AFX_INIT_SEG
  553. #pragma code_seg(AFX_INIT_SEG)
  554. #endif
  555. IMPLEMENT_DYNCREATE(CColorPropPage, CStockPropPage)