Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Инициализация данных в списке




Инициализация данных диалогового окна выполняется в методе OnInitDialog() — найдите его в программе (это длинный метод, поэтому для краткости мы опускаем большую часть его кода):

BOOL CListsDIg::OnInitDialog()

{

CDialog:: OnInitDialog();

}

ПРИМЕЧАНИЕ: Мы выполняем инициализацию в методе OnInitDialog(), а не в конструкторе, поскольку к моменту вызова OnInitDialog() все управляющие элементы и само диалоговое окно будут созданы и готовы к использованию.

В методе OnInitDialog() мы должны заполнить список строками, чтобы к моменту отображения диалогового окна он содержал необходимую информацию. Мы занесем в список 12 строк с именами Строка 1, Строка 2 и т. д. и воспользуемся для этого методом AddString() объекта m_list:

BOOL CListsDIg::OnInitDialog() {

CDialog::OnInitDialog();

m_list.AddString("Строка 01");

m_list.Add8tring("Строка 02");

m_list.AddString("Строка 03");

m„list.AddString("Строка 04");

m_list.AddSt ring("Строка 05");

m_list.AddString("Строка 06");

m_list.AddString("Строка 07");

m_list.AddSt rihg("Строка 08");

m_list.AddString("Строка 09"):

m_list.AddString("Строка 10");

m_list.AddString("Строка 11");

m_list.Add8tring("Строка 12");

// Добавить команду "About..." в системное меню.

}

Возможно, у вас возникнет вопрос — почему мы используем запись "Строка 01" а не "Строка 1"? Дело в том, что строки списка должны выводиться по возрастанию от 1 до 12, а по умолчанию содержимое списка сортируется алфавитной порядке. Следовательно, если бы во вторую строку был занесен текст "Строка 1", то "Строка 12" оказалась бы в списке перед ней.       

ПОДСКАЗКА: Если вы не хотите сортировать содержимое списка, щелкните список правой кнопкой мыши в редакторе диалоговых окон, выберите из контекстного меню команду Properties, перейдите на вкладку Styles в открывшемся окне и снимите флажок Sort.

Заносимые в список строки автоматически нумеруются, и в дальнейшем к ним можно обращаться по значению индекса. Первая строка списка имеет индекс 0, вторая — 1 и т. д. Когда мы в своей программе запрашиваем у объекта списка выбранную пользователем строку, он возвращает индекс этой строки.

ПОДСКАЗКА: Помимо текста, содержащегося в каждой строке списка, вы можете связать с ней дополнительную 32-разрядную величину - воспользуйтесь методом SetItemData(). Например, со строками можно связать пути и имена файлов, входящих в список. Для получения этих данных применяется метод GetItemData().

Инициализация завершена. Если сейчас запустить программу в списке появятся все строки. Но как определить, какую из них выбрал двойным щелчком пользователь?

Обработка двойных щелчков в списках

Когда пользователь дважды щелкает в списке, мы хотим занести текст выбранной им строки в текстовое поле. Начнем с создания переменной m_text для работы с содержимым списка. В эту переменную будет занесен текст выбранной строки списка.

Затем необходимо определить момент, когда пользователь дважды щелкнет внутри списка, и тут на помощь приходит ClassWizard. Откройте его, выберите идентификатор IDC_LIST1 и дважды щелкните на строке сообщения LBN_DBLCLICK в списке Messages. Это сообщение посылается программе от списка, когда пользователь дважды щелкает на одной из его строк. Префикс LBN означает "List Box Notification", то есть "оповещение от списка"; это семейство состоит из сообщений LBN_DBLCLICK, LBN_ERRSPACE, LBN_KILLFOCUS, LBN_SELCANCEL, LBN_SELCHANGE и LBN_SETFOCUS. ClassWizard предлагает присвоить новому обработчику имя OnDblclkList1(). Подтвердите предложенное имя, нажав кнопку ОК.

ClassWizard создает метод OnDblclklist1():

void CListsDlg::OnDblclkList1()

 {

// TODO: добавьте код для обработки оповещений от элемента

}

Он будет вызываться, когда пользователь дважды щелкнет на строке списка. Но как выяснить, о какой именно строке идет речь?

Определение выбранной строки

Для определения текущего выбранного пункта мы воспользуемся методом GetCurSel() класса CListBox. Он возвращает индекс строки, на которой пользователь дважды щелкнул левой кнопкой мыши. Как получить фактическое содержимое этой строки в списке (скажем, "Строка 02")? При помощи метода GetText() класса CListBox, который заполняет переданный ему объект текстом нужной строки:

void CListsDlg::OnDblclkList1()

{

         m_list.GetText(m_list.GetCurSel(), m_text);

}

Текст заносится в переменную m_text. Осталось лишь вызвать метод UpdateData() для того, чтобы обновить m_text на экране:

void CListsDlg::OnDblclklist1()

{

m_list.GetText(m_list.GetCurSel(). m_text);

        UpdateData(false);

}

Запустите программу и дважды щелкните на одном из пунктов списка. Программа сообщает о выборе строки, отображая ее содержимое в текстовом поле. Умение работать со списками заметно увеличивает наш арсенал средств VisualC++.

Мы научились работать со списками; пора переходить к новому типу управляющих элементов — комбинированным полям.

Работа с комбинированными полями

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

Когда пользователь щелкает на стрелке рядом с комбинированным полем, в диалоговом окне раскрывается список.

Когда пользователь выбирает одну из строк списка, мы выводим ее в текстовом поле.

Создайте в AppWizard программу combos на базе диалогового окна. Все готово к заполнению комбинированного поля данными.   










Последнее изменение этой страницы: 2018-04-12; просмотров: 336.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...