Студопедия

КАТЕГОРИИ:

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

Создание оконных подклассов для расширенного управления вводом данных




Как быть, если нужно поле ввода (в диалоговом окне или окне представления в виде формы), которое допускает ввод только чисел? Вы просто устанавливаете свойство Number=True в окне свойств элемента управления. Однако, если Вам нужно исключить цифровые символы или изменить регистр букв, придется немного попрограммировать.

MFC позволяет легко изменить поведение любого стандартного элемента управления, включая поля ввода. Для этого существует несколько способов. Можно создать свои классы, производные от CEdit, CListBox и т.д. (со своими функциями-обработчиками сообщений), а затем динамически создавать объекты. Или, как это сделал бы программист в Win32, зарегистрировать специальный оконный класс и интегрировать его в файл ресурсов проекта, используя текстовый редактор. Однако ни один из указанных способов не позволяет размещать такие элементы управления в диалоговом ресурсе с помощью диалоговых окон.

Самый простой способ изменить поведение элемента управления – воспользоваться инструментом MFC-библиотеки, предназначенным для создания оконных подклассов (window subclassing). При использовании редактора диалоговых окон в диалоговом ресурсе размещается обычный элемент управления, а потом на С++ пишется новый класс, содержащий обработчики сообщений для тех событий, которые Вы хотите обрабатывать самостоятельно. Процесс создания подкласса поля ввода таков.

1. Используя редактор диалоговых окон, расположите поле ввода в диалоговом ресурсе. Пусть идентификатор дочернего окна будет IDC_EDIT1.

2. Создайте новый класс (например, CNonNumericEdit), производный от CEdit. Напишите обработчик сообщения WM_CHAR, скажем, такой:

void CNonNumericEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){if (!isdigit(nChar)) {CEdit::OnChar(nChar, nRepCnt, nFlags);}}

 

3. В заголовке производного класса диалогового окна или формы объявите переменную-член класса CNonNumericEdit:

private:CNonNumericEdit m_nonNumericEdit;

4. Если Вы работаете с классом диалогового окна, добавьте в переопределенную функцию OnInitDialog строку:

m_nonNumericEdit.SubclassDlgItem(IDC_EDIT1, this);

 

5. Если же Вы работаете с классом формы, добавьте в переопределенную функцию OnInitialUpdate такой код:

if (m_nonNumericEdit.m_hWnd == NULL) { m_nonNumericEdit.SubclassDlgItem(IDC_EDIT1, this);}

 

Функция-член SubclassDlgItem() класса CWnd гарантирует, что все сообщения, прежде чем дойти до встроенной оконной процедуры элемента управления, пройдут через организуемую каркасом приложений систему распределения сообщений. Такой прием называется динамическим созданием подклассов (dynamic subclassing) и подробнее описан в Technical Note #14 MSDN.

Приведенный код только проверяет символы и отвергает недопустимые. Если же надо изменить значение символа, обработчик должен вызвать функцию CWnd::DefWindowProc(), что позволит обойти стандартное поведение MFC, когда значения параметров хранятся в переменных объекта «поток кода». Вот пример обработчика, который переводит все буквы в верхний регистр:

void CUpperEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){ if (islower(nChar)) {   nChar = toupper(nChar); } DefWindowProc(WM_CHAR, (WPARAM) nChar,             (LPARAM) (nRepCnt | (nFlags << 16)));}

 

Оконные подклассы можно также использовать для обработки возвращенных (reflected) сообщений, о которых говорилось в главе 6. Если оконный MFC-класс не сможет сопоставить сообщению от одного из дочерних элементов управления обработчик, каркас приложений возвратит сообщение обратно элементу. Подробнее об этом говорится в Technical Note #14 MSDN.

Если Вам требуется поле ввода, например, с желтым цветом фона, создайте класс CYellowEdit, производный от CEdit, и сопоставьте в CYellowEdit обработчик сообщению =WM_CTLCOLOR. (Мастер ИС помещает перед именем возвращенного сообщения знак равенства.) Обработчик практически не отличается от обработчика обычного сообщения WM_CTLCOLOR из главы 6. (Переменная m_bYellowBrush инициализируется в конструкторе класса элемента управления.)

HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor){ pDC->SetBkColor(RGB(255, 255, 0)); // yellow return m_hYellowBrush;}

 

 



Обработка файлов










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

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