15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Полностью настраиваемое окно свойств.


Автор Brett R. Mitchell.

Иногда возникает потребность в окошке свойств, которое можно было бы полностью настроить по своему вкусу. А так же, чтобы оно поддерживало редактируемые combo боксы и посылало сообщения, когда свойство было изменено. давайте рассмотрим пример подробнее ...

Нажмите на картинку,
чтобы увеличить её

Данный элемент управления наследован от CListBox, следственно доступны все функции CListbox. Так же доступны следующие функции для изменения вида окошка свойств:

void	SetFont(CFont* pFont);
void	SetBkColor(COLORREF crColor);
void	SetPropertyBkColor(COLORREF crColor);
void	SetHighlightColor(COLORREF crColor);
void	SetLineStyle(COLORREF crColor, int nStyle = PS_SOLID);
void	SetBoldSelection(BOOL bBoldSelection);
void	SetTextColor(COLORREF crColor);
void	SetTextHighlightColor(COLORREF crColor);
void	SetPropertyTextColor(COLORREF crColor);

Следующая группа функций обеспечивает способность добавлять к элементу управления различные дополнительные свойства. В данный момент поддерживаются Combo Боксы, текстовые поля, переключатели, поля выбора шрифта, поля выбора цвета и Статические(Static) поля.

BOOL	AddString(CString csText);

BOOL	AddString(CString csText, int nType, 
                CString csData, int nPropertySelected = 0, 
                int nAlignment = DT_LEFT, 
                BOOL bComboEditable = FALSE, 
                BOOL bComboSorted = FALSE);

BOOL	AddString(CString csText, COLORREF crColor, 
                int nAlignment = DT_LEFT);

BOOL	AddString(CString csText, CFont* pFont, 
                int nAlignment = DT_LEFT);

Единственно, что тут нуждается в объяснении - это вторая функция 'AddString'. Параметр 'nType' может быть как ID_PROPERTY_TEXT так и ID_PROPERTY_STATIC или ID_PROPERTY_BOOL или ID_PROPERTY_PATH или ID_PROPERTY_COMBO_LIST. Шрифт и Цвет используют другие две функции 'AddString'. Параметр 'csData' должен быть отформатирован символом разделителем '!'. (смотрите пример ниже). Другой параметр, который нуждается в объяснении - это 'nPropertySelected'. Он используется для установки выбранного пункта в combobox либо для установки bool значения в true или false. (смотрите пример ниже)

Чтобы получить данные из свойств, используются следующие функции.

bool	GetProperty(int nItem, CString* pText);	
bool	GetProperty(int nItem, bool* bValue);	
bool	GetProperty(int nItem, COLORREF* crColor);	   
bool	GetProperty(int nItem, LOGFONT*	LogFont);
bool	GetProperty(int nItem, CStringArray* pArray, 
                  int* SelectedItem = NULL);
bool	GetProperty(int nItem, int* SelectedItem, 
                  CString* csText = NULL);

И Заключительная возможность этого элемента управления - это возможность отправлять родительскому окну сообщение о том, что свойство было изменено. ID сообщения - ID_PROPERTY_CHANGED. Ловить такое сообщение в родительском окне нужно стандартной макро командой ON_MESSAGE. Первый параметр - это элемент, который был изменён. Второй - это тип изменённого элемента. (COMBO, TEXT, и т.д. ) Вот пример.

Объявляем сообщение, которое будем ловить в BEGIN_MESSAGE_MAP:

ON_MESSAGE(ID_PROPERTY_CHANGED, OnPropertyChanged)

 

Объявление функции:

LONG CParentClass::OnPropertyChanged(UINT wItemChanged, 
                                     LONG lPropertyType)

Объявление функции .h файле родительского класса:

afx_msg LONG OnPropertyChanged(UINT wItemChanged, LONG lPropertyType);

Далее следует пример, как создать интерфейс пользователя, добавить свойства и получить значения из элемента управления.

// Создаём шрифт Списка(list box)
m_pListBoxFont = new CFont();
m_pListBoxFont->CreateFont(14, 0, 0, 0, FW_NORMAL, 0, 0, 0,
                           ANSI_CHARSET, OUT_TT_PRECIS,
                           CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
                           VARIABLE_PITCH | FF_SWISS,
                           "arial");	
	
