home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / ICOMBO.ZIP / IconComboBox.cpp next >
Encoding:
C/C++ Source or Header  |  1998-08-27  |  4.8 KB  |  180 lines

  1. #include "stdafx.h"
  2. #include "IconComboBox.h"
  3.  
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char BASED_CODE THIS_FILE[] = __FILE__;
  8. #endif
  9.  
  10. //////////////////////////////////////////////////////
  11. //                                                  //
  12. //                   CIconComboBox                  //
  13. //                                                  //
  14. // Copyright (c) Joel Wahlberg ENATOR Networks 1997 //
  15. //               joel.wahlberg@enator.se            //
  16. //                                                  //
  17. //////////////////////////////////////////////////////
  18.  
  19. CIconComboBox::CIconComboBox()
  20. {
  21.     m_sizeIcon.cx = ::GetSystemMetrics(SM_CXICON); 
  22.     m_sizeIcon.cy = ::GetSystemMetrics(SM_CXICON); 
  23. }
  24.  
  25. CIconComboBox::~CIconComboBox()
  26. {
  27. }
  28.  
  29. int CIconComboBox::AddIcon(LPCTSTR lpszIconFile)
  30. {
  31.     HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0);
  32.  
  33.     if (hIcon == (HICON)1 || hIcon == NULL)
  34.         return CB_ERR;
  35.  
  36.     int nIndex = CComboBox::AddString(lpszIconFile);
  37.  
  38.     if (nIndex != CB_ERR && nIndex != CB_ERRSPACE)
  39.         SetItemData(nIndex, (DWORD)hIcon);
  40.     
  41.     return nIndex;
  42. }
  43.  
  44. int CIconComboBox::InsertIcon(int nIndex, LPCTSTR lpszIconFile)
  45. {
  46.     HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), lpszIconFile, 0);
  47.  
  48.     if (hIcon == (HICON)1 || hIcon == NULL)
  49.         return CB_ERR;
  50.  
  51.     nIndex = CComboBox::InsertString(nIndex, lpszIconFile);
  52.  
  53.     if (nIndex != CB_ERR && nIndex != CB_ERRSPACE)
  54.         SetItemData(nIndex, (DWORD)hIcon);
  55.     
  56.     return nIndex;
  57. }
  58.  
  59. int CIconComboBox::SelectIcon(LPCTSTR lpszIconFile)
  60. {
  61.     int nIndex = CComboBox::FindStringExact(-1, lpszIconFile);
  62.     
  63.     if (nIndex == CB_ERR && CComboBox::GetCount() > 0)
  64.         nIndex = 0; // select the first icon if not found
  65.  
  66.     return CComboBox::SetCurSel(nIndex);
  67. }
  68.  
  69. int CIconComboBox::SelectIcon(int nIndex)
  70. {
  71.     return CComboBox::SetCurSel(nIndex);
  72. }
  73.  
  74. int CIconComboBox::DeleteIcon(LPCTSTR lpszIconFile)
  75. {
  76.     int nIndex = CComboBox::FindStringExact(-1, lpszIconFile);
  77.  
  78.     return CComboBox::DeleteString(nIndex);
  79. }
  80.  
  81. int CIconComboBox::DeleteIcon(int nIndex)
  82. {
  83.     return CComboBox::DeleteString(nIndex);
  84. }
  85.  
  86. int CIconComboBox::AddString(LPCTSTR lpszString)
  87. {
  88.     ASSERT(FALSE); // cannot add strings 
  89.     return CB_ERR;
  90. }
  91.  
  92. int CIconComboBox::InsertString(int nIndex, LPCTSTR lpszString)
  93. {
  94.     ASSERT(FALSE); // cannot insert strings
  95.     return CB_ERR;
  96. }
  97.  
  98. int CIconComboBox::DeleteString(int nIndex)
  99. {
  100.     ASSERT(FALSE); // cannot delete strings
  101.     return CB_ERR;
  102. }
  103.  
  104. void CIconComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  105.     lpMIS->itemHeight = (m_sizeIcon.cy + 2);
  106. }
  107.  
  108. void CIconComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  109. {
  110.     CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  111.  
  112.     if (!IsWindowEnabled())
  113.     {
  114.         CBrush brDisabled(RGB(192,192,192)); // light gray
  115.         CBrush* pOldBrush = pDC->SelectObject(&brDisabled);
  116.         CPen penDisabled(PS_SOLID, 1, RGB(192,192,192));
  117.         CPen* pOldPen = pDC->SelectObject(&penDisabled);
  118.         OnOutputIcon(lpDIS, FALSE);
  119.         pDC->SelectObject(pOldBrush);
  120.         pDC->SelectObject(pOldPen);
  121.         return;
  122.     }
  123.  
  124.     // Selected
  125.     if ((lpDIS->itemState & ODS_SELECTED) 
  126.         && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
  127.     {
  128.         CBrush brHighlight(::GetSysColor(COLOR_HIGHLIGHT)); 
  129.         CBrush* pOldBrush = pDC->SelectObject(&brHighlight);
  130.         CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_HIGHLIGHT));
  131.         CPen* pOldPen = pDC->SelectObject(&penHighlight);
  132.         pDC->Rectangle(&lpDIS->rcItem);
  133.         pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
  134.            pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  135.         OnOutputIcon(lpDIS, TRUE);
  136.         pDC->SelectObject(pOldBrush);
  137.         pDC->SelectObject(pOldPen);
  138.     }
  139.  
  140.     // De-Selected
  141.     if (!(lpDIS->itemState & ODS_SELECTED) 
  142.         && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
  143.     {
  144.         CBrush brWindow(::GetSysColor(COLOR_WINDOW)); 
  145.         CBrush* pOldBrush = pDC->SelectObject(&brWindow);
  146.         CPen penHighlight(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));
  147.         CPen* pOldPen = pDC->SelectObject(&penHighlight);
  148.         pDC->Rectangle(&lpDIS->rcItem);
  149.         pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
  150.            pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
  151.         OnOutputIcon(lpDIS, FALSE);
  152.         pDC->SelectObject(pOldBrush);
  153.         pDC->SelectObject(pOldPen);
  154.     }
  155.  
  156.     // Focus
  157.     if (lpDIS->itemAction & ODA_FOCUS) 
  158.     { 
  159.         pDC->DrawFocusRect(&lpDIS->rcItem);
  160.     }
  161. }
  162.  
  163. void CIconComboBox::OnOutputIcon(LPDRAWITEMSTRUCT lpDIS, BOOL bSelected)
  164. {
  165.     if (GetCurSel() == CB_ERR || GetCount() == 0) 
  166.         return; // no item selected
  167.     
  168.     CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  169.  
  170.     HICON hIcon = (HICON)lpDIS->itemData;
  171.     ASSERT(hIcon != NULL);
  172.  
  173.     int x = lpDIS->rcItem.left + ((lpDIS->rcItem.right - lpDIS->rcItem.left) / 2) - (m_sizeIcon.cx / 2);
  174.     int y = lpDIS->rcItem.top + ((lpDIS->rcItem.bottom - lpDIS->rcItem.top) / 2) - (m_sizeIcon.cy / 2);
  175.     
  176.     pDC->DrawIcon(x, y, hIcon);
  177. }               
  178.  
  179.