У человечества есть странная привычка группировать информацию, относящуюся к одной отрасли. Например, друзья, которые должны вам N-ую сумму в долларах образуют список должников. Их великие имена и ничтожные обязательства можно сохранять в разных местах ( начиная от клочков туалетной бумаги и заканчивая сейфом швейцарского банка ). Однако, гораздо удобнее сформировать список смертников, предназначенных для отстрела. Для этого сейчас на ваш суд будет представлен класс для работы со списками! Его название - CListBox.
Генеалогическое дерево CListBox:
Как и многие другие классы этот образец наследуется от CWnd. Это вполне очевидно, так как элемент управления также является окном.
Типичный пример использования списка:
Знакомая картина не правда ли? Class Wizard собственной персоной! Списком здесь являются окна Object IDs, Messages, Member functions. Также здесь представлена ещё одна форма списка - выпадающий список ( Project, Class name ). За эту разновидность отвечает класс - CComboBox, но о нем позже.
Настройки дизайна для списка:
Внешний вид вкладки Styles для списка:
С помощью выпадающего списка Selection вы можете выбрать стиль выборки элементов. В нем есть следующие возможные значения:
Single ( стоит по умолчанию ): Пользователь может выбирать только один элемент списка за один раз.
Multiple: Пользователь может выбирать более одного элемента списка за раз. Для этого могут использоваться кнопки SHIFT и CTRL в сочетании с мышью.
Extended: Имеет те же возможности, что и Multiple. Дополнением является возможность множественной выборки путем перетаскивания мышки от одного элемента к другому.
None: Пользователи не могут выбирать элементы списка.
Список Owner draw определяет, кто будет рисовать список. Возможные значения:
No ( по умолчанию ): Windows сама нарисует список.
Fixed: Приложение ответственно за отрисовку списка и его элементов. Все элементы должны быть одинаковой высоты.
Variable: Приложение ответственно за отрисовку списка и его элементов. Элементы могут быть разной высоты.
Свойство Has strings становится доступным для списков со стилями Fixed или Variable. Выбор данного свойства определяет, что элементами будут строки.
Свойство Border отвечает за рамку вокруг списка.
Свойство Sort - сортировка списка в алфавитном порядке.
Свойство Notify - уведомляет родительское окно в том случае, если был произведен одинарный или двойной щелчок по списку.
Свойство Multi-column - многостолбцовый список с прокруткой по горизонтали.
Свойство No redraw - Список не будет перерисован при каких-либо изменениях.
Свойство Use tabstops - список будет воспринимать табуляцию при рисовании строк, как управляющий символ.
Свойство Want key input - Родительское окно, к которому принадлежит список будет получать сообщение WM_VKEYTOITEM или WM_CHARTOITEM , каждый раз, когда пользователь будет нажимать клавишу ( при этом список должен иметь фокус ). Если выставлен стиль Has Strings, то тогда это будет WM_VKEYTOITEM, иначе WM_CHARTOITEM.
Свойство Disable no scroll - показывает недоступную вертикальную полосу прокрутки, когда в списке не хватает элементов для прокручивания.
Свойство No integral height - указывает, что размер списка такой, какой был определен приложением при создании списка.
Примечание:
Программисты список обычно называют лист-боксом.
Со стилями разобрались! Давайте промоём косточки класса CListBox.
Функции-члены класса CListBox:
Конструктор:
CListBox( ); Конструктор класса CListBox.
Инициализация:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); Создаёт список и присоединяет его к обьекту класса CListBox. Возвращаемое значение не равно нулю, если все прошло нормально, и ноль, если наоборот. dwStyle - определяет стиль списка. Может быть комбинацией следующих стилей: LBS_EXTENDEDSEL - пользователь может выбирать несколько элементов списка используя SHIFT и мышку или специальную комбинацию клавиш. LBS_HASSTRINGS - пределяет, что элементами списка будут строки. LBS_MULTICOLUMN - многостолбцовый список с прокруткой по горизонтали. LBS_MULTIPLESEL - элементы списка ( строки ) переключаются между состоянием выбрано/не выбрано при одинарном или двойном щелчке по элементу. LBS_NOINTEGRALHEIGHT - указывает, что размер списка такой, какой был определен приложением при создании списка. LBS_NOREDRAW - Список не будет перерисован при каких-либо изменениях. Этот стиль можно изменить в любой момент, послав сообщение WM_SETREDRAW. LBS_NOTIFY - уведомляет родительское окно в том случае, если был произведен одинарный или двойной щелчок по списку. LBS_OWNERDRAWFIXED - Приложение ответственно за отрисовку списка и его элементов. Все элементы должны быть одинаковой высоты. LBS_OWNERDRAWVARIABLE - Приложение ответственно за отрисовку списка и его элементов. Элементы могут быть разной высоты. LBS_SORT - сортировка списка в алфавитном порядке. LBS_STANDARD - сортировка списка в алфавитном порядке, родительское окно получает сообщение при одинарном и двойном щелчке. Вокруг списка рамка. LBS_USETABSTOPS - список будет воспринимать табуляцию при рисовании строк, как управляющий символ. LBS_WANTKEYBOARDINPUT - Родительское окно, к которому принадлежит список будет получать сообщение WM_VKEYTOITEM или WM_CHARTOITEM , каждый раз, когда пользователь будет нажимать клавишу ( при этом список должен иметь фокус ). Если выставлен стиль Has Strings то тогда это будет WM_VKEYTOITEM, иначе WM_CHARTOITEM. LBS_DISABLENOSCROLL - показывает недоступную вертикальную полосу прокрутки, когда в списке не хватает элементов для прокручивания. rect - размер и позиция списка. pParentWnd - указатель на родительское окно. Не должен быть равен NULL. nID - идентификатор списка.
int InitStorage( int nItems, UINT nBytes ); Выделяет память для хранения элементов списка. Если всё нормально, то из функции возвращается максимальное количество элементов, которое может содержать список до того момента, как понадобится больше памяти для хранения, иначе LB_ERRSPACE ( в случае возникновения ошибки ). nItems - количество элементов nBytes - сумма в байтах, для хранения строк списка.
Общие операции:
int GetCount( ) const; Возвращает количество элементов в списке. Индексация в списке начинается с нуля, как в обычном массиве. Если произошла ошибка, то вернется LB_ERR.
int GetHorizontalExtent( ) const; Предназначена для определения ширины списка, на которую он может быть прокручен, в пикселах. Возвращаемое значение - ширина. Применяется только для списков с горизонтальной полосой прокрутки.
void SetHorizontalExtent( int cxExtent ); Устанавливает ширину ( в пикселах ), на которую список может быть прокручен по горизонтали. cxExtent - ширина для прокрутки.
int GetTopIndex( ) const; Определяет индекс первого видимого элемента в списке. Возвращается индекс первого видимого элемента в списке, при наличии ошибки LB_ERR.
int SetTopIndex( int nIndex ); Делает строку, указанную в параметре nIndex, первой видимой в списке. Возвращаемое значение равно 0, если всё нормально, иначе LB_ERR. nIndex - индекс, того элемента, который необходимо сделать первым видимым.
DWORD GetItemData( int nIndex ) const; Получает значение, связанное с элементом списка. Возвращаемое значение равно значению, связанному с элементом списка. nIndex - индекс элемента.
int SetItemData( int nIndex, DWORD dwItemData ); Устанавливает элементу списка значение, которое будет связано с ним. Вовращается LB_ERR, если произошла ошибка. nIndex - индекс элемента. dwItemData - значение.
int GetItemRect( int nIndex, LPRECT lpRect ) const; Получает размеры прямоугольника, охватывающего элемент списка. Вовращается LB_ERR, если произошла ошибка. nIndex - индекс элемента. lpRect - указатель на структуру RECT, куда будут записываться размеры.
UINT ItemFromPoint( CPoint pt, BOOL& bOutside ) const; Данная функция используется для того, чтобы получить номер элемента списка, ближайщего к данной точке. Возвращаемое значение равно индексу самого близкого элемента к точке с координатами в pt. pt - координаты точки. bOutside - переменная, в которую могут быть записаны следующие значения : TRUE - если точка находится вне клиентской части списка, иначе FALSE.
int SetItemHeight( int nIndex, UINT cyItemHeight ); Устанавливает высоту элементов в списке. Вовращается LB_ERR, если индекс неправильный. nIndex - индекс элемента, если установлен стиль LBS_OWNERDRAWVARIABLE, иначе 0. cyItemHeight - новая высота в пикселах. Если стоит стиль LBS_OWNERDRAWVARIABLE, то будет меняться высота только одного элемента, если нет, то всех.
int GetItemHeight( int nIndex ) const; Возвращает высоту элементов списка в пикселах. Если установлен стиль LBS_OWNERDRAWVARIABLE, то будет измерена высота лишь для элемента с индексом равным nIndex. nIndex - индекс элемента. Если установлен стиль LBS_OWNERDRAWVARIABLE, то вычисляется высота для элемента с индексом nIndex. В противном случае надо передать 0.
int GetSel( int nIndex ) const; Проверяет выбран элемент или нет. Возвращаемое значение положительно, если элемент выбран, 0 - если не выбран, LB_ERR - если произошла ошибка. nIndex - индекс элемента. Работает как для списков с одиночной выборкой, так и с множественной.
int GetText( int nIndex, LPTSTR lpszBuffer ) const; void GetText( int nIndex, CString& rString ) const; Получает строку из списка. Возвращаемое значение равно длине строки в байтах, исключая символ конца строки. nIndex - индекс элемента. lpszBuffer - указатель на массив, куда будет записана строка. rString - переменная, куда будет записана строка.
int GetTextLen( int nIndex ) const; Возвращает длину строки в байтах, исключая символ конца строки. nIndex - индекс элемента.
void SetColumnWidth( int cxWidth ); Устанавливает ширину в пикселах всех столбцов списка Используется для лист-боксов со стилем LBS_MULTICOLUMN. cxWidth - ширина в пикселах всех столбцов.
Операции для одиночной выборки:
int GetCurSel( ) const; Возвращает индекс, текущего выбранного элемента для списка с одиночной выборкой.
int SetCurSel( int nSelect ); Делает элемент списка выбранным. Вовращается LB_ERR, если произошла ошибка. nSelect - индекс элемента для выборки, если указан -1, то ни один элемент не будет выбранным. Только для списка с одиночной выборкой.
Операции для многострочной выборки:
int GetCaretIndex( ) const; Возвращает индекс элемента, который имеет фокус. Используется для списков с многоэлементной выборкой.
int SetCaretIndex( int nIndex, BOOL bScroll = TRUE ); Устанавливает фокус на элемент, указанный в параметре nIndex. Используется для списков с многоэлементной выборкой. Возвращается LB_ERR, если произошла ошибка. nIndex - индекс элемента bScroll - Если он равен 0, то происходит прокрутка до тех пор, пока элемент не становится полностью видимым. Если не 0, то происходит прокрутка до тех пор, пока хотя бы часть элемента не становится видимой.
int GetSelCount( ) const; Возвращает количество выбранных элементов в списке с многоэлементной выборкой. Если эта функция применяется к списку с одиночной выборкой, то возвращается значение LB_ERR.
int GetSelItems( int nMaxItems, LPINT rgIndex ) const; Заполняет буфер индексами выбранных элементов в списке с многоэлементной выборкой. Из функции возвращаетяс количество индексов, записанных в буфер. nMaxItems - определяет максимально возможное количество индексов, помещаемых в буфер. rgIndex - Указатель на буфер.
int SelItemRange( BOOL bSelect, int nFirstItem, int nLastItem ); Выбирает или отменяет выборку группы элементов в списке с многоэлементной выборкой. Вовращается LB_ERR, если произошла ошибка. bSelect - Определяет, что делать. Если он равен TRUE, то тогда происходит выборка, FALSE - наоборот. nFirstItem - индекс первого элемента. nLastItem - индекс последнего элемента.
void SetAnchorIndex( int nIndex ); Устанавливает якорь в списке с многоэлементной выборкой, с которого начнется расширенная выборка. nIndex - индекс элемента, который будет являться якорем.
int GetAnchorIndex( ) const; Возвращает индекс элемента, являющегося якорем. Если произошла ошибка, то возвращается LB_ERR.
Строковые операции:
int AddString( LPCTSTR lpszItem ); Добавляет строку в список. Если стиль LBS_SORT не стоит, то строка добавляется в конец списка, иначе строка вставляется и производится сортировка. Возвращаемое значение - индекс строки в списке. Если произошла ошибка, то возвращается LB_ERR. LB_ERRSPACE - возвращается в том случае, если не хватает места для размещения строки. lpszItem - указатель на строку.
int DeleteString( UINT nIndex ); Удаляет элемент из списка. Возвращаемое значение равно количеству оставшихся элементов или LB_ERR в случае ошибки. nIndex - индекс элемента.
int InsertString( int nIndex, LPCTSTR lpszItem ); Вставляет строку в список в позицию равную nIndex. Возвращаемое значение - индекс строки в списке. Если произошла ошибка, то возвращается LB_ERR. LB_ERRSPACE - возвращается в том случае, если не хватает места для размещения строки. nIndex - индекс элемента, если он равен -1, то строка вставляется в конец списка. lpszItem - указатель на строку.
void ResetContent( ); Очищает содержимое списка.
int Dir( UINT attr, LPCTSTR lpszWildCard ); Добавляет имена файлов из текущего каталога в список. Возвращаемое значение - индекс последнего элемента, вставленного в список. Если произошла ошибка, то возвращается LB_ERR. LB_ERRSPACE - возвращается в том случае, если не хватает места для размещения строки. attr - Определяет, какие файлы показывать. Может быть комбинацией значений, описанных для функции класса CFile GetStatus или комбинацией следующих значений: 0x0000 - Файлы для чтения/записи. 0x0001 - Файлы для чтения, но не для записи. 0x0002 - скрытый файл. 0x0004 - системный файл. 0x0010 - имя указанное в параметре lpszWildCard, определяет директорию. 0x0020 - архивный файл. 0x4000 - показать все диски, которые подходят под значение в lpszWildCard. 0x8000 - Если установлен этот флаг, то только файлы указанного типа будут показаны, иначе имена этих файлов будут добавлены к списку с обычными файлами.
lpszWildCard - маска для показа.Например (*.*). Например: m_list.Dir(0x0000,"*.cpp"); Покажет все файлы из текущей директории для чтения/записи с расширением cpp. m_list - переменная класса CListBox.
int FindString( int nStartAfter, LPCTSTR lpszItem ) const; Ищет строку в списке. Возвращает индекс совпадающего с lpszItem элемента или LB_ERR, если поиск неудачен. nStartAfter - индекс элемента, перед которым начнется поиск. После достижении конца списка поиск продолжится с его начала и до элемента nStartAfter. Для того чтобы поиск был с начала списка параметр nStartAfter должен быть равен -1. lpszItem - указатель на строку, содержащую префикс для поиска. Поиск регистронезависимый.
int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const; Ищет строку в списке ( строка проверяется на полное соответствие ). Возвращает индекс совпадающего с lpszItem элемента или LB_ERR если поиск неудачен. nStartAfter - индекс элемента, перед которым начнется поиск. После достижении конца списка поиск продолжится с его начала и до элемента nStartAfter. Для того чтобы поиск был с начала списка параметр nStartAfter должен быть равен -1. lpszItem - указатель на строку для поиска. Поиск регистронезависимый.
int SelectString( int nStartAfter, LPCTSTR lpszItem ); Ищет строку в списке. Механизм работы такой же, как и у FindString. Если строка находится, то производится её выборка. Применяется для списков с одиночной выборкой. Возвращает индекс совпадающего с lpszItem элемента или LB_ERR, если поиск неудачен. nStartAfter - индекс элемента, перед которым начнется поиск. После достижении конца списка поиск продолжится с его начала и до элемента nStartAfter. Для того чтобы поиск был с начала списка параметр nStartAfter должен быть равен -1. lpszItem - указатель на строку для поиска. Поиск регистронезависимый.