// colorcom.cpp : implementation file // #include "stdafx.h" #include "gmud32.h" #include "colorcom.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define COLOR_ITEM_HEIGHT 20 ///////////////////////////////////////////////////////////////////////////// // CColorCombo CColorCombo::CColorCombo() { } CColorCombo::~CColorCombo() { } BEGIN_MESSAGE_MAP(CColorCombo, CComboBox) //{{AFX_MSG_MAP(CColorCombo) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CColorCombo message handlers void CColorCombo::AddColorItem(COLORREF color) { // add a listbox item AddString((LPCTSTR) color); // Listbox does not have the LBS_HASSTRINGS style, so the // normal listbox string is used to store an RGB color } int CColorCombo::CompareItem(LPCOMPAREITEMSTRUCT lpCIS) { COLORREF cr1 = (COLORREF)lpCIS->itemData1; COLORREF cr2 = (COLORREF)lpCIS->itemData2; if (cr1 == cr2) return 0; // exact match // first do an intensity sort, lower intensities go first int intensity1 = GetRValue(cr1) + GetGValue(cr1) + GetBValue(cr1); int intensity2 = GetRValue(cr2) + GetGValue(cr2) + GetBValue(cr2); if (intensity1 < intensity2) return -1; // lower intensity goes first else if (intensity1 > intensity2) return 1; // higher intensity goes second // if same intensity, sort by color (blues first, reds last) if (GetBValue(cr1) > GetBValue(cr2)) return -1; else if (GetGValue(cr1) > GetGValue(cr2)) return -1; else if (GetRValue(cr1) > GetRValue(cr2)) return -1; return 1; } void CColorCombo::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); COLORREF cr = (COLORREF)lpDIS->itemData; // RGB in item data if (lpDIS->itemAction & ODA_DRAWENTIRE) { // Paint the color item in the color requested CBrush br(cr); pDC->FillRect(&lpDIS->rcItem, &br); } if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { // item has been selected - hilite frame COLORREF crHilite = RGB(255-GetRValue(cr), 255-GetGValue(cr), 255-GetBValue(cr)); CBrush br(crHilite); pDC->FrameRect(&lpDIS->rcItem, &br); } if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT)) { // Item has been de-selected -- remove frame CBrush br(cr); pDC->FrameRect(&lpDIS->rcItem, &br); } } void CColorCombo::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) { // all items are of fixed size // must use LBS_OWNERDRAWVARIABLE for this to work lpMIS->itemHeight = COLOR_ITEM_HEIGHT; }