69277

Клас Cedit. Клас CListBox

Лекция

Информатика, кибернетика и программирование

Елемент управління поле введення (edit control), що інкапсулюється класом CEdit, є прямокутне дочірнє вікно, в якому користувач може вводити дані. Як правило, це найбільший елемент управління в додатку. Змінюючи стилі цього елементу управління, можна отримати все, що завгодно...

Украинкский

2014-10-02

54.5 KB

0 чел.

Лекця № 19

Тема: Клас Cedit. Клас CListBox

План

  1.  Застосування класу CEdit
  2.  Застосування DDX для передачі даних
  3.  Застосування класу CListBox
  4.  Додавання і видалення елементів
  5.  Пошук і вибір елементів

Застосування класу CEdit

Елемент управління поле введення (edit control), що інкапсулюється класом CEdit, є прямокутне дочірнє вікно, в якому користувач може вводити дані. Як правило, це найбільший елемент управління в додатку. Змінюючи стилі цього елементу управління, можна отримати все, що завгодно, від простого поля введення з одним рядком тексту до багаторядкового вікна редагування (MLE — multiline edit) і поля введення пароля, вміст якого відображається зірочками, а не реально введеними даними. При кожному натисненні користувачем клавіші поле введення посилає повідомляюче повідомлення свого батьківського вікна перш, ніж введений символ буде відображений на екрані. Це дозволяє легко створювати різноманітні обробники, що фільтрують введення символів. Таким чином, основна увага цього розділу приділена опису способів маніпулювання цим багатоликим елементом управління.

У елементі управління класу CEdit можна розмістити не більше 60 Кбайт тексту. Це дозволяє використовувати елемент управління CEdit для введення лише невеликих об'ємів тексту, але якщо необхідно маніпулювати об'ємом тексту понад 60 Кбайт, можна скористатися класом CRichEditCtrl.

Застосування DDX для передачі даних

У розділі "Прімененіє DDX і шаблону елементу управління діалогового вікна" описувалося застосування DDX для організації взаємодії між класами елементу управління і самими елементами управління. Там же побіжно згадувалося про те, що DDX застосовується для передачі даних між елементами управління і змінними-членами класу елементу управління. Оскільки полем введення є перший елемент управління в цьому розділі, який допускає введення даних користувачем, — це якнайкраще місце, щоб почати вивчення даного аспекту застосування DDX.

Розмістивши елементи управління в шаблоні діалогового вікна, клацніть правою кнопкою миші на полі введення Те (Кому) і в контекстному меню, що з'явилося, виберіть пункт Add Variable (Додати змінну). Це приведе до виклику майстра Add Member Variable Wizard, робота якого демонструвалася вже не раз. В першу чергу необхідно скинути прапорець Control variable (Змінна, що управляє), оскільки він використовується для створення керівників змінних DDX (DDX control variable), а тут необхідно створити змінну значення DDX (DDX value variable). Скинувши цей прапорець, можна відмітити, що список доступних типів змінної став набагато більший. Прокрутивши список, можна побачити безліч різних типів змінних-членів, які можуть бути призначені елементу управління. У версії Visual Studio, використаній автором, тип CString не був передбачений в цьому списку, тому його доводилося просто указувати уручну: CString. Потім необхідно ввести ім'я змінної, m_strTo, і клацнути на кнопці Finish (Готово).

Тепер давайте розглянемо, що було зроблене від імені розробника. Відкрийте файл заголовка editdlg.h і відшукайте визначення змінної-члена m__strTo. Як можна відмітити, ця змінна-член була визначена як відкрита (public):

public: CString m_strTo;

Потім відкрийте файл реалізації editdlg.cрр і знайдіть конструктор CEditDlg. Тут ця змінна-член ініціалізувалася в списку ініціалізатора (initializer list) класу:

CEditDlg::CEclitDlg (CWnd* pParent/*=NULL*/):CDialog(CEditDlg::IDD

 pParent),  m strTo(L"")

{

}

Поки нічого нового, але скоро все зміниться. Знайдіть функцію DoDataExchange. Нагадуємо, що це головна функція DDX, яку викликає функція UpdateData, яку, у свою чергу, викликають як при ініціалізації діалогового вікна, так і в обробнику події ОПОК. Отже, розглянемо функцію DoDataExchange, а також функцію UpdateData, оскільки вона теж має відношення до застосування змінних значень DDX.

