首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  界面/窗口  |  组合框   


选择图标的ComboBox


原作者:mynote    源出处:CSDN    发布者:施昌权    发布类型:转载    发布日期:2008-10-15

              

图标选择的组合框,我想大家在QQ的个人设置中肯定看见过,里面可以有很多头像,你可以任意的选择一个。下面就是建立一个选择图标的组合框的简单步骤:

1.这一步,很显然,得把.CPP和.H文件加到你的工程中去。

2.在你的工程中加一个组合框的控件,组合框的风格按默认的设置就行了。

3.利用VC的类向导给组合框定义一个控件变量。

4.在头文件中用CCionComBox代替CComboBox,那样你才能真正用下面的这个类。

     上面的步骤好了之后,你就可以用下面的函数来插入,选择和删除图标了。
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); 

     你还可以通过下面的函数来设置大小,以适应图标大小不同而不同。
m_cbmyiconcombobox.setitemheight(-1, m_cbmyiconcombobox.m_sizeicon.cy + 6);

     当然还有其他的功能等你去发现,如果你真的很喜欢这项功能,你还是去把全部的代码看一下,这样会对你的编程更有好处,由于本人的水平有限,我还不能把它给扩展了,我希望有读者能把它给扩展了。下面是该类的.H和.CPP文件:

//头文件
// IconComboBox.h : header file
//

#ifndef _ICONCOMBOBOX_H_
#define _ICONCOMBOBOX_H_

//////////////////////////////////////////////////////
//                                                  //
//                   CIconComboBox                  //
//                                                  //
// Copyright (c) Joel Wahlberg ENATOR Networks 1997 //
//               joel.wahlberg@enator.se            //
//                                                  //
//////////////////////////////////////////////////////

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 "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 //
//               joel.wahlberg@enator.se            //
//                                                  //
//////////////////////////////////////////////////////

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);
}               

     译于2001年9月9号。

关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号