www.pudn.com > GGBT.rar > CategoryCombobox.cpp
// CategoryCombobox.cpp : implementation file
//
#include "stdafx.h"
#include "testbt.h"
#include "CategoryCombobox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCategoryCombobox
CCategoryCombobox::CCategoryCombobox()
{
}
CCategoryCombobox::~CCategoryCombobox()
{
}
BEGIN_MESSAGE_MAP(CCategoryCombobox, CComboBox)
//{{AFX_MSG_MAP(CCategoryCombobox)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCategoryCombobox message handlers
void CCategoryCombobox::DrawItem( LPDRAWITEMSTRUCT pDIStruct )
{
assert(m_pimgList);
static CString sFolder, tmpStr; // No Need To Reallocate Each Time
CDC dcContext;
CRect rItemRect(pDIStruct->rcItem);
CRect rBlockRect(rItemRect);
CRect rTextRect(rBlockRect);
CBrush brFrameBrush;
int iItem = pDIStruct -> itemID;
int iState = pDIStruct -> itemState;
int iImageIndex = 0;
int iIndent;
COLORREF crColor = GetSysColor(COLOR_WINDOW);
COLORREF crNormal = GetSysColor(COLOR_WINDOW);
COLORREF crSelected = GetSysColor(COLOR_HIGHLIGHT);
COLORREF crText = GetSysColor(COLOR_WINDOWTEXT);
// Attach the CDC object
if(!dcContext.Attach(pDIStruct -> hDC ))
return;
brFrameBrush.CreateStockObject(BLACK_BRUSH);
// Draw folder text and icon
// If an item is selected...
if( iItem != -1 )
{
// Get text for normal and disabled
CString sFolder;
GetLBText(iItem, sFolder);
LPSFOLDER tmpFolder = (LPSFOLDER)GetItemDataPtr(iItem);
iIndent = tmpFolder->m_iIndent;
// if draw edit text, then no indent.
if (iState & ODS_COMBOBOXEDIT)
iIndent = 1;
// Calculate icon display area and set the width
rBlockRect.DeflateRect(CSize(2, 2));
rBlockRect.right = ICONWIDTH * iIndent;
// Calculate Text Area
// Set start of text offset a bit
rTextRect.left += (ICONWIDTH * iIndent) + 2;
rTextRect.top += 2;
CSize size = dcContext.GetTextExtent(sFolder);
rTextRect.right = rTextRect.left + size.cx + 4;
////////////////////////////////////////////////
// draw focus select.
if(iState & ODS_SELECTED)
{
dcContext.SetTextColor((0x00FFFFFF & ~(crText)));
dcContext.SetBkColor( crSelected );
dcContext.FillSolidRect( &rTextRect, crSelected );
}
else
{
dcContext.SetTextColor( crText );
dcContext.SetBkColor( crNormal );
dcContext.FillSolidRect( &rTextRect, crNormal );
}
// If item has the focus...draw the focus rectangle.
// **** useless.
if( iState & ODS_FOCUS )
dcContext.DrawFocusRect( &rTextRect );
////////////////////////////////////////////////
// draw text and image.
iImageIndex = tmpFolder->m_iImageIndex;
if( iState & ODS_DISABLED )
{
crColor = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
dcContext.SetTextColor(crColor);
CPoint pt(pDIStruct->rcItem.left, pDIStruct->rcItem.top);
pt.x = pDIStruct->rcItem.left + ((iIndent - 1) * ICONWIDTH);
m_pimgList->Draw(&dcContext, iImageIndex, pt, ILD_TRANSPARENT);
}
else
{
CPoint pt(pDIStruct->rcItem.left, pDIStruct->rcItem.top);
pt.x = pDIStruct->rcItem.left + ((iIndent - 1) * ICONWIDTH);
m_pimgList->Draw(&dcContext, iImageIndex, pt, ILD_NORMAL);
}
dcContext.SetBkMode(TRANSPARENT);
dcContext.TextOut(rTextRect.left, rTextRect.top, sFolder);
}
// Detach DC
dcContext.Detach();
}
void CCategoryCombobox::OnDestroy()
{
DeleteAllItems();
CComboBox::OnDestroy();
}
void CCategoryCombobox::DeleteAllItems()
{
// Iterate through the items destroying all of the
// associated data
LPSFOLDER tmpFolder;
int iListCount = GetCount();
for (int x = 0; x < iListCount; x++)
{
tmpFolder = (LPSFOLDER)GetItemDataPtr(x);
if (tmpFolder)
delete tmpFolder;
}
ResetContent();
}