Annotation of mstools/mfc/samples/ctrltest/custlist.cpp, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.