📄 ppgcolor.cpp
字号:
if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
1, m_lcid, &dwDispID)))
{
// Set property
PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
TRY
{
PropDispDriver.SetProperty(dwDispID, VT_I4, color);
}
CATCH(COleDispatchException, e)
{
// Display message box for dispatch exceptions.
e->ReportError(MB_ICONEXCLAMATION | MB_OK);
DELETE_EXCEPTION(e);
}
AND_CATCH_ALL(e)
{
// Ignore other exceptions.
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
PropDispDriver.DetachDispatch();
}
}
return TRUE;
}
BOOL CColorPropPage::GetColorProp(CDataExchange* /* pDX */,
unsigned long* pcolor, LPCTSTR pszPropName)
{
USES_CONVERSION;
COleDispatchDriver PropDispDriver;
ULONG nObjects;
LPDISPATCH* ppDisp = GetObjectArray(&nObjects);
for (ULONG i = 0; i < nObjects; i++)
{
DISPID dwDispID;
// Get the Dispatch ID for the property and if successful get the value
LPCOLESTR lpOleStr = T2COLE(pszPropName);
if (SUCCEEDED(ppDisp[i]->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr,
1, m_lcid, &dwDispID)))
{
// Get property
unsigned long color = 0;
PropDispDriver.AttachDispatch(ppDisp[i], FALSE);
TRY
PropDispDriver.GetProperty(dwDispID, VT_I4, &color);
END_TRY
PropDispDriver.DetachDispatch();
if (i != 0 && color != *pcolor)
*pcolor = 0;
else
*pcolor = color;
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CColorPropPage message handlers
void CColorPropPage::OnSelect()
{
SetButton((CColorButton *)(GetDlgItem(CColorButton::idClicked)));
}
void CColorPropPage::SetButton(CColorButton *Button)
{
if (m_pSelectedButton != NULL)
{
m_pSelectedButton->SetState(FALSE);
m_pSelectedButton->Invalidate(FALSE);
}
m_pSelectedButton = Button;
if (m_pSelectedButton != NULL)
{
Button->SetState(TRUE);
Button->Invalidate(FALSE);
}
// Deselect any system color currently selected
m_SysColors.SetCurSel(-1);
}
void CColorPropPage::OnSelchangeColorprop()
{
OnSelchangePropname(m_ColorProp);
}
///////////////////////////////////////////////////////////////////////////////
// 3D Drawing helpers
void _AfxDraw3DFrame(CDC *pDC, CRect rcBox, COLORREF colBottomRight, COLORREF colTopLeft)
{
CPen *pPen2, *pPen, *pOldPen;
pPen = new CPen(PS_SOLID, 1, colBottomRight);
pOldPen = pDC->SelectObject(pPen);
pDC->MoveTo(rcBox.right-1, rcBox.top);
pDC->LineTo(rcBox.right-1, rcBox.bottom-1);
pDC->LineTo(rcBox.left-1, rcBox.bottom-1);
pPen2 = new CPen(PS_SOLID, 1, colTopLeft);
pDC->SelectObject(pPen2);
delete pPen;
pDC->MoveTo(rcBox.left, rcBox.bottom-2);
pDC->LineTo(rcBox.left, rcBox.top);
pDC->LineTo(rcBox.right-1, rcBox.top);
pDC->SelectObject(pOldPen);
delete pPen2;
}
void _AfxDraw3DButtonFrame(CDC *pDC, CRect rcButton, BOOL fFocus)
{
CPen *pPen, *pOldPen;
CBrush GrayBrush(RGB_BUTTON_LIGHT);
CBrush BlackBrush(RGB_BUTTON_BLACK);
pPen = new CPen(PS_SOLID, 1, RGB_BUTTON_BLACK);
pOldPen = pDC->SelectObject(pPen);
// Draw gray outside
pDC->FrameRect(&rcButton, &GrayBrush);
rcButton.InflateRect(-1, -1);
if (fFocus)
{
// Draw inside of border
pDC->FrameRect(&rcButton, &BlackBrush);
// Draw curved border on outside;
rcButton.InflateRect(1, 1);
}
else
{
// Prepare inside border
pDC->FrameRect(&rcButton, &GrayBrush);
}
pDC->MoveTo(rcButton.left+1, rcButton.top);
pDC->LineTo(rcButton.right-1, rcButton.top);
pDC->MoveTo(rcButton.left+1, rcButton.bottom-1);
pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
pDC->MoveTo(rcButton.left, rcButton.top+1);
pDC->LineTo(rcButton.left, rcButton.bottom-1);
pDC->MoveTo(rcButton.right-1, rcButton.top+1);
pDC->LineTo(rcButton.right-1, rcButton.bottom-1);
pDC->SelectObject(pOldPen);
delete pPen;
}
HPALETTE _AfxInitPalette(VOID)
{
NPLOGPALETTE pPal; // Local palette
HPALETTE pal;
//Allocates space for QcQp Palette 'pPal'
pPal = (NPLOGPALETTE) LocalAlloc(LPTR,
(sizeof (LOGPALETTE) +
(sizeof (PALETTEENTRY) * CColorPropPage::NBUTTONS)));
if (pPal == NULL)
return NULL;
//Initialize 'pPal' fields
pPal->palNumEntries = CColorPropPage::NBUTTONS;
pPal->palVersion = 0x300;
//Inits Every color of our palette
pPal->palPalEntry[BLACK].peRed = 0;
pPal->palPalEntry[BLACK].peGreen = 0;
pPal->palPalEntry[BLACK].peBlue = 0;
pPal->palPalEntry[BLACK].peFlags = (BYTE) 0;
pPal->palPalEntry[WHITE].peRed = 255;
pPal->palPalEntry[WHITE].peGreen = 255;
pPal->palPalEntry[WHITE].peBlue = 255;
pPal->palPalEntry[WHITE].peFlags = (BYTE) 0;
pPal->palPalEntry[RED].peRed = 255;
pPal->palPalEntry[RED].peGreen = 0;
pPal->palPalEntry[RED].peBlue = 0;
pPal->palPalEntry[RED].peFlags = (BYTE) 0;
pPal->palPalEntry[GREEN].peRed = 0;
pPal->palPalEntry[GREEN].peGreen = 255;
pPal->palPalEntry[GREEN].peBlue = 0;
pPal->palPalEntry[GREEN].peFlags = (BYTE) 0;
pPal->palPalEntry[BLUE].peRed = 0;
pPal->palPalEntry[BLUE].peGreen = 0;
pPal->palPalEntry[BLUE].peBlue = 255;
pPal->palPalEntry[BLUE].peFlags = (BYTE) 0;
pPal->palPalEntry[YELLOW].peRed = 255;
pPal->palPalEntry[YELLOW].peGreen = 255;
pPal->palPalEntry[YELLOW].peBlue = 0;
pPal->palPalEntry[YELLOW].peFlags = (BYTE) 0;
pPal->palPalEntry[MAGENTA].peRed = 255;
pPal->palPalEntry[MAGENTA].peGreen = 0;
pPal->palPalEntry[MAGENTA].peBlue = 255;
pPal->palPalEntry[MAGENTA].peFlags = (BYTE) 0;
pPal->palPalEntry[CYAN].peRed = 0;
pPal->palPalEntry[CYAN].peGreen = 255;
pPal->palPalEntry[CYAN].peBlue = 255;
pPal->palPalEntry[CYAN].peFlags = (BYTE) 0;
pPal->palPalEntry[GRAY].peRed = 128;
pPal->palPalEntry[GRAY].peGreen = 128;
pPal->palPalEntry[GRAY].peBlue = 128;
pPal->palPalEntry[GRAY].peFlags = (BYTE) 0;
pPal->palPalEntry[LIGHTGRAY].peRed = 192;
pPal->palPalEntry[LIGHTGRAY].peGreen = 192;
pPal->palPalEntry[LIGHTGRAY].peBlue = 192;
pPal->palPalEntry[LIGHTGRAY].peFlags = (BYTE) 0;
pPal->palPalEntry[DARKRED].peRed = 128;
pPal->palPalEntry[DARKRED].peGreen = 0;
pPal->palPalEntry[DARKRED].peBlue = 0;
pPal->palPalEntry[DARKRED].peFlags = (BYTE) 0;
pPal->palPalEntry[DARKGREEN].peRed = 0;
pPal->palPalEntry[DARKGREEN].peGreen = 128;
pPal->palPalEntry[DARKGREEN].peBlue = 0;
pPal->palPalEntry[DARKGREEN].peFlags = (BYTE) 0;
pPal->palPalEntry[DARKBLUE].peRed = 0;
pPal->palPalEntry[DARKBLUE].peGreen = 0;
pPal->palPalEntry[DARKBLUE].peBlue = 128;
pPal->palPalEntry[DARKBLUE].peFlags = (BYTE) 0;
pPal->palPalEntry[LIGHTBROWN].peRed = 128;
pPal->palPalEntry[LIGHTBROWN].peGreen = 128;
pPal->palPalEntry[LIGHTBROWN].peBlue = 0;
pPal->palPalEntry[LIGHTBROWN].peFlags = (BYTE) 0;
pPal->palPalEntry[DARKMAGENTA].peRed = 128;
pPal->palPalEntry[DARKMAGENTA].peGreen= 0;
pPal->palPalEntry[DARKMAGENTA].peBlue = 128;
pPal->palPalEntry[DARKMAGENTA].peFlags= (BYTE) 0;
pPal->palPalEntry[DARKCYAN].peRed = 0;
pPal->palPalEntry[DARKCYAN].peGreen = 128;
pPal->palPalEntry[DARKCYAN].peBlue = 128;
pPal->palPalEntry[DARKCYAN].peFlags = (BYTE) 0;
//Creates the logical palette
pal = ::CreatePalette((LPLOGPALETTE)pPal);
//Free allocated memory
VERIFY(LocalFree((HLOCAL)pPal) == NULL);
return pal;
}
void CColorPropPage::OnSelchangeSystemcolors()
{
if (m_pSelectedButton != NULL)
{
m_pSelectedButton->SetState(FALSE);
m_pSelectedButton->Invalidate(FALSE);
m_pSelectedButton = NULL;
}
}
BOOL CColorPropPage::OnEditProperty(DISPID dispid)
{
return CStockPropPage::OnEditProperty(dispid, m_ColorProp);
}
void CColorPropPage::OnObjectsChanged()
{
ULONG nObjects;
if (GetObjectArray(&nObjects) != NULL && m_hWnd != NULL)
{
FillPropnameList(GUID_COLOR, 0, m_ColorProp);
if ( m_ColorProp.GetCount() == 0 )
{
// No color properties: disable everything.
UINT iButton;
for (iButton = 0; iButton < NBUTTONS; iButton++)
m_Buttons[iButton].EnableWindow(FALSE);
m_SysColors.EnableWindow(FALSE);
}
}
if (m_hWnd != NULL)
OnSelchangeColorprop();
}
/////////////////////////////////////////////////////////////////////////////
// Class factory for Color property page
#ifdef _AFXDLL
#ifdef AFXCTL_FACT_SEG
#pragma code_seg(AFXCTL_FACT_SEG)
#endif
IMPLEMENT_OLECREATE_EX(CColorPropPage, "OCxx.CColorPropPage",
0x0be35201,0x8f91,0x11ce,0x9d,0xe3,0x00,0xaa,0x00,0x4b,0xb8,0x51)
BOOL CColorPropPage::CColorPropPageFactory::UpdateRegistry(BOOL bRegister)
{
if (bRegister)
return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
m_clsid, AFX_IDS_COLOR_PPG);
else
return AfxOleUnregisterClass(m_clsid, NULL);
}
#endif //_AFXDLL
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNCREATE(CColorPropPage, CStockPropPage)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -