07/10/2014
Настройка CAdUiListCtrl
Если мы пользуемся классом CAdUiListCtrl и хотим его настроить получше, мы можем использовать пользовательское рисование. Это делается точно так же, как и с любым другим элементом управления MFC. Хорошую статью о том, как это делать (на английском) для элемента управления CListCtrl вы найдете здесь.Дальше пример класса наследника CAdUiListCtrl с использованием пользовательского рисования для отрисовки цветов в диалоговом окне.
Код - C++: [Выделить]
- // MyListCtrl.h
- #pragma once
- class MyListCtrl : public CAdUiListCtrl
- {
- DECLARE_DYNAMIC(MyListCtrl)
- private :
- // Метод - помощник
- CString ColorNameFromIndex(int colorIndex);
- public :
- MyListCtrl();
- virtual ~MyListCtrl();
- protected :
- DECLARE_MESSAGE_MAP()
- // Пользовательское рисование
- afx_msg void OnCustomDraw
- ( NMHDR* pNMHDR, LRESULT* pResult );
- };
- // MyListCtrl.cpp : implementation file
- #include "stdafx.h"
- #include "MyListCtrl.h"
- IMPLEMENT_DYNAMIC(MyListCtrl, CAdUiListCtrl)
- MyListCtrl::MyListCtrl(){}
- MyListCtrl::~MyListCtrl(){}
- BEGIN_MESSAGE_MAP(MyListCtrl, CAdUiListCtrl)
- ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDraw)
- END_MESSAGE_MAP()
- // Для пользовательского рисования
- afx_msg void MyListCtrl::
- OnCustomDraw ( NMHDR* pNMHDR, LRESULT* pResult)
- {
- NMLVCUSTOMDRAW* pLVCD
- = reinterpret_cast <NMLVCUSTOMDRAW*>(pNMHDR);
- // Для начала установим стандартную обработку
- // если понадобится изменим ниже
- *pResult = CDRF_DODEFAULT;
- // Первым делом проверяем стадию рисования.
- // Если это стадия «перед отрисовкой»
- // тогда скажем Windows что нам нужны сообщения
- // для каждого элемента.
- if ( CDDS_PREPAINT
- == pLVCD->nmcd.dwDrawStage )
- {
- *pResult = CDRF_NOTIFYITEMDRAW;
- }
- else if ( CDDS_ITEMPREPAINT
- == pLVCD->nmcd.dwDrawStage )
- {
- *pResult = CDRF_NOTIFYPOSTPAINT;
- }
- else if ( CDDS_ITEMPOSTPAINT
- == pLVCD->nmcd.dwDrawStage )
- {
- LVITEM rItem;
- int nItem =
- static_cast <int >( pLVCD->nmcd.dwItemSpec);
- CDC* pDC = CDC::FromHandle ( pLVCD->nmcd.hdc);
- CRect rcIcon;
- // Для каждого индекса цвета получаем RGB элемента
- long acirgb, r,g,b;
- acirgb = acedGetRGB ( nItem );
- r = ( acirgb & 0xffL );
- g = ( acirgb & 0xff00L ) >> 8;
- b = acirgb >> 16;
- CBrush brush(RGB(r,g,b));
- CRect rcItem;
- GetSubItemRect(nItem, 1, rcItem);
- int w = rcItem.Width();
- int h = rcItem.Height();
- CRect clrBox((int )rcItem.left + 0.1 * h,
- (int )rcItem.top + 0.1 * h,
- (int )rcItem.left + 0.9 * h,
- (int )rcItem.top + 0.9 * h);
- CBrush* pOldBrush = pDC->SelectObject(&brush);
- // создаем и выбираем тонкий черный карандаш
- CPen penBlack;
- penBlack.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
- CPen* pOldPen = pDC->SelectObject(&penBlack);
- pDC->Rectangle(clrBox);
- pDC->TextOutW(clrBox.right + 0.1*h,
- (int )rcItem.top + 0.1 * h,
- ColorNameFromIndex(nItem));
- // восстанавливаем старый объект
- pDC->SelectObject(pOldBrush);
- pDC->SelectObject(pOldPen);
- *pResult = CDRF_DODEFAULT;
- }
- }
- // Метод - помощник
- CString MyListCtrl::ColorNameFromIndex
- (int colorIndex)
- {
- switch (colorIndex)
- {
- case 0:
- return _T("Black" );
- case 1:
- return _T("Red" );
- case 2:
- return _T("Yellow" );
- case 3:
- return _T("Green" );
- case 4:
- return _T("Cyan" );
- default :
- {
- CString str;
- str.Format(_T("%d" ), colorIndex);
- return str;
- }
- }
- }
Чтобы использовать этот элемент управления в диалоге, вставьте элемент управления MFC List control и добавьте переменную-член для него. Замените CListCtrl на класс пользовательского элемента управления. Вот образец кода:
Код - C++: [Выделить]
- // SampleDlg.h
- // Переменная для элемента управления
- MyListCtrl mMyList;
- // SampleDlg.cpp
- BOOL SampleDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Вставим две колонки
- mMyList.InsertColumn(
- 0,
- _T("Layer Name" ),
- LVCFMT_LEFT, 90);
- mMyList.InsertColumn(
- 1,
- _T("Color" )
- , LVCFMT_LEFT, 90);
- // Содержимое колонки 1 будем настраивать
- // во время работы, так что
- // пока оставим ее пустой
- int nIndex =
- mMyList.InsertItem(0, _T("Layer 0" ));
- mMyList.SetItemText(nIndex, 1, _T(" " ));
- nIndex
- = mMyList.InsertItem(1, _T("Layer 1" ));
- mMyList.SetItemText(nIndex, 1, _T(" " ));
- nIndex
- = mMyList.InsertItem(2, _T("Layer 2" ));
- mMyList.SetItemText(nIndex, 1, _T(" " ));
- nIndex
- = mMyList.InsertItem(3, _T("Layer 3" ));
- mMyList.SetItemText(nIndex, 1, _T(" " ));
- nIndex
- = mMyList.InsertItem(4, _T("Layer 4" ));
- mMyList.SetItemText(nIndex, 1, _T(" " ));
- return TRUE;
- }
А вот как это будет выглядеть:
Источник: http://adndevblog.typepad.com/autocad/2014/09/customizing-caduilistctrl.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=1000
Опубликовано 07.10.2014Отредактировано 07.10.2014 в 01:48:18