Звернете увагу на реалізацію функції DoDataExchange. Тепер замість функції DDX_Control, що застосовувалася раніше в цьому розділі, здійснюється звернення до функції DDX_Text:

void CEditDlg::DoDataExchange(CDataExchange*  pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX,  IDC EDIT1,  m strTo);

}

 

Після вивчення цієї функції, очевидно, стане трохи зрозуміліше, як здійснюється обмін даними між елементами управління і змінними-членами класу. До речі, функція DDX_Text має 37 переобтяжених версій реалізації! Таку кількість переобтяжених версій функції дозволяють використовувати змінні практично всіх основних типів даних, включаючи byte, short, int і CString. Можна навіть використовувати такі типи змінних, як COleCurrency і COleDataTime.

Прослідкувавши виклики усередині функції DDX_Text, можна відмітити, що після звернення до функції PrepareEditCtrl перевіряється вміст змінної m_bSaveAndValidate Якщо вона містить значення TRUE, то функція отримує текст з елементу управління (за допомогою звернення до функції SDK. Win32 GetWindowText) і привласнює його вказаній змінній. Якщо змінна m_bSaveAndValidate містить значення FALSE, то здійснюється прямо протилежна дія: елемент управління оновлюється значенням, що міститься у вказаній змінній.

У початковому коді MFC замість звернення до функції Win32::SetWindowText нерідко можна побачити звернення до функції AfxSetWindowText. Річ у тому, що перед привласненням значення допоміжна функція AfxSetWindowText перевіряє, чи не співпадає вміст зпемента управління із значенням змінної. Збіг обох значень означає, що ніяких змін не відбулося, тому функція завершує роботу, не роблячи нічого. Отже, ця недокументована функція MFC є вельми корисним засобом.

void AFXAPI  DDX_Text(CDataExchange*  pDX, int nIDC, CStringi value)

{

HWND hWndCtrl  = pDX->PrepareEditCtrl (nIDC) ;

if (pDX->m_bSaveAndValidate) {

int  nLen = ::GetWindowTextLength(hWndCtrl);

::GetWindowText(hWndCtrl,value.GetBufferSetLength(nLen),nLen+1);

value.ReleaseBuffer ();

}

else { AfxSetWindowText(hWndCtrl,  value); }

}

Виникає резонне питання; "Де встановлюється значення змінної CDataExchange: m_bSaveAndValidate?" У функції UpdateData. Функції UpdateData передають один параметр, bSaveAndValidate, який і визначає напрям переміщення даних: з члена класу в елемент управління (bSaveAndValidate = FALSE) або навпаки, з елементу управління в член класу (bSaveAndValidate = TRUE).

Вивчивши роботу цього механізму, область застосування змінних значення DDX можна описати таким чином.

- Існують дві можливості ініціалізації значень діалогового вікна, перш ніж воно буде відображено на екрані. Значення можна встановити перед зверненням до функції OnlnitDialog базового класу, а можна, привласнивши значення змінним, викликати уручну функцію UpdateData (FALSE).

- Щоб доручати поточні значення елементів управління діалогового вікна і розмістити їх в змінних-членах класу діалогового вікна, досить викликати функцію UpdateData(TRUE).

- Обробник події CDialog: :OnOK викликає функцію UpdateData (TRUE). Отже, якщо для виходу і завершення роботи діалогового вікна здійснюється виклик функції ОПОК, то та функція, яка викликала функцію діалогового вікна DoModal, отримає всі поточні дані діалогового вікна в коректному вигляді.

 

Застосування класу CListBox

Елемент управління звичайний список (list box control), що інкапсулюється класом CListBox, застосовується для відображення набору рядків, званих його елементами (item) або пунктами. Звичайні списки застосовуються для відображення одноманітно організованої інформації, такий, наприклад, як список штатів або поштових індексів. Фактично, звичайний список може відображати щось, що може бути представлене у вигляді рядків. Звернете увагу, не дивлячись на те, що цілком можливо створити клієнтський елемент управління список (owner-drawn list box control), який здатний містити декілька столбцов3, зазвичай він використовується для відображення тільки одного стовпця елементів. У тих ситуаціях, коли необхідно відображати інформацію в декількох стовпцях, значно простіше скористатися елементом управління список (list view control), описаним в розділі 7, "Елементи управління деревовидне уявлення і список".

