// ColorComboBox.cpp : implementation file
// See ColorComboBox.h for details on how to use this class
//
#include "stdafx.h"
#include "PetrelPro.h"
#include "ColorComboBox.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CColorComboBox
CColorComboBox::CColorComboBox()
{
m_nFillType = 0;
InitColorInfo();
}
CColorComboBox::~CColorComboBox()
{
}
BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)
//{{AFX_MSG_MAP(CColorComboBox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorComboBox message handlers
int CColorComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
COLORREF color1 = (COLORREF)lpCompareItemStruct->itemData1;
COLORREF color2 = (COLORREF)lpCompareItemStruct->itemData2;
if (color1 == color2)
return 0; // exact match
// first do an intensity sort, lower intensities go first
int intensity1 = GetRValue(color1) + GetGValue(color1) + GetBValue(color1);
int intensity2 = GetRValue(color2) + GetGValue(color2) + GetBValue(color2);
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(color1) > GetBValue(color2))
return -1;
else if (GetGValue(color1) > GetGValue(color2))
return -1;
else if (GetRValue(color1) > GetRValue(color2))
return -1;
else
return 1;
}
void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
COLORREF color = (COLORREF)lpDrawItemStruct->itemData; // RGB in item data
CRect rcItem(lpDrawItemStruct->rcItem);
rcItem.InflateRect(-2, -2);
pDC->FillSolidRect(rcItem,RGB(255,255,255));
switch(m_nFillType)
{
case 0:
{
CBrush brush(color);
CRect rc = rcItem;
rc.right = rc.left + 12;
pDC->FillRect(rc, &brush);
brush.DeleteObject();
//
CString sName = GetColorName(color);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(rc.right+2,rcItem.top,sName);
}
break;
case 1:
{
CPen* pOldPen;
switch(color)
{
case 0:
{
CPen pen(PS_SOLID,2,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
}
break;
case 1:
{
CPen pen(PS_DASH,1,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
break;
}
case 2:
{
CPen pen(PS_DOT,1,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
break;
}
case 3:
{
CPen pen(PS_DASHDOT,1,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
break;
}
case 4:
{
CPen pen(PS_DASHDOTDOT,1,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
break;
}
case 5:
{
CPen pen(PS_NULL,2,RGB(0,0,0));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right,(rcItem.top+rcItem.bottom)/2);
CString sNoStyle;
sNoStyle.LoadString(IDS_NO_STYLE);
pDC->TextOut(rcItem.left,rcItem.top,sNoStyle);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
break;
}
}
}
break;
case 2:
{
switch(color)
{
case 0:
{
CBrush brush(HS_HORIZONTAL,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 1:
{
CBrush brush(HS_VERTICAL,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 2:
{
CBrush brush(HS_FDIAGONAL,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 3:
{
CBrush brush(HS_BDIAGONAL,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 4:
{
CBrush brush(HS_CROSS,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 5:
{
CBrush brush(HS_DIAGCROSS,RGB(0,0,0));
pDC->FillRect(rcItem,&brush);
brush.DeleteObject();
break;
}
case 6:
{
CBrush brush(RGB(0,0,0));
pDC->FillRect(rcItem, &brush);
brush.DeleteObject();
break;
}
case 7:
{
pDC->SelectStockObject(NULL_BRUSH);
pDC->SelectStockObject(NULL_PEN);
pDC->Rectangle(rcItem);
CString sNoFill;
sNoFill.LoadString(IDS_NO_FILL);
pDC->TextOut(rcItem.left,rcItem.top,sNoFill);
break;
}
}
}
break;
case 3:
{
CPen pen(PS_SOLID,color,RGB(0,0,0));
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(rcItem.left+8,(rcItem.top+rcItem.bottom)/2);
pDC->LineTo(rcItem.right-8,(rcItem.top+rcItem.bottom)/2);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
}
break;
}
if (lpDrawItemStruct->itemAction & ODA_FOCUS)
pDC->DrawFocusRect(&lpDrawItemStruct->rcItem);
}
#define COLOR_ITEM_HEIGHT 20
// We made our color bars all be the same height for simplicity. You
// can actually specify variable heights as long as you set the
// CBS_OWNERDRAWVARIABLE style.
void CColorComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// all items are of fixed size
// must use CBS_OWNERDRAWVARIABLE for this to work
// lpMeasureItemStruct->itemHeight = COLOR_ITEM_HEIGHT;
}
void CColorComboBox::AddListItem(COLORREF color)
{
// add a combo box item
AddString((LPCTSTR) color);
// Combo box does not have the CBS_HASSTRINGS style, so the
// normal combo box string is used to store an RGB color
}
// add 8 colors to the combo box (primary + secondary color only)
void CColorComboBox::LoadList(BYTE fillType)
{
m_nFillType = fillType;
switch(m_nFillType)
{
case 0: //颜色
{
for(int i=0; i<COLOR_COUNT; i++)
AddListItem(m_ColorInfo[i].nColor);
}
break;
case 1://线型
{
for(int i=0;i<6;i++)
AddListItem(i);
}
break;
case 2://填充
{
for(int i=0;i<8;i++)
AddListItem(i);
}
break;
case 3://线宽
{
for(int i=1; i<15; i++)
AddListItem(i);
}
break;
}
}
void CColorComboBox::InitColorInfo()
{
m_ColorInfo[0].nColor = RGB(0,0,0);
m_ColorInfo[0].sColorName = "纯黑";
m_ColorInfo[1].nColor = RGB(0,0,0x80);;
m_ColorInfo[1].sColorName = "海军蓝";
m_ColorInfo[2].nColor = RGB(0,0,0x8B);
m_ColorInfo[2].sColorName = "暗蓝";
m_ColorInfo[3].nColor = RGB(0,0,0xCD);
m_ColorInfo[3].sColorName = "中蓝";
m_ColorInfo[4].nColor = RGB(0,0,0xFF);
m_ColorInfo[4].sColorName = "纯蓝";
m_ColorInfo[5].nColor = RGB(0,0x64,0);
m_ColorInfo[5].sColorName = "暗绿";
m_ColorInfo[6].nColor = RGB(0,0x80,0);
m_ColorInfo[6].sColorName = "纯绿";
m_ColorInfo[7].nColor = RGB(0,0x80,0x80);
m_ColorInfo[7].sColorName = "水鸭";
m_ColorInfo[8].nColor = RGB(0,0x8B,0x8B);
m_ColorInf
- 1
- 2
- 3
- 4
- 5
前往页