home *** CD-ROM | disk | FTP | other *** search
/ Supercompiler 1997 / SUPERCOMPILER97.iso / MS_VC.50 / VC / MFC / SRC / PPGCOLOR.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-30  |  18.6 KB  |  672 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1997 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. static const SysColorsInfo SysColorsList[] =
  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 < NB_COLORS; 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 = &SysColorsList[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 < NB_COLORS; 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, unsigned long color, LPCTSTR pszPropName)
  322. {
  323.     USES_CONVERSION;
  324.     COleDispatchDriver PropDispDriver;
  325.  
  326.     // Set the properties for all the objects
  327.     ASSERT_KINDOF(COlePropertyPage, pDX->m_pDlgWnd);
  328.     COlePropertyPage* propDialog = (COlePropertyPage*)(pDX->m_pDlgWnd);
  329.  
  330.     ULONG nObjects;
  331.     LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
  332.  
  333.     for (ULONG i = 0; i < nObjects; i++)
  334.     {
  335.         DISPID dwDispID;
  336.  
  337.         // Get the Dispatch ID for the property and if successful set the value
  338.         LPCOLESTR lpOleStr = T2COLE(pszPropName);
  339.         if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
  340.             1, m_lcid, &dwDispID)))
  341.         {
  342.             // Set property
  343.             PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
  344.             TRY
  345.             {
  346.                 PropDispDriver.SetProperty(dwDispID, VT_I4, color);
  347.             }
  348.             CATCH(COleDispatchException, e)
  349.             {
  350.                 // Display message box for dispatch exceptions.
  351.                 e->ReportError(MB_ICONEXCLAMATION | MB_OK);
  352.                 DELETE_EXCEPTION(e);
  353.             }
  354.             AND_CATCH_ALL(e)
  355.             {
  356.                 // Ignore other exceptions.
  357.                 DELETE_EXCEPTION(e);
  358.             }
  359.             END_CATCH_ALL
  360.             PropDispDriver.DetachDispatch();
  361.         }
  362.     }
  363.     return TRUE;
  364. }
  365.  
  366. BOOL CColorPropPage::GetColorProp(CDataExchange* pDX, unsigned long* pcolor, LPCTSTR pszPropName)
  367. {
  368.     USES_CONVERSION;
  369.     COleDispatchDriver PropDispDriver;
  370.  
  371.     // Set the properties for all the objects
  372.     ASSERT_KINDOF(COlePropertyPage, pDX->m_pDlgWnd);
  373.     COlePropertyPage* propDialog = (COlePropertyPage*)(pDX->m_pDlgWnd);
  374.  
  375.     ULONG nObjects;
  376.     LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
  377.  
  378.     for (ULONG i = 0; i < nObjects; i++)
  379.     {
  380.         DISPID dwDispID;
  381.  
  382.         // Get the Dispatch ID for the property and if successful get the value
  383.         LPCOLESTR lpOleStr = T2COLE(pszPropName);
  384.         if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
  385.             1, m_lcid, &dwDispID)))
  386.         {
  387.             // Get property
  388.             unsigned long color = 0;
  389.  
  390.             PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
  391.             TRY
  392.                 PropDispDriver.GetProperty(dwDispID, VT_I4, &color);
  393.             END_TRY
  394.             PropDispDriver.DetachDispatch();
  395.  
  396.             if (i != 0 && color != *pcolor)
  397.                 *pcolor = 0;
  398.             else
  399.                 *pcolor = color;
  400.  
  401.         }
  402.     }
  403.     return TRUE;
  404. }
  405.  
  406. /////////////////////////////////////////////////////////////////////////////
  407. // CColorPropPage message handlers
  408.  
  409. void CColorPropPage::OnSelect()
  410. {
  411.     SetButton((CColorButton *)(GetDlgItem(CColorButton::idClicked)));
  412. }
  413.  
  414. void CColorPropPage::SetButton(CColorButton *Button)
  415. {
  416.     if (m_pSelectedButton != NULL)
  417.     {
  418.         m_pSelectedButton->SetState(FALSE);
  419.         m_pSelectedButton->Invalidate(FALSE);
  420.     }
  421.  
  422.     m_pSelectedButton = Button;
  423.     if (m_pSelectedButton != NULL)
  424.     {
  425.         Button->SetState(TRUE);
  426.         Button->Invalidate(FALSE);
  427.     }
  428.  
  429.     // Deselect any system color currently selected
  430.     m_SysColors.SetCurSel(-1);
  431. }
  432.  
  433. void CColorPropPage::OnSelchangeColorprop()
  434. {
  435.     OnSelchangePropname(m_ColorProp);
  436. }
  437.  
  438. ///////////////////////////////////////////////////////////////////////////////
  439. // 3D Drawing helpers
  440.  
  441. void _AfxDraw3DFrame(CDC *pDC, CRect rcBox, COLORREF colBottomRight, COLORREF colTopLeft)
  442. {
  443.     CPen *pPen2, *pPen, *pOldPen;
  444.  
  445.     pPen = new CPen(PS_SOLID, 1, colBottomRight);
  446.     pOldPen = pDC->SelectObject(pPen);
  447.     pDC->MoveTo(rcBox.right-1, rcBox.top);
  448.     pDC->LineTo(rcBox.right-1, rcBox.bottom-1);
  449.     pDC->LineTo(rcBox.left-1, rcBox.bottom-1);
  450.  
  451.     pPen2 = new CPen(PS_SOLID, 1, colTopLeft);
  452.     pDC->SelectObject(pPen2);
  453.     delete pPen;
  454.  
  455.     pDC->MoveTo(rcBox.left, rcBox.bottom-2);
  456.     pDC->LineTo(rcBox.left, rcBox.top);
  457.     pDC->LineTo(rcBox.right-1, rcBox.top);
  458.  
  459.     pDC->SelectObject(pOldPen);
  460.     delete pPen2;
  461. }
  462.  
  463. void _AfxDraw3DButtonFrame(CDC *pDC, CRect rcButton, BOOL fFocus)
  464. {
  465.     CPen *pPen, *pOldPen;
  466.     CBrush GrayBrush(RGB_BUTTON_LIGHT);
  467.     CBrush BlackBrush(RGB_BUTTON_BLACK);
  468.  
  469.     pPen = new CPen(PS_SOLID, 1, RGB_BUTTON_BLACK);
  470.     pOldPen = pDC->SelectObject(pPen);
  471.  
  472.     // Draw gray outside
  473.     pDC->FrameRect(&rcButton, &GrayBrush);
  474.     rcButton.InflateRect(-1, -1);
  475.  
  476.     if (fFocus)
  477.     {
  478.         // Draw inside of border
  479.         pDC->FrameRect(&rcButton, &BlackBrush);
  480.         // Draw curved border on outside;
  481.         rcButton.InflateRect(1, 1);
  482.     }
  483.     else
  484.     {
  485.         // Prepare inside border
  486.         pDC->FrameRect(&rcButton, &GrayBrush);
  487.     }
  488.  
  489.     pDC->MoveTo(rcButton.left+1, rcButton.top);
  490.     pDC->LineTo(rcButton.right-1, rcButton.top);
  491.     pDC->MoveTo(rcButton.left+1, rcButton.bottom-1);
  492.     pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
  493.     pDC->MoveTo(rcButton.left, rcButton.top+1);
  494.     pDC->LineTo(rcButton.left, rcButton.bottom-1);
  495.     pDC->MoveTo(rcButton.right-1, rcButton.top+1);
  496.     pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
  497.  
  498.     pDC->SelectObject(pOldPen);
  499.     delete pPen;
  500. }
  501.  
  502. HPALETTE _AfxInitPalette(VOID)
  503. {
  504.  
  505.     NPLOGPALETTE pPal; //Local Palette
  506.     HPALETTE pal;
  507.  
  508.  
  509.     //Allocates space for QcQp Palette 'pPal'
  510.     VERIFY( (UINT) (pPal = (NPLOGPALETTE)LocalAlloc (LPTR,
  511.                 (sizeof (LOGPALETTE) +
  512.                 (sizeof (PALETTEENTRY) * (NB_COLORS))))));
  513.  
  514.     //Initialize 'pPal' fields
  515.     pPal->palNumEntries = NB_COLORS;
  516.     pPal->palVersion = 0x300;
  517.  
  518.     //Inits Every color of our palette
  519.     pPal->palPalEntry[BLACK].peRed        =   0;
  520.     pPal->palPalEntry[BLACK].peGreen      =   0;
  521.     pPal->palPalEntry[BLACK].peBlue       =   0;
  522.     pPal->palPalEntry[BLACK].peFlags      =   (BYTE) 0;
  523.  
  524.     pPal->palPalEntry[WHITE].peRed        =   255;
  525.     pPal->palPalEntry[WHITE].peGreen      =   255;
  526.     pPal->palPalEntry[WHITE].peBlue       =   255;
  527.     pPal->palPalEntry[WHITE].peFlags      =   (BYTE) 0;
  528.  
  529.     pPal->palPalEntry[RED].peRed          =   255;
  530.     pPal->palPalEntry[RED].peGreen        =   0;
  531.     pPal->palPalEntry[RED].peBlue         =   0;
  532.     pPal->palPalEntry[RED].peFlags        =   (BYTE) 0;
  533.  
  534.     pPal->palPalEntry[GREEN].peRed        =   0;
  535.     pPal->palPalEntry[GREEN].peGreen      =   255;
  536.     pPal->palPalEntry[GREEN].peBlue       =   0;
  537.     pPal->palPalEntry[GREEN].peFlags      =   (BYTE) 0;
  538.  
  539.     pPal->palPalEntry[BLUE].peRed         =   0;
  540.     pPal->palPalEntry[BLUE].peGreen       =   0;
  541.     pPal->palPalEntry[BLUE].peBlue        =   255;
  542.     pPal->palPalEntry[BLUE].peFlags       =   (BYTE) 0;
  543.  
  544.     pPal->palPalEntry[YELLOW].peRed       =   255;
  545.     pPal->palPalEntry[YELLOW].peGreen     =   255;
  546.     pPal->palPalEntry[YELLOW].peBlue      =   0;
  547.     pPal->palPalEntry[YELLOW].peFlags     =   (BYTE) 0;
  548.  
  549.     pPal->palPalEntry[MAGENTA].peRed      =   255;
  550.     pPal->palPalEntry[MAGENTA].peGreen    =   0;
  551.     pPal->palPalEntry[MAGENTA].peBlue     =   255;
  552.     pPal->palPalEntry[MAGENTA].peFlags    =   (BYTE) 0;
  553.  
  554.     pPal->palPalEntry[CYAN].peRed         =   0;
  555.     pPal->palPalEntry[CYAN].peGreen       =   255;
  556.     pPal->palPalEntry[CYAN].peBlue        =   255;
  557.     pPal->palPalEntry[CYAN].peFlags       =   (BYTE) 0;
  558.  
  559.     pPal->palPalEntry[GRAY].peRed         =   128;
  560.     pPal->palPalEntry[GRAY].peGreen       =   128;
  561.     pPal->palPalEntry[GRAY].peBlue        =   128;
  562.     pPal->palPalEntry[GRAY].peFlags       =   (BYTE) 0;
  563.  
  564.     pPal->palPalEntry[LIGHTGRAY].peRed    =   192;
  565.     pPal->palPalEntry[LIGHTGRAY].peGreen  =   192;
  566.     pPal->palPalEntry[LIGHTGRAY].peBlue   =   192;
  567.     pPal->palPalEntry[LIGHTGRAY].peFlags  =   (BYTE) 0;
  568.  
  569.     pPal->palPalEntry[DARKRED].peRed      =   128;
  570.     pPal->palPalEntry[DARKRED].peGreen    =   0;
  571.     pPal->palPalEntry[DARKRED].peBlue     =   0;
  572.     pPal->palPalEntry[DARKRED].peFlags    =   (BYTE) 0;
  573.  
  574.     pPal->palPalEntry[DARKGREEN].peRed    =   0;
  575.     pPal->palPalEntry[DARKGREEN].peGreen  =   128;
  576.     pPal->palPalEntry[DARKGREEN].peBlue   =   0;
  577.     pPal->palPalEntry[DARKGREEN].peFlags  =   (BYTE) 0;
  578.  
  579.     pPal->palPalEntry[DARKBLUE].peRed     =   0;
  580.     pPal->palPalEntry[DARKBLUE].peGreen   =   0;
  581.     pPal->palPalEntry[DARKBLUE].peBlue    =   128;
  582.     pPal->palPalEntry[DARKBLUE].peFlags   =   (BYTE) 0;
  583.  
  584.     pPal->palPalEntry[LIGHTBROWN].peRed   =   128;
  585.     pPal->palPalEntry[LIGHTBROWN].peGreen =   128;
  586.     pPal->palPalEntry[LIGHTBROWN].peBlue  =   0;
  587.     pPal->palPalEntry[LIGHTBROWN].peFlags =   (BYTE) 0;
  588.  
  589.     pPal->palPalEntry[DARKMAGENTA].peRed  =   128;
  590.     pPal->palPalEntry[DARKMAGENTA].peGreen=   0;
  591.     pPal->palPalEntry[DARKMAGENTA].peBlue =   128;
  592.     pPal->palPalEntry[DARKMAGENTA].peFlags=   (BYTE) 0;
  593.  
  594.     pPal->palPalEntry[DARKCYAN].peRed     =   0;
  595.     pPal->palPalEntry[DARKCYAN].peGreen   =   128;
  596.     pPal->palPalEntry[DARKCYAN].peBlue    =   128;
  597.     pPal->palPalEntry[DARKCYAN].peFlags   =   (BYTE) 0;
  598.  
  599.     //Creates the logical palette
  600.     pal = ::CreatePalette((LPLOGPALETTE)pPal);
  601.     VERIFY(pal);
  602.  
  603.     //Free allocated memory
  604.     VERIFY(LocalFree((HLOCAL)pPal) == NULL);
  605.  
  606.     return pal;
  607. }
  608.  
  609. void CColorPropPage::OnSelchangeSystemcolors()
  610. {
  611.     if (m_pSelectedButton != NULL)
  612.     {
  613.         m_pSelectedButton->SetState(FALSE);
  614.         m_pSelectedButton->Invalidate(FALSE);
  615.         m_pSelectedButton = NULL;
  616.     }
  617. }
  618.  
  619. BOOL CColorPropPage::OnEditProperty(DISPID dispid)
  620. {
  621.     return CStockPropPage::OnEditProperty(dispid, m_ColorProp);
  622. }
  623.  
  624. void CColorPropPage::OnObjectsChanged()
  625. {
  626.     ULONG nObjects;
  627.     if (GetObjectArray(&nObjects) != NULL && m_hWnd != NULL)
  628.     {
  629.         FillPropnameList(GUID_COLOR, 0, m_ColorProp);
  630.  
  631.         if ( m_ColorProp.GetCount() == 0 )
  632.         {
  633.             // No color properties: disable everything.
  634.             UINT iButton;
  635.             for (iButton = 0; iButton < NB_COLORS; iButton++)
  636.                 m_Buttons[iButton].EnableWindow(FALSE);
  637.             m_SysColors.EnableWindow(FALSE);
  638.         }
  639.     }
  640.  
  641.     if (m_hWnd != NULL)
  642.         OnSelchangeColorprop();
  643. }
  644.  
  645. /////////////////////////////////////////////////////////////////////////////
  646. // Class factory for Color property page
  647.  
  648. #ifdef AFXCTL_FACT_SEG
  649. #pragma code_seg(AFXCTL_FACT_SEG)
  650. #endif
  651.  
  652. IMPLEMENT_OLECREATE_EX(CColorPropPage, "OCxx.CColorPropPage",
  653.     0x0be35201,0x8f91,0x11ce,0x9d,0xe3,0x00,0xaa,0x00,0x4b,0xb8,0x51)
  654.  
  655. BOOL CColorPropPage::CColorPropPageFactory::UpdateRegistry(BOOL bRegister)
  656. {
  657.     if (bRegister)
  658.         return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
  659.             m_clsid, AFX_IDS_COLOR_PPG);
  660.     else
  661.         return AfxOleUnregisterClass(m_clsid, NULL);
  662. }
  663.  
  664. /////////////////////////////////////////////////////////////////////////////
  665. // Force any extra compiler-generated code into AFX_INIT_SEG
  666.  
  667. #ifdef AFX_INIT_SEG
  668. #pragma code_seg(AFX_INIT_SEG)
  669. #endif
  670.  
  671. IMPLEMENT_DYNCREATE(CColorPropPage, CStockPropPage)
  672.