Студопедия

КАТЕГОРИИ:

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

Диалоговое окно в качестве главного




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

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

Иногда программа содержит много управляющих элементов, с которыми пользователь должен работать прямо из главного окна (например, программа-калькулятор со множеством кнопок). Visual C++ предоставляет такую возможность — вы можете назначить главным окном своей программы диалоговое окно. В следущем примере диалоговое окно с кнопкой Нажми меня и текстовым полем будет играть именно эту роль.      

Когда пользователь нажимает кнопку Нажми меня, в текстовом поле появляется надпись"Диалоговое окно!".

ПОДСКАЗКА: Хотя кнопки ОК и Cancel в нашем примере остаются, их можно удалить, как и любые другие кнопки — достаточно выделить их в редакторе диалоговых окон и нажать клавишу Delete.

Приступим к созданию новой программы с именем buttons:

 На шаге 1 AppWizard установите переключатель Dialog based, чтобы базовым классом для новой программы стал класс CDialog.

Завершите создание проекта кнопкой Finish.

Перейдите на вкладку Resources, откройте папку Dialogи щелкните в списке на строке главного окна программы, IDD_BUTTONSDIALOG. Запускается редактор диалоговых окон.

 Разместите в диалоговом окне кнопку с надписью Нажми меня и текстовое поле.

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

Свяжите кнопку с обработчикомOnButtont (), как было сделано в предыдущем примере.

 Дважды щелкните на строке BN_CLICKED в списке Messages. В результате будет создан обработчикOnButton1():

void CButtonsDIg::OnButton1()

{

}

Программа buttons готова.

ПРИМЕЧАНИЕ: В этом примере мы не стали создавать новый класс диалогового окна, потому что AppWizard сделал это за нас во время генерации кода.

Мы хотим поместить в текстовое поле строку "Диалоговое окно!". Конечно, это можно сделать при помощи переменной, связываемой с содержимым текстового поля (m_text из предыдущей программы). Тем не менее, существует более общий способ работы с управляющими элементами — можно присвоить имя всему элементу и работать с соответствующим объектом, а не с отдельным свойством элемента. Давайте посмотрим, как это делается.

Запустите ClassWizard и перейдите на вкладку Member Variables, затем выберите из списка Control IDs строку IDC_EDIT1. Нажмите на кнопку Add Variable, и откроется окно Add Member Variable.

Мы присвоим объекту текстового поля имя m_edit. Введите в поле Member variable name строку m_edit; убедитесь, что в списке Categoryвыбран пункт Control, а в списке VariableCEdit; нажмите кнопку ОК. Появляется новая переменная m_edi

Теперь у нас есть объект для работы с текстовым полем в диалоговом окне. Мы можем работать с ним напрямую и пользоваться всеми его методами. Методы класса CEdit перечислены в табл. 6.2.

Таблица 6.2. Методы класса CEdit    

