Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11275 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 21:

Библиотека классов MFC среды проектирования Visual Studio .NET. Элементы управления

< Лекция 20 || Лекция 21: 1234 || Лекция 22 >

Работа с элементами управления

Каждый элемент управления имеет свой набор атрибутов, называемых также свойствами элемента управления.

Изменение атрибутов элемента управления в процессе выполнения приложения происходит или под воздействием пользователя на данный элемент управления, или программным путем.

Так как все элементы управления реализуются классами, производными от CWnd, то они являются оконными объектами. Как и для всех оконных объектов, процесс создания включает в себя два этапа:

  • создание элемента управления (например, размещение его в шаблоне диалога);
  • связывание его с объектом или переменной.

Если элемент управления не требуется изменять в процессе выполнения приложения, то для него можно не выполнять связывание с объектом или с переменной.

Все элементы управления, встраиваемые в диалоговые окна, можно подразделить на общие и ActiveX-элементы управления. Библиотека MFC поддерживает как те, так и другие, инкапсулируя их свойства и поведение в соответствующих классах.

Инициализацию элементов управления можно выполнять в методе OnInitDialog класса диалога.

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

Доступ к элементам управления может быть реализован различными способами:

  • элемент управления связывается с некоторой переменной;
  • элемент управления связывается с объектом соответствующего класса, и для работы с ним используются методы этого класса;
  • элемент управления не связывается ни с каким объектом, а для доступа к нему используется его идентификатор (отображаемый на странице свойств);
  • переменная, инициируемая указателем на элемент управления. Указатель на элемент управления можно получить вызовом метода CWnd::GetDlgItem с заданным в качестве параметра идентификатора элемента управления.

Например:

// 1. Инициализация указателем:
     CEdit* pEdit1 = (CEdit*) GetDlgItem(IDC_EDIT1);
// Конструкция pMyStat-> Metod() позволяет вызывать 
// любые методы класса
// 2. Доступ по идентификатору:
     SetDlgItemText(IDC_EDIT1, L"12345");

Для связывания элемента управления с переменной или объектом соответствующего класса можно использовать диалог Add Member Variable Wizard (рис. 21.4), вызываемый командой контекстного меню Add Variable.

Диалог Add Member Variable

Рис. 21.4. Диалог Add Member Variable

Флажок Control variable определяет способ использования создаваемой переменной:

  • при установленном флажке связь будет осуществляться с объектом соответствующего класса;
  • при снятом флажке устанавливается связь с переменной и обмен данными выполняется DDX-методами, автоматически добавляемыми в переопределяемый метод DoDataExchange. Метод DoDataExchange вызывается методом UpdateData, указывающим в качестве параметра направление обмена данными: из переменной в элемент управления или наоборот.
Класс CEdit

Класс CEdit обеспечивает функционирование элемента управления "окно редактирования", называемое также текстовым полем. Окно редактирования может быть как однострочным, так и многострочным. Иногда однострочное окно редактирования также называют полем ввода.

Для создания многострочного окна редактирования следует установить значение свойства Multiline равным True. Для установки разбиения на строки с использованием мягкого конца строки следует установить свойство Auto HScroll.

При мягком конце строки, в отличие от жесткого, окно редактирования отображает разделение на строки, не вставляя непосредственно в сам текст символы конца строки и перевода каретки.

При двойном щелчке мыши на элементе управления выполняется автоматическая вставка метода обработчика сообщения OnEnChangeEdit.

Таблица сообщений родительского окна может содержать для элемента управления "окно редактирования" вызовы следующих стандартных обработчиков сообщений:

  • ON_EN_CHANGE - пользователь изменил текст в окне редактирования.
  • ON_EN_ERRSPACE - недостаточно памяти.
  • ON_EN_HSCROLL - пользователь щелкнул на горизонтальной линейке прокрутки окна редактирования.
  • ON_EN_KILLFOCUS - окно редактирование теряет фокус.
  • ON_EN_MAXTEXT - текущая позиция вставки превысила указанное для окна редактирования число символов; либо не установлен стиль ES_AUTOHSCROLL, а число вставляемых символов превышает ширину окна редактирования или общее число строк превышает высоту окна редактирования.
  • ON_EN_SETFOCUS - окно редактирования получает фокус ввода.
  • ON_EN_UPDATE - пользователь изменил текст в окне редактирования; (а в чем отличие от п.2? - Ред.)
  • ON_EN_VSCROLL - пользователь щелкнул на вертикальной линейке прокрутки окна редактирования.

Класс CEdit предоставляет широкий набор методов для работы с окном редактирования, включая следующие:

  • CanUndo - метод возвращает ненулевое значение, если последнее изменение в окне редактирования можно отменить, и 0 - если изменение отменить нельзя.
  • CharFromPos - метод возвращает номер символа в строке и строки (начиная с 0) для символа, наиболее близко расположенного к указанной параметром точке.
  • Clear - метод удаляет в окне редактирования текущее выделение текста.
  • Copy - метод копирует текущее выделение текста из окна редактирования в буфер промежуточного хранения.
  • Cut - метод удаляет текущее выделение текста из окна редактирования и копирует его в буфер промежуточного хранения.
  • Paste - метод выполняет вставку данных из буфера промежуточного хранения в текущую позицию окна редактирования.
  • GetFirstVisibleLine - метод возвращает номер первой отображаемой строки в окне редактирования.
  • GetLine - метод копирует указанную строку текста (без нулевого символа) из окна редактирования в буфер и при успешном завершении возвращает количество скопированных байтов.
  • GetLineCount - метод возвращает количество строк текста в многострочном окне редактирования.

    Например:

    extern CEdit* pmyEdit;    
      int i, nLineCount = pmyEdit->GetLineCount();
      CString strText, strLine;
      for (i=0;i < nLineCount;i++)
      {
      // Получение длины строки i
      int len = pmyEdit->LineLength(pmyEdit->LineIndex(i));
      pmyEdit->GetLine(i, strText.GetBuffer(len), len);
      strText.ReleaseBuffer(len);
      strLine.Format(TEXT("line %d: '%s'\n"), i, strText);
      cout<< strLine;
      }
  • GetSel - метод определяет позицию первого и последнего символа выделенного фрагмента текста.

    Например:

    extern CEdit* pmyEdit;
        // Выделить все символы, следующие за текущим 
        // выделенным фрагментом
    DWORD dwSel = pmyEdit->GetSel();    // Определение   // позиций текущего выделения
    pmyEdit->SetSel(HIWORD(dwSel), -1);  // HIWORD(dwSel) - 
              // позиция первого невыделенного символа, 
              // следующего за выделением
  • LimitText - метод устанавливает максимально допустимую длину (в байтах) вводимого пользователем текста.
  • LineIndex - метод возвращает номер первого символа в указанной строке, а при значении параметра, равном -1 - номер первого символа в текущей строке.
  • LineLength - метод возвращает длину строки.
  • ReplaceSel - метод выполняет замену выделенного фрагмента текста на указанную строку.
  • SetPasswordChar - метод устанавливает символ, отображаемый при вводе пароля, вместо любого вводимого пользователем символа.
  • SetSel - метод выполняет выделение в окне редактирования указанного фрагмента текста.
< Лекция 20 || Лекция 21: 1234 || Лекция 22 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);