home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / src / ppgcolor.cpp < prev    next >
C/C++ Source or Header  |  1998-06-16  |  19KB  |  669 lines

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