Щоб продемонструвати застосування звичайного списку на практиці, додамо в діалогове вікно проекту ControlsDcmo елемент управління звичайний список з ідентифікатором IDD_LISTBOX. Визначите для цього шаблону клас, похідний від CDialog, на ім'я CListBoxDlg. Додайте в ресурс головного меню (у меню Controls) новий пункт меню, а також додайте обробник події вибору цього пункту, який відобразить діалогове вікно CListBoxDlg, як і у всіх попередніх випадках.

Використовуючи той же самий підхід, що і при описі поля введення, розглянемо спочатку елементарні завдання, зв'язані із застосуванням елементу управління звичайний список, а потім перейдемо до демонстраційного додатку Controls Demo.

Додавання і видалення елементів

Найзвичайнішими діями, які доводиться здійснювати при роботі із звичайним списком, є додавання і вставка елементів. Для цього клас CListBox володіє Двома функціями-членами: AddString і InsertString.

Функції AddString передають покажчик на рядок, який необхідно додати в звичайний список. Якщо сортування не передбачене (стиль LBS_SORT або властивість Sort}, 0 рядок буде доданий в кінець списку, інакше буде викликана підпрограма сортування рядків. Повертане в результаті виконання функції значення відповідає позиції (індексу) розташування нового елементу в списку починаючи з нуля. int  CListBox::AddString(LPCTSTR value);

Функції InsertString передають два параметри. Перший з них є індексом (починаючи з нуля) рядка, що додається, в списку. Другий параметр — це покажчик на рядок, значення якого і буде додано. Звернете увагу, оскільки функція InsertString додає рядок у вказану позицію, вона перевизначає стиль сортування, тому підпрограма сортування рядків в цьому випадку не викликається. Подібно до функції AddString, функція InsertString повертає значення, відповідне індексу нового рядка в списку.

int CListBox::InsertString(int  index,  LPCTSTR value);

Незалежно від того, як саме рядки були вставлені список, віддаляються вони по одній за допомогою функції CListBox::DeleteString, якою як єдиний аргумент передають індекс елементу, підмета видаленню. Повертає ця функція кількість елементів, що залишилися в списку після видалення.

Щоб видалити із звичайного списку всі елементи відразу, можна скористатися функцією CListBox::ResetContent

Майже всі функції-члени класу CListBox при відмові повертають значення LB_ERR. Тому, після спроби зміни вмісту елементу управління звичайний список має сенс завжди перевіряти це значення.

Пошук і вибір елементів

Клас CListBox володіє набором функцій, що дозволяють як отримувати інформацію про пункт, вибраний в списку в даний момент, так і управляти поточним вибором. У простих списків, де для вибору доступний тільки один пункт, використовується функція GetCurSel, що повертає індекс (починаючи з нуля) елементу, вибраного в даний момент. Якщо в списку не вибрано нічого, то функція GetCurSel повертає значення LB_ERR.

І навпаки, щоб встановити виділення пункту звичайного списку, застосовується функція SetCurSel, якою передають індекс елементу, підмета вибору. Для скидання всіх виділених пунктів списку функції SetCurSel передають значення -1.

Поточний вибір можна встановити на підставі самого рядка за допомогою функції SelectString.

int SelectString( int nStartAfter, LPCTSTR lpszltem);

Як можна відмітити, функції SelectString передають два аргументи. Перший з них, nStartAfter, указує індекс елементу, з якого необхідно починати пошук. Для пошуку за всім списком слід вказати значення -1. Другий аргумент, lpszltem, містить підрядок, з яким повинен починатися текст тих, що підлягають вибору елементів. Виходячи з умов, представлених на мал. 10.13, результатом виклику приведеного нижче рядка коди буде вибір елементу Jean Vaijean (Жан Вальжан), оскільки це перший рядок, починаючи з третього елементу (не забувайте, значення nStartAfter починається з нуля), на початку якої знаходиться підрядок "J".

m_lbx.SelectString(2,"J") ;

 

Для пошуку рядка в списку, але без зміни поточного вибору, використовується функція FindString або FindStringExact. Функція FindString здійснює пошук подібно до функції SelectString, по початкових значеннях рядків, а функція FindStringExact шукає точний збіг з вказаним текстом. Обидві функції повертають індекс знайденого елементу або значення LB_ERR, якщо жодного відповідного елементу не знайдено.

