#include "stdafx.h" #include "Resource.h" #include "KTInstLineListBox.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(KTInstLineListBox, CListBox) KTInstLineListBox::KTInstLineListBox() : m_pImageList(NULL) { } KTInstLineListBox::~KTInstLineListBox() { } BEGIN_MESSAGE_MAP(KTInstLineListBox, CListBox) //{{AFX_MSG_MAP(KTInstLineListBox) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL KTInstLineListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) { dwStyle &= ~(LBS_MULTICOLUMN|LBS_OWNERDRAWVARIABLE); dwStyle |= (WS_VSCROLL|LBS_OWNERDRAWFIXED|LBS_HASSTRINGS); return CListBox::Create(dwStyle, rect, pParentWnd, nID); } void KTInstLineListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { if (lpMeasureItemStruct->itemID == (UINT) -1) return; IMAGEINFO info = {0}; ASSERT(NULL != m_pImageList); m_pImageList->GetImageInfo(lpMeasureItemStruct->itemID, &info); CDC* pDC = GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); lpMeasureItemStruct->itemHeight = max(tm.tmHeight, (info.rcImage.bottom - info.rcImage.top)); ReleaseDC(pDC); } void KTInstLineListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { int iIndex = lpDrawItemStruct->itemID; if (iIndex < 0) return; CString sText; CListBox::GetText(iIndex, sText); int iImage = CListBox::GetItemData(iIndex); IMAGEINFO info = {0}; ASSERT(NULL != m_pImageList); m_pImageList->GetImageInfo(iImage, &info); CRect rcItem = lpDrawItemStruct->rcItem; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); COLORREF crOldTextColor = pDC->GetTextColor(); COLORREF crOldBkColor = pDC->GetBkColor(); pDC->Draw3dRect(rcItem, crOldBkColor, crOldBkColor); if ((lpDrawItemStruct->itemAction | ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(rcItem); rcItem.DeflateRect(0, 1); } rcItem.DeflateRect(1, 0); if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) { pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillSolidRect(rcItem, ::GetSysColor(COLOR_HIGHLIGHT)); } else { pDC->FillSolidRect(rcItem, crOldBkColor); } m_pImageList->Draw(pDC, iImage, rcItem.TopLeft(), ILD_TRANSPARENT); rcItem.left += (info.rcImage.right - info.rcImage.left); rcItem.left += 2; pDC->DrawText(sText, rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER); pDC->SetTextColor(crOldTextColor); pDC->SetBkColor(crOldBkColor); } int KTInstLineListBox::AddString(LPCTSTR lpszLayer, UINT nImage) { int iIndex = CListBox::AddString(lpszLayer); if (iIndex >= 0) CListBox::SetItemData(iIndex, nImage); return iIndex; } void KTInstLineListBox::SetImageList(CImageList* pImageList) { ASSERT(pImageList != NULL); m_pImageList = pImageList; }