如题目:
我在用这个类时插入不了,那个AddString 老出错,所以连它的插入Icon都测试不了,到底这个类能不能用? 应该怎么用?请大家给点经验!
我在用这个类时插入不了,那个AddString 老出错,所以连它的插入Icon都测试不了,到底这个类能不能用? 应该怎么用?请大家给点经验!
解决方案 »
- 明天就要去参加笔试了,祝我好运~~
- 数据包里的字符串
- VC6.0中使用hotns等函数的问题
- 设置菜单带bitmap,为什么16X16的图被削成13X13.谢谢
- com中怎样读注册表
- 求API函数大全~
- 还是参数传递的问题
- 在Windows Vista中不能注册OCX之类的控件怎么办?
- 【求助 || 讨论】在同一个对话框下显示不同常用控件
- 不管“大虾”,“小虾”,“菜鸟”,“老鸟”如有知道,请赐教!
- 在单文档程序中 产生一个对话框 但是在Debug中停留时产生的信息不知道是什么意思?
- 我建一个对话框类CMyDlg,在CMyDlg怎样去访问CMainFrame类中的一个m_test全局成员变量?
{
// 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
public:
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_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);