Із списками, що допускають вибір декількох елементів, працюють трохи по-іншому. Для вибору одного елементу можна скористатися функцією SetSel, а для вибору діапазону пунктів — функцією SelltemRange. Для створення складніших комбінацій виділення ці функції можуть бути об'єднані:

m_ListBoxl.SetSel(5);

m_ListBoxl.SelltemRange{TRUE,7,12) ;

m_ListBoxl.SelltemRange(FALSE,1,4);

Цей код вибирає п'ятий елемент і елементи з сьомого по дванадцятий, а потім відміняє вибір елементів з першого по четвертий.


 

А также другие работы, которые могут Вас заинтересовать

32662. Окружающая среда проекта 28 KB
  Окружающая среда проекта. Окружение проекта Каждый проект нужно рассматривать а также управлять им учитывая окружение в котором он существует. Окружающая среда проекта это совокупность внешних и внутренних в отношении проекта факторов влияющих на достижение результатов проекта. В данном разделе необходимо проанализировать факторы ближнего и дальнего окружения проекта которые могут оказать влияние на реализацию проекта.
32663. Базовые и интегрирующие функции управления проектом 24 KB
  Базовые функции управление предметной областью проекта содержательная сущность; управление качеством требования к результатам стандарты; управлением временными ресурсами бюджет времени; управление стоимостью финансовый и материальный бюджет. Интегрирующие функции управление персоналом проекта подбор подготовка организация работы; управление коммуникациями мониторинг и прогнозирование хода работ и результата; управление контрактами контрактация исполнителей материалов и др.; управление риском снижение уровня...
32664. Организационно-динамические структуры управления проектом. Проектирование организационно-динамических структур управления проектом 144 KB
  Организационнодинамические структуры управления проектом. Проектирование организационнодинамических структур управления проектом. Организационные структуры УП Несмотря на все многообразие типов и видов проектов их структура управления по своему содержанию в основном однородна ибо в ней представлена та или иная комбинация одних и тех же видов работ по управлению. Это обстоятельство обеспечивает единый подход к проектированию структур управления.
32665. Организационный инструментарий управления проектами: сетевое моделирование, метод PERT, матрица РАЗУ, информационно-технологические модели управления 263 KB
  Организационный инструментарий управления проектами: сетевое моделирование метод PERT матрица РАЗУ информационнотехнологические модели управления Сетевая матрица представляет собой графическое изображение процессов осуществления проекта где все работы управленческие производственные показаны в определенной технологической последовательности и необходимой взаимосвязи и зависимости. Матрица РАЗУ Возможно разделить функции по подразделениям и службам аппарата управления проектом а также обеспечить их комплексную реализацию. Матрица...
32666. Маркетинг проекта. План маркетинга в проекте 37 KB
  Маркетинг проекта В структуре маркетинговых исследований можно выделить 3 принципиальных блока которые в свою очередь также состоят из конкретных работ: Организация исследований: определение целей диапазона и программы маркетинговых исследований; определение методов и средств маркетинговых исследований; сбор и первичная оценка информации; Внешний анализ: анализ структуры целевого рынка; анализ емкости рынка; анализ каналов сбыта; анализ конкуренции; макроэкономический анализ; анализ социальноэкономической среды; Внутренний анализ:...
32667. Принципы и законы управления образовательными системами 51.5 KB
  Принципы управления весьма разнообразны. Они не только служат построению умозрительных схем но достаточно жестко определяют характер связей в системе структуру органов управления. Принципы управления это основополагающая идея по осуществлению управленческих функций.
32669. Методы управления 57.5 KB
  Огут быть сгруппированы по: Объекту управления Федер. Субъекту управления организационнораспорядительные хозяйственные Целям стратегического управления тактического оперативного Механизму влияния социальнополитические организационнораспорядительные организационнопедагогические Стилю авторитарные демократические либеральные Времени управленческих действий перспективные долгосрочные текущие Методы управления это система способов воздействия субъекта управления на объект для достижения определенного...
32670. Классификация подходов к управлению образовательным процессом 53 KB
  В качестве основы управления педагогическими системами а образовательный процесс представляет собой педагогическую систему Н. Коммуникативная функция нацелена на построение необходимых взаимоотношений и связей между субъектами управления. Конаржевский в процессе управления школой выделяет следующие функции: педагогический анализ планирование организацию внутришкольный контроль регулирование. Якунин рассматривая обучение как процесс управления в качестве относительно самостоятельных но взаимосвязанных функций управления выделяет:...