// Создаём шрифт Свойства(Property)
m_pPropertyFont = new CFont();
m_pPropertyFont->CreateFont(16, 0, 0, 0, FW_NORMAL, 0, 0, 0, 
                            ANSI_CHARSET, OUT_TT_PRECIS, 
                            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
                            VARIABLE_PITCH | FF_SWISS, "system");	
	
// Создаём элемент управления
m_pPropertyListCtrl = new CPropertyListCtrl();
m_pPropertyListCtrl->Create(WS_CHILD|WS_BORDER|WS_VISIBLE
                            |LBS_NOTIFY|WS_VSCROLL|WS_HSCROLL
                            |LBS_HASSTRINGS|LBS_OWNERDRAWFIXED, 
                            CRect(200,100,550,300), this, 
                            ID_PROPERTYLIST);
	
// Устанавливаем некоторые атрибуты(Completly Optional)
m_pPropertyListCtrl->SetFont(m_pListBoxFont);
m_pPropertyListCtrl->SetBkColor(RGB(214,227,239));
m_pPropertyListCtrl->SetTextColor(RGB(74,109,132));
m_pPropertyListCtrl->SetTextHighlightColor(RGB(80,80,80));
m_pPropertyListCtrl->SetHighlightColor(RGB(246,246,220));
m_pPropertyListCtrl->SetPropertyBkColor(RGB(255,255,255));
m_pPropertyListCtrl->SetPropertyTextColor(RGB(0,0,192));
m_pPropertyListCtrl->SetBoldSelection(TRUE);
m_pPropertyListCtrl->SetLineStyle(RGB(74,109,132), PS_SOLID);

// Добавляем свойства(Properties)
m_pPropertyListCtrl->AddString("Static Text",
                               ID_PROPERTY_STATIC,
                               "C:\\Windows", 0, DT_RIGHT);

m_pPropertyListCtrl->AddString("Text Property",
                               ID_PROPERTY_TEXT,
                               "This is some text", 0, DT_RIGHT);

m_pPropertyListCtrl->AddString("Toggle Property",
                               ID_PROPERTY_BOOL,
                               "True!False", 0, DT_RIGHT);

m_pPropertyListCtrl->AddString("Color Property",
                               RGB(57,
                               09,165), DT_RIGHT);

m_pPropertyListCtrl->AddString("Font Property",
                               m_pPropertyFont,
                               DT_RIGHT);

m_pPropertyListCtrl->AddString("File Property",
                               ID_PROPERTY_PATH,
                               "D:\\Code\\C++\\32bit\\"
                               "Programs\\Blackjack\\Images"
                               "\\Dealer.bmp!Bitmap Files "
                               "(*.BMP)|*.bmp|All Files (*.*)"
                               "|*.*|", 0, DT_RIGHT);

m_pPropertyListCtrl->AddString("Combobox Property",
                               ID_PROPERTY_COMBO_LIST,
                               "Porsche!BMW!Mercedes!Lotus!Ford!"
                               "Chevy!Kia!Dodge!Nissan!Toyota", 
                               2, DT_RIGHT, TRUE, TRUE);


// Получаем Свойства(Properties)
CString csText;
m_pPropertyListCtrl->GetProperty(0, &csText);	

// Переключатель
bool bValue;
m_pPropertyListCtrl->GetProperty(1, &bValue);
	
// Цвет
COLORREF crColor;
m_pPropertyListCtrl->GetProperty(2, &crColor);

// Шрифт
LOGFONT lf;
m_pPropertyListCtrl->GetProperty(3, &lf);

// Combo Box
CStringArray Items;
m_pPropertyListCtrl->GetProperty(5, &Items);

// Combo Box (получаем индекс выбранного пункта и текст)
int nSelectedItem;
m_pPropertyListCtrl->GetProperty(5, &nSelectedItem, &csText);

Downloads

Скачать исходник - 9 Kb
Скачать демонстрационный пример - 26 Kb