SOFTIST 编程方法筆記 目录

自描画下拉组合框(VC++)

下图是自描画下拉组合框的例子。做一个简单的下拉组合框的自描画,自描画内容包括:文字聚中显示,图片显示,选择状态显示,焦点状态显示。

1.使用资源编辑器,为对话框贴一个下拉组合框,并且设其属性为「自描画可变,下拉列表,使用文字列」。

2.从CComboBox派生一个CComBoOwnerDraw类。

3.用ClassWizard为刚刚贴的下拉组合框定义一个CComBoOwnerDraw类型的变量m_cmboOwner。在对话框派生类的OnInitDialog()中做文字列的插入处理。

m_cmboOwner.AddString(_T("下拉組合框"));
m_cmboOwner.AddString(_T("自描画"));
m_cmboOwner.AddString(_T("練習"));
m_cmboOwner.AddString(_T("筆記"));

4.重载和填写void CComBoOwnerDraw::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
函数。

void CComBoOwnerDraw::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	lpMeasureItemStruct->itemHeight = 22;
}

void CComBoOwnerDraw::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

	//Selected
	if ((lpDrawItemStruct->itemState & ODS_SELECTED) 
		&& (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
	{
		COLORREF hiColor = ::GetSysColor(COLOR_HIGHLIGHT);
		CBrush brHighlight(hiColor); 
		CBrush* pOldBrush = pDC->SelectObject(&brHighlight);
		CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHT));
		CPen* pOldPen = pDC->SelectObject(&penHighlight);
		pDC->Rectangle(&lpDrawItemStruct->rcItem);
		pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
		pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));

		if (lpDrawItemStruct->itemID != -1)
		{
			CString strText;
			GetLBText(lpDrawItemStruct->itemID, strText);
			strText += _T("(by softist)");
			pDC->DrawText(strText, &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER); 
		}
		pDC->SelectObject(pOldBrush);
		pDC->SelectObject(pOldPen);
	}

	// De-Selected
	if (!(lpDrawItemStruct->itemState & ODS_SELECTED) 
		&& (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
	{
		CBrush brWindow(::GetSysColor(COLOR_WINDOW)); 
		CBrush* pOldBrush = pDC->SelectObject(&brWindow);
		CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));
		CPen* pOldPen = pDC->SelectObject(&penHighlight);
		pDC->Rectangle(&lpDrawItemStruct->rcItem);
		pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));

		pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
		if (lpDrawItemStruct->itemID != -1)
		{
			CString strText;
			GetLBText(lpDrawItemStruct->itemID, strText);
			strText += _T("(by softist)");
			pDC->DrawText(strText, &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER); 
		}
		pDC->SelectObject(pOldBrush);
		pDC->SelectObject(pOldPen);
	}

	CBitmap bmp;
	bmp.LoadBitmap(IDB_BITMAP1);
	pDC->DrawState(CPoint(lpDrawItemStruct->rcItem.left + 2, lpDrawItemStruct->rcItem.top + 2),
					CSize(44, 16),
					&bmp,
					DST_BITMAP);
  // Focus
	if (lpDrawItemStruct->itemAction & ODA_FOCUS) 
		pDC->DrawFocusRect(&lpDrawItemStruct->rcItem);	

}