|
|
1.1 ! root 1: // custlist.cpp : custom listbox ! 2: // ! 3: // This is a part of the Microsoft Foundation Classes C++ library. ! 4: // Copyright (C) 1992 Microsoft Corporation ! 5: // All rights reserved. ! 6: // ! 7: // This source code is only intended as a supplement to the ! 8: // Microsoft Foundation Classes Reference and Microsoft ! 9: // QuickHelp documentation provided with the library. ! 10: // See these sources for detailed information regarding the ! 11: // Microsoft Foundation Classes product. ! 12: ! 13: #include "ctrltest.h" ! 14: ! 15: ///////////////////////////////////////////////////////////////////////////// ! 16: // Custom Listbox - containing colors ! 17: ! 18: class CColorListBox : public CListBox ! 19: { ! 20: public: ! 21: // Operations ! 22: void AddColorItem(COLORREF color); ! 23: ! 24: // Implementation ! 25: virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS); ! 26: virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); ! 27: virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCIS); ! 28: }; ! 29: ! 30: void CColorListBox::AddColorItem(COLORREF color) ! 31: { ! 32: // add a listbox item ! 33: AddString((LPCSTR) color); ! 34: // Listbox does not have the LBS_HASSTRINGS style, so the ! 35: // normal listbox string is used to store an RGB color ! 36: } ! 37: ! 38: ///////////////////////////////////////////////////////////////////////////// ! 39: ! 40: #define COLOR_ITEM_HEIGHT 20 ! 41: ! 42: void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) ! 43: { ! 44: // all items are of fixed size ! 45: // must use LBS_OWNERDRAWVARIABLE for this to work ! 46: lpMIS->itemHeight = COLOR_ITEM_HEIGHT; ! 47: } ! 48: ! 49: void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) ! 50: { ! 51: CDC* pDC = CDC::FromHandle(lpDIS->hDC); ! 52: COLORREF cr = lpDIS->itemData; // RGB in item data ! 53: ! 54: if (lpDIS->itemAction & ODA_DRAWENTIRE) ! 55: { ! 56: // Paint the color item in the color requested ! 57: CBrush br(cr); ! 58: pDC->FillRect(&lpDIS->rcItem, &br); ! 59: } ! 60: ! 61: if ((lpDIS->itemState & ODS_SELECTED) && ! 62: (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) ! 63: { ! 64: // item has been selected - hilite frame ! 65: COLORREF crHilite = RGB(255-GetRValue(cr), ! 66: 255-GetGValue(cr), 255-GetBValue(cr)); ! 67: CBrush br(crHilite); ! 68: pDC->FrameRect(&lpDIS->rcItem, &br); ! 69: } ! 70: ! 71: if (!(lpDIS->itemState & ODS_SELECTED) && ! 72: (lpDIS->itemAction & ODA_SELECT)) ! 73: { ! 74: // Item has been de-selected -- remove frame ! 75: CBrush br(cr); ! 76: pDC->FrameRect(&lpDIS->rcItem, &br); ! 77: } ! 78: } ! 79: ! 80: int CColorListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS) ! 81: { ! 82: COLORREF cr1 = lpCIS->itemData1; ! 83: COLORREF cr2 = lpCIS->itemData2; ! 84: if (cr1 == cr2) ! 85: return 0; // exact match ! 86: ! 87: // first do an intensity sort, lower intensities go first ! 88: int intensity1 = GetRValue(cr1) + GetGValue(cr1) + GetBValue(cr1); ! 89: int intensity2 = GetRValue(cr2) + GetGValue(cr2) + GetBValue(cr2); ! 90: if (intensity1 < intensity2) ! 91: return -1; // lower intensity goes first ! 92: else if (intensity1 > intensity2) ! 93: return 1; // higher intensity goes second ! 94: ! 95: // if same intensity, sort by color (blues first, reds last) ! 96: if (GetBValue(cr1) > GetBValue(cr2)) ! 97: return -1; ! 98: else if (GetGValue(cr1) > GetGValue(cr2)) ! 99: return -1; ! 100: else if (GetRValue(cr1) > GetRValue(cr2)) ! 101: return -1; ! 102: else ! 103: return 1; ! 104: } ! 105: ! 106: ///////////////////////////////////////////////////////////////////////////// ! 107: // Dialog class ! 108: ! 109: class CCustListDlg : public CModalDialog ! 110: { ! 111: protected: ! 112: CColorListBox m_colors; ! 113: public: ! 114: CCustListDlg() ! 115: : CModalDialog(IDD_CUSTOM_LIST) ! 116: { } ! 117: ! 118: // access to controls is through inline helpers ! 119: BOOL OnInitDialog(); ! 120: void OnOK(); ! 121: DECLARE_MESSAGE_MAP(); ! 122: }; ! 123: ! 124: BEGIN_MESSAGE_MAP(CCustListDlg, CModalDialog) ! 125: ON_LBN_DBLCLK(IDC_LISTBOX1, OnOK) // double click for OK ! 126: END_MESSAGE_MAP() ! 127: ! 128: BOOL CCustListDlg::OnInitDialog() ! 129: { ! 130: // subclass the control ! 131: VERIFY(m_colors.SubclassDlgItem(IDC_LISTBOX1, this)); ! 132: ! 133: // add 8 colors to the listbox (primary + secondary color only) ! 134: for (int red = 0; red <= 255; red += 255) ! 135: for (int green = 0; green <= 255; green += 255) ! 136: for (int blue = 0; blue <= 255; blue += 255) ! 137: m_colors.AddColorItem(RGB(red, green, blue)); ! 138: ! 139: return TRUE; ! 140: } ! 141: ! 142: void CCustListDlg::OnOK() ! 143: { ! 144: // get the final color ! 145: int nIndex = m_colors.GetCurSel(); ! 146: if (nIndex == -1) ! 147: { ! 148: MessageBox("Please Select a Color"); ! 149: m_colors.SetFocus(); ! 150: return; ! 151: } ! 152: DWORD color = m_colors.GetItemData(nIndex); ! 153: ! 154: #ifdef _DEBUG ! 155: // normally do something with it... ! 156: TRACE("final color RGB = 0x%06lX\n", color); ! 157: #endif ! 158: ! 159: EndDialog(IDOK); ! 160: } ! 161: ! 162: ///////////////////////////////////////////////////////////////////////////// ! 163: // Run the test ! 164: ! 165: void CTestWindow::OnTestCustomList() ! 166: { ! 167: TRACE("running dialog with custom listbox (owner draw)\n"); ! 168: CCustListDlg dlg; ! 169: dlg.DoModal(); ! 170: } ! 171: ! 172: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.