Полностью настраиваемое окно свойств.Автор 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
|