Полностью настраиваемое
окно свойств.
Автор 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);
Далее следует пример, как создать интерфейс
пользователя, добавить свойства и получить
значения из элемента управления.
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");
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);
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);
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);
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);
CStringArray Items;
m_pPropertyListCtrl->GetProperty(5, &Items);
int nSelectedItem;
m_pPropertyListCtrl->GetProperty(5, &nSelectedItem, &csText);
Downloads
Скачать исходник - 9 Kb
Скачать демонстрационный
пример - 26 Kb
|