Combox的Item前如何插入ICON ? 下拉列表框内容前怎么加一个图标啊~? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.codeproject.com/combobox/http://www.codeguru.com/Cpp/controls/combobox/ // IconComboBox.h : header file//#ifndef _ICONCOMBOBOX_H_#define _ICONCOMBOBOX_H_//////////////////////////////////////////////////////// //// CIconComboBox //// //// Copyright (c) Joel Wahlberg ENATOR Networks 1997 //// [email protected] //// ////////////////////////////////////////////////////////class CIconComboBox : public CComboBox{// Contruction/Destructionpublic: CIconComboBox(); virtual ~CIconComboBox();// Attributespublic: CSize m_sizeIcon;// Operationspublic: virtual int AddIcon(LPCTSTR lpszIconFile); virtual int InsertIcon(int nIndex, LPCTSTR lpszIconFile); virtual int SelectIcon(LPCTSTR lpszIconFile); virtual int SelectIcon(int nIndex); virtual int DeleteIcon(LPCTSTR lpszIconFile); virtual int DeleteIcon(int nIndex);// Implementationprotected: virtual void OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected);// Overrides virtual int AddString(LPCTSTR lpszString); virtual int InsertString(int nIndex, LPCTSTR lpszString); virtual int DeleteString(int nIndex); virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS); virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);};#endif // _ICONCOMBOBOX_H_ #include "stdafx.h"#include "IconComboBox.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif//////////////////////////////////////////////////////// //// CIconComboBox //// //// Copyright (c) Joel Wahlberg ENATOR Networks 1997 //// [email protected] //// ////////////////////////////////////////////////////////CIconComboBox::CIconComboBox(){ m_sizeIcon.cx = ::GetSystemMetrics(SM_CXICON); m_sizeIcon.cy = ::GetSystemMetrics(SM_CXICON); }CIconComboBox::~CIconComboBox(){}int CIconComboBox::AddIcon(LPCTSTR lpszIconFile){ HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0); if (hIcon == (HICON)1 || hIcon == NULL) return CB_ERR; int nIndex = CComboBox::AddString(lpszIconFile); if (nIndex != CB_ERR && nIndex != CB_ERRSPACE) SetItemData(nIndex, (DWORD)hIcon); return nIndex;}int CIconComboBox::InsertIcon(int nIndex, LPCTSTR lpszIconFile){ HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0); if (hIcon == (HICON)1 || hIcon == NULL) return CB_ERR; nIndex = CComboBox::InsertString(nIndex, lpszIconFile); if (nIndex != CB_ERR && nIndex != CB_ERRSPACE) SetItemData(nIndex, (DWORD)hIcon); return nIndex;}int CIconComboBox::SelectIcon(LPCTSTR lpszIconFile){ int nIndex = CComboBox::FindStringExact(-1, lpszIconFile); if (nIndex == CB_ERR && CComboBox::GetCount() > 0) nIndex = 0; // select the first icon if not found return CComboBox::SetCurSel(nIndex);}int CIconComboBox::SelectIcon(int nIndex){ return CComboBox::SetCurSel(nIndex);}int CIconComboBox::DeleteIcon(LPCTSTR lpszIconFile){ int nIndex = CComboBox::FindStringExact(-1, lpszIconFile); return CComboBox::DeleteString(nIndex);}int CIconComboBox::DeleteIcon(int nIndex){ return CComboBox::DeleteString(nIndex);}int CIconComboBox::AddString(LPCTSTR lpszString){ ASSERT(FALSE); // cannot add strings return CB_ERR;}int CIconComboBox::InsertString(int nIndex, LPCTSTR lpszString){ ASSERT(FALSE); // cannot insert strings return CB_ERR;}int CIconComboBox::DeleteString(int nIndex){ ASSERT(FALSE); // cannot delete strings return CB_ERR;}void CIconComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS){ lpMIS->itemHeight = (m_sizeIcon.cy + 2);}void CIconComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS){ CDC* pDC = CDC::FromHandle(lpDIS->hDC); if (!IsWindowEnabled()) { CBrush brDisabled(RGB(192,192,192)); // light gray CBrush* pOldBrush = pDC->SelectObject(&brDisabled); CPen penDisabled(PS_SOLID, 1, RGB(192,192,192)); CPen* pOldPen = pDC->SelectObject(&penDisabled); OnOutputIcon(lpDIS, FALSE); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); return; } // Selected if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { CBrush brHighlight(::GetSysColor(COLOR_HIGHLIGHT)); CBrush* pOldBrush = pDC->SelectObject(&brHighlight); CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHT)); CPen* pOldPen = pDC->SelectObject(&penHighlight); pDC->Rectangle(&lpDIS->rcItem); pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); OnOutputIcon(lpDIS, TRUE); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } // De-Selected if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->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(&lpDIS->rcItem); pDC->SetBkColor(::GetSysColor(COLOR_WINDOW)); pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); OnOutputIcon(lpDIS, FALSE); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } // Focus if (lpDIS->itemAction & ODA_FOCUS) { pDC->DrawFocusRect(&lpDIS->rcItem); }}void CIconComboBox::OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected){ if (GetCurSel() == CB_ERR || GetCount() == 0) return; // no item selected CDC* pDC = CDC::FromHandle(lpDIS->hDC); HICON hIcon = (HICON)lpDIS->itemData; ASSERT(hIcon != NULL); int x = lpDIS->rcItem.left + ((lpDIS->rcItem.right - lpDIS->rcItem.left) / 2) - (m_sizeIcon.cx / 2); int y = lpDIS->rcItem.top + ((lpDIS->rcItem.bottom - lpDIS->rcItem.top) / 2) - (m_sizeIcon.cy / 2); pDC->DrawIcon(x, y, hIcon);} 实现本程序方法如下: 在工程文件中包含IconComboBox.cpp和IconComboBox.h。 在资源编辑器中,创建一个一般的组合框,并设置它具有下面风格: DropList, OwnerDraw Variable, Has Strings。 用ClassWizard创建一个控件成员变量。 替换CComboBox为CIconComboBox。 在IconComboBox创建后,使用下面的方法来插入、选择和删除图标:public:virtual int AddIcon(LPCTSTR lpszIconFileName);virtual int InsertIcon(int nIndex, LPCTSTR lpszIconFileName);virtual int SelectIcon(LPCTSTR lpszIconFileName);virtual int SelectIcon(int nIndex);virtual int DeleteIcon(LPCTSTR lpszIconFileName);virtual int DeleteIcon(int nIndex);下面方法可以被重载,以按不同的方式绘制图标。缺省情况下是,图标在组合框中中对齐。protected:virtual void OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected); 请问striking(硬撑者):这个类怎么用,我加了以后就没有AddString属性了啊。 要稍加修改. int CIconComboBox::AddString(LPCTSTR lpszString){ ASSERT(FALSE); // cannot add strings return CB_ERR;}这边要修改.还有DRAWITEM要改. 我的程序OwnerDraw不能设置为Variable晕掉。 初学者用win32api编计算器,窗口显示出错 关于指向数组的指针? c++ 读多个日志文件的问题 【请教】拆分窗体后函数调用的问题?? 关于CRunTimeClass的问题? 有个问题希望大家来讨论一下?关于delphi有些控件没句柄是如何实现的?vc中能自己实现吗? 寻找acdsee的源码 _T、_TEXT都是做什么用的?? 对后台服务程序了解的人进来,回答有理的都给分 我想把一个整数如"269402"显示成"269,402"的形式,应该如何实现 如何连接有MDW安全组文件的MDB数据库?? 关于OpenGL的一小问——
http://www.codeguru.com/Cpp/controls/combobox/
//#ifndef _ICONCOMBOBOX_H_
#define _ICONCOMBOBOX_H_//////////////////////////////////////////////////////
// //
// CIconComboBox //
// //
// Copyright (c) Joel Wahlberg ENATOR Networks 1997 //
// [email protected] //
// //
//////////////////////////////////////////////////////class CIconComboBox : public CComboBox
{
// Contruction/Destruction
public:
CIconComboBox();
virtual ~CIconComboBox();// Attributes
public:
CSize m_sizeIcon;// Operations
public:
virtual int AddIcon(LPCTSTR lpszIconFile);
virtual int InsertIcon(int nIndex, LPCTSTR lpszIconFile);
virtual int SelectIcon(LPCTSTR lpszIconFile);
virtual int SelectIcon(int nIndex);
virtual int DeleteIcon(LPCTSTR lpszIconFile);
virtual int DeleteIcon(int nIndex);// Implementation
protected:
virtual void OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected);// Overrides
virtual int AddString(LPCTSTR lpszString);
virtual int InsertString(int nIndex, LPCTSTR lpszString);
virtual int DeleteString(int nIndex);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};#endif // _ICONCOMBOBOX_H_
#include "IconComboBox.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif//////////////////////////////////////////////////////
// //
// CIconComboBox //
// //
// Copyright (c) Joel Wahlberg ENATOR Networks 1997 //
// [email protected] //
// //
//////////////////////////////////////////////////////CIconComboBox::CIconComboBox()
{
m_sizeIcon.cx = ::GetSystemMetrics(SM_CXICON);
m_sizeIcon.cy = ::GetSystemMetrics(SM_CXICON);
}CIconComboBox::~CIconComboBox()
{
}int CIconComboBox::AddIcon(LPCTSTR lpszIconFile)
{
HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0); if (hIcon == (HICON)1 || hIcon == NULL)
return CB_ERR; int nIndex = CComboBox::AddString(lpszIconFile); if (nIndex != CB_ERR && nIndex != CB_ERRSPACE)
SetItemData(nIndex, (DWORD)hIcon);
return nIndex;
}int CIconComboBox::InsertIcon(int nIndex, LPCTSTR lpszIconFile)
{
HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0); if (hIcon == (HICON)1 || hIcon == NULL)
return CB_ERR; nIndex = CComboBox::InsertString(nIndex, lpszIconFile); if (nIndex != CB_ERR && nIndex != CB_ERRSPACE)
SetItemData(nIndex, (DWORD)hIcon);
return nIndex;
}int CIconComboBox::SelectIcon(LPCTSTR lpszIconFile)
{
int nIndex = CComboBox::FindStringExact(-1, lpszIconFile);
if (nIndex == CB_ERR && CComboBox::GetCount() > 0)
nIndex = 0; // select the first icon if not found return CComboBox::SetCurSel(nIndex);
}int CIconComboBox::SelectIcon(int nIndex)
{
return CComboBox::SetCurSel(nIndex);
}int CIconComboBox::DeleteIcon(LPCTSTR lpszIconFile)
{
int nIndex = CComboBox::FindStringExact(-1, lpszIconFile); return CComboBox::DeleteString(nIndex);
}int CIconComboBox::DeleteIcon(int nIndex)
{
return CComboBox::DeleteString(nIndex);
}int CIconComboBox::AddString(LPCTSTR lpszString)
{
ASSERT(FALSE); // cannot add strings
return CB_ERR;
}int CIconComboBox::InsertString(int nIndex, LPCTSTR lpszString)
{
ASSERT(FALSE); // cannot insert strings
return CB_ERR;
}int CIconComboBox::DeleteString(int nIndex)
{
ASSERT(FALSE); // cannot delete strings
return CB_ERR;
}void CIconComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemHeight = (m_sizeIcon.cy + 2);
}void CIconComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC); if (!IsWindowEnabled())
{
CBrush brDisabled(RGB(192,192,192)); // light gray
CBrush* pOldBrush = pDC->SelectObject(&brDisabled);
CPen penDisabled(PS_SOLID, 1, RGB(192,192,192));
CPen* pOldPen = pDC->SelectObject(&penDisabled);
OnOutputIcon(lpDIS, FALSE);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
return;
} // Selected
if ((lpDIS->itemState & ODS_SELECTED)
&& (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
CBrush brHighlight(::GetSysColor(COLOR_HIGHLIGHT));
CBrush* pOldBrush = pDC->SelectObject(&brHighlight);
CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHT));
CPen* pOldPen = pDC->SelectObject(&penHighlight);
pDC->Rectangle(&lpDIS->rcItem);
pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
OnOutputIcon(lpDIS, TRUE);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
} // De-Selected
if (!(lpDIS->itemState & ODS_SELECTED)
&& (lpDIS->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(&lpDIS->rcItem);
pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
OnOutputIcon(lpDIS, FALSE);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
} // Focus
if (lpDIS->itemAction & ODA_FOCUS)
{
pDC->DrawFocusRect(&lpDIS->rcItem);
}
}void CIconComboBox::OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected)
{
if (GetCurSel() == CB_ERR || GetCount() == 0)
return; // no item selected
CDC* pDC = CDC::FromHandle(lpDIS->hDC); HICON hIcon = (HICON)lpDIS->itemData;
ASSERT(hIcon != NULL); int x = lpDIS->rcItem.left + ((lpDIS->rcItem.right - lpDIS->rcItem.left) / 2) - (m_sizeIcon.cx / 2);
int y = lpDIS->rcItem.top + ((lpDIS->rcItem.bottom - lpDIS->rcItem.top) / 2) - (m_sizeIcon.cy / 2);
pDC->DrawIcon(x, y, hIcon);
}
在资源编辑器中,创建一个一般的组合框,并设置它具有下面风格: DropList, OwnerDraw Variable, Has Strings。
用ClassWizard创建一个控件成员变量。
替换CComboBox为CIconComboBox。
在IconComboBox创建后,使用下面的方法来插入、选择和删除图标:public:
virtual int AddIcon(LPCTSTR lpszIconFileName);
virtual int InsertIcon(int nIndex, LPCTSTR lpszIconFileName);
virtual int SelectIcon(LPCTSTR lpszIconFileName);
virtual int SelectIcon(int nIndex);
virtual int DeleteIcon(LPCTSTR lpszIconFileName);
virtual int DeleteIcon(int nIndex);下面方法可以被重载,以按不同的方式绘制图标。缺省情况下是,图标在组合框中中对齐。protected:
virtual void OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected);
int CIconComboBox::AddString(LPCTSTR lpszString)
{
ASSERT(FALSE); // cannot add strings
return CB_ERR;
}
这边要修改.还有DRAWITEM要改.