下拉列表框内容前怎么加一个图标啊~?

解决方案 »

  1.   

    http://www.codeproject.com/combobox/
    http://www.codeguru.com/Cpp/controls/combobox/
      

  2.   

    // 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/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_
      

  3.   

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

  4.   

    实现本程序方法如下: 在工程文件中包含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); 
      

  5.   

    请问striking(硬撑者):这个类怎么用,我加了以后就没有AddString属性了啊。
      

  6.   

    要稍加修改. 
    int CIconComboBox::AddString(LPCTSTR lpszString)
    {
    ASSERT(FALSE); // cannot add strings 
    return CB_ERR;
    }
    这边要修改.还有DRAWITEM要改.
      

  7.   

    我的程序OwnerDraw不能设置为Variable晕掉。