Метод Назначение
CanUndo Указывает/ можно ли отменить операцию редактирования в текстовом поле
Cedit Создает объект Cedit
CharFromPos Получает индексы строки и символа, расположенных как можно ближе к заданной точке
Clear Удаляет текущий выделенный фрагмент текстового поля
Copy Копирует текущий выделенный фрагмент текстового поля в буфер обмена (clipboard)
Create Создает текстовое поле как управляющий элемент Windows и связывает его с объектом Cedit
Cut Удаляет текущий выделенный фрагмент текстового поля и копирует текст в буфер обмена
EmptyUndoBuffer Сбрасывает флаг отмены для текстового поля
FmtLines Разрешает/запрещает включение «мягких» разрывов строк
GetFirstVlsibleLine Определяет верхнюю видимую строку текстового поля
GetHandle Получает логический номер области памяти, которая в настоящий момент выделена для многострочного текстового поля
GetLimitText Получает максимальный объем текста, который может храниться в объекте CEdit
GetLine Получает строку текста из текстового поля
GetLineCount Определяет количество строк в многострочном текстовом поле
GetMargins Получает размеры левого и правого полей
GetModify Показывает, изменилось ли содержимое текстового поля
GetPasswordChar Получает символ, отображаемый в текстовом поле при вводе текста
GetRect Получает размера форматного прямоугольника
GetSel Получает позицию начального и конечного символов для текущего выделенного фрагмента
LimitText Ограничивает длину текста, который может быть введен пользователем
LineFromChar Получает номер строки, содержащей символ с заданным индексом
LineIndex Получает символьный индекс (то есть смещение в символах от начала текста) для заданной строки в многострочном текстовом поле
LineLength Получает длину строки
LineScroll Прокручивает текст в многострочном текстовом поле
Paste Вставляет в текстовое поле данные из буфера обмена
PosFromChar Получает координаты левого верхнего угла символа с заданным индексом
ReplaceSel Заменяет текущий выделенный фрагмент текстового поля заданным текстом
SetHandle   Задает логический номер локальной области памяти, которая будет использоваться для многострочного текстового поля
SetLimitText Задает максимальный объем текста, который может храниться в объекте CEdit
SetMargins Задает размеры левого и правого полей
SetModify Устанавливает или сбрасывает флаг изменений
SetPasswordChar Задает или отменяет специальный символ, отображаемый при вводе текста в текстовое поле (например, используется при вводе пароля)
SetReadOnly   Устанавливает или отменяет для текстового поля режим «только для чтения»
SetRect Задает размеры форматного прямоугольника для многострочного текстового поля и обновляет его изображение
SetRectNP Задает размеры форматного прямоугольника для многострочного текстового поля без перерисовки
SetSel Задает текущий выделенный фрагмент
SetTabStops Задает позиции табуляции для многострочного текстового поля
Undo Отменяет последнюю операцию с текстовым полем

Класс CEditявляется производным от CWindow, а последний содержит метод SetWindowText() для задания текста окна, поэтому содержимое текстового поля можно задать следующим образом:

void CButtonsDIg::OnButton1()

{      

m_edit.SetWindowText(CString("Диалоговое окно!"));  

}

Подготовка закончена — запустите программу и нажмите кнопку Нажми меня.Наш текст появляется в текстовом поле.

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

Флажки и переключатели

Сейчас мы исследуем две новые разновидности управляющих элементов: флажки и переключатели. В Visual C++ они на самом деле являются кнопками, но с иным стилем, чем те, что встречались нам ранее (простые кнопки после нажатия возвращаются в исходное состояние).

Наверняка вам приходилось встречать в Windows флажки — маленькие квадратики, либо пустые, либо содержащие пометку в виде "галочки". Если щелкнуть на флажке, его состояниеменяется на противоположное: из установленного он становится снятым и наоборот. Флажки позволяют выбрать один или несколько вариантов из предложенного списка.

Переключатели, в отличие от флажков, позволяют выбрать всего один вариант, например, задать текущий день недели (понедельник, вторник, среда и т. д.). Внешне они напоминают маленькие круглые кнопки. При установке переключателя в центре круга появляется черная точка. При щелчке переключатель, как и флажок, изменяет свое состояние на противоположное. Еще одно отличие от флажков состоит в том, что переключатели объединяются в группы и работают совместно.

В любой момент времени в группе может быть установлен лишь один переключатель. При его выборе все остальные переключатели группы снимаются, так что черная точка никогда не будет присутствовать в нескольких переключателях сразу. В Visual C++ существует два способа группировки переключателей: либо вы располагаете их внутри специального управляющего элемента (группового поля), либо просто помещаете в одно окно (то есть все переключатели внутри окна работают вместе даже при отсутствии группового поля). Здесь будут рассмотрены оба способа.

Наконец, мы объединим флажки и переключатели в одной программе. Мы напишем маленькое приложение для цветочного магазина, в котором пользователь сможет выбрать тип композиции букета (при помощи переключателей, позволяющих выбрать всего один вариант из нескольких), а программа покажет, какие цветы входят в выбранный букет (для этого используются флажки — обратите внимание на то, что несколько флажков могут быть установлены одновременно).

Начнем с программы для работы с флажками.

Работа с флажками

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

Создайте проект программы checksи установите переключатель Dialog based во время работы AppWizard. После того как программа будет создана, откройте ее главное диалоговое окно с идентификатором IDD_CHECKS_DIALOG в редакторе диалоговых окон.

Прежде всего, удалите надпись "//TODO: Place dialog controls here" (выделите ее и нажмите клавишу Del). Теперь мы добавим в окно элементы, необходимые для программы checks, — три флажка и текстовое поле.










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

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