colorcombobox.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 172 行

CPP
172
字号
// colorcombobox.cpp : implementation file
//

#include "stdafx.h"
#include "colorcombobox.h"
#include "dlgunits.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorComboBox

CColorComboBox::CColorComboBox() : m_bResized(FALSE)
{
}

CColorComboBox::~CColorComboBox()
{
}


BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)
	//{{AFX_MSG_MAP(CColorComboBox)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorComboBox message handlers

void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CDC dc;
	
	if (!dc.Attach(lpDrawItemStruct->hDC))
		return;

	int nDC = dc.SaveDC();

	BOOL bSelected = (lpDrawItemStruct->itemState & ODS_SELECTED);
	COLORREF crBack = GetSysColor(IsWindowEnabled() ? (bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW) : COLOR_3DFACE);
	COLORREF crText = GetSysColor(IsWindowEnabled() ? (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT) : COLOR_3DSHADOW);

	CRect rItem(lpDrawItemStruct->rcItem);

	dc.FillSolidRect(rItem, crBack);
	dc.SetTextColor(crText);

	if (lpDrawItemStruct->itemAction & ODA_FOCUS)
	{
		dc.DrawFocusRect(rItem);
	}
	else if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
	{
		if (lpDrawItemStruct->itemState & ODS_FOCUS)
			dc.DrawFocusRect(rItem);
	}

	// draw the item
	if (0 <= (int)lpDrawItemStruct->itemID)	// Any item selected?
	{
		CDlgUnits dlu(GetParent());

		BOOL bHasColor = (lpDrawItemStruct->itemData != (DWORD)-1);

		if (!bHasColor)
			rItem.DeflateRect(0, 1); 
		else if (rItem.Height() <= dlu.ToPixelsY(9))
			rItem.DeflateRect(1, 1); // selected item
		else
			rItem.DeflateRect(2, 2); // listbox item

		CRect rColor(rItem);
		
		// draw text
		if (GetStyle() & CBS_HASSTRINGS)
		{
			CRect rText(rItem);
			
			rColor.right = rColor.left + (bHasColor ? rColor.Height() : 0);
			rText.left = rColor.right + 2;
			
			CString sText;
			GetLBText(lpDrawItemStruct->itemID, sText);

			if (!sText.IsEmpty())
				dc.TextOut(rText.left, rText.top, sText);
		}

		// draw color
		if (bHasColor)
		{
			if (!IsWindowEnabled() || (lpDrawItemStruct->itemState & ODS_GRAYED))
				dc.FillSolidRect(rColor, GetSysColor(COLOR_3DFACE));
			else
				dc.FillSolidRect(rColor, (COLORREF)lpDrawItemStruct->itemData);
		}
	}

	// Restore the DC state
	dc.RestoreDC(nDC);
	dc.Detach();
}

int CColorComboBox::AddColor(COLORREF color, LPCTSTR szDescription)
{
	ASSERT (GetStyle() & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE));

	if (szDescription)
		ASSERT (GetStyle() & CBS_HASSTRINGS);
	else
		szDescription = "";

	int nIndex = AddString(szDescription);

	if (nIndex != CB_ERR)
		SetItemData(nIndex, (DWORD)color);

	return nIndex;
}

int CColorComboBox::InsertColor(int nIndex, COLORREF color, LPCTSTR szDescription)
{
	ASSERT (GetStyle() & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE));

	if (szDescription)
		ASSERT (GetStyle() & CBS_HASSTRINGS);
	else
		szDescription = "";

	nIndex = InsertString(nIndex, szDescription);

	if (nIndex != CB_ERR)
		SetItemData(nIndex, (DWORD)color);

	return nIndex;
}

void CColorComboBox::PreSubclassWindow() 
{
	if (!m_bResized)
	{
		m_bResized = TRUE;
		
		CDlgUnits dlu(GetParent());
		SetItemHeight(-1, dlu.ToPixelsY(9)); 
		SetItemHeight(0, dlu.ToPixelsY(9)); 
	}
	
	CComboBox::PreSubclassWindow();
}

int CColorComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CComboBox::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_bResized)
	{
		m_bResized = TRUE;
		
		CDlgUnits dlu(GetParent());
		SetItemHeight(-1, dlu.ToPixelsY(9)); 
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?