72730

Создание простейшего прикладного приложения: калькулятор, просмоторщик рисунков, графический редактор, текстовый редактор, медиаплеер

Лабораторная работа

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

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

Русский

2014-11-27

4.9 MB

7 чел.

Лабораторная работа №5

«Создание простейшего прикладного приложения: калькулятор, просмоторщик рисунков, графический редактор, текстовый редактор, медиаплеер”

1. Цель работы

Приобретение навыков разработки прикладных программных продуктов на основе среды визуального программирования C++ Builder 6.

 

2. Постановка задачи

Разработать прикладное программное приложение реализующее одну из следующих функций:

  1.  Графический редактор;
  2.  Калькулятор;
  3.  Медиаплеер;
  4.  Просмоторщик рисунков;
  5.  Текстовый редактор.

Методические рекомендации по выполнению каждой из подзадач представлены ниже.

Методические рекомендации по выполнению задания «Калькулятор»

Цель работы: Реализовать прикладной программный продукт, выполняющий функции простейшего калькулятора.

Постановка задачи

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

-сложение;

-вычитание;

-умножение;

- деление;

-нахождение квадратного корня;

-возведение в квадрат;

Программа может быть дополнена дополнительными возможностями по усмотрению студентов.

Интерфейс программного модуля выполняется по аналогии со стандартным калькулятором (рис.1).

Рис.1.

Методические материалы по теме «Медиаплеер»

  

          

                                        1.Цель задания:

  Создание простейших приложений на Borland C++ Builder 4 c использованием компоненты MediaPlayer(проигрыватель).

                                            2.Постановка задачи:

На главной форме необходимо разместить компоненту МediaPlayer, которая используется для просмотра видео файлов. Данная компонента будет видна на экране с момента её перемещения. Так же на форме устанавливаются  следующие компоненты : SpeedButton(так называемая «горячая кнопка»), с её помощью мы сможем открыть окно с существующими файлами для просмотра; StatusBar(строка состояния)- область для отображения подсказок и сообщений о выполняемых действиях;OpenDialog(окно открытия диалога).

                                           3.Порядок выполнения задания:

Шаг 1:Создайте новое приложение с помощью команды меню File/New Application.

Шаг 2:В Инспекторе объетов задайте свойство Color (цвет фона формы), пусть это будет любой понравившийся вам цвет, а в  свойстве Caption (заголовок формы) установите любой текст, соответствующий заголовку формы:

Шаг3: Перетащите на поле формы компоненту MediaPlayer, которая расположена на вкладке SystemИнспекторе объектов установите свойства данной компоненты :

Шаг 4:Обратите внимание на то , что в файле Unit1.h в классе TForm сразу был создан указатель на данную компоненту , а именно: TMediaPlayer *MediaPlayer1.

Шаг 5:Аналогичным образом установите на форме компоненты Panel, SpeedButton,StatusBar и задайте свойства этих компонент в Инспекторе объектов .(Обратите внимание: компонент Panel должно быть 2) Порядок установления может быть таким: компоненте Panel2 задайте свойству Visible значение true, а свойству Alline значение onTop. Затем поместите на Panel2  компоненты MediaPlayer , кнопки SpeedButton, OpenDialog  (размеры  компонент установите на свой вкус).Далее компоненте Panel1свойству Alline задайте значение OnClient(это позволит воспроизводить видео файлы на всей рабочей области формы).Компоненту StatusBar устанавливайте по желанию.Посмотрите , что вы получили:

Шаг 6: Указатели на данные объекты будут сразу же созданы самим Builder-ом.

Шаг 7:Теперь для компоненты SpeedButton1(она предназначена для окрытия файлов) в инспекторе объектов на вкладке Events выбирите функцию отклика на нажатие кнопки мыши (например SpeedButton1Click).Шаблон этой функции будет создан Builder-ом в файле Unit1.cpp.Задайте в теле этой функции следующий код:

Шаг 8:Теперь то же самое проделайте с кмпонентой SpeedButton2(она в данном случае предназначена для закрытия программы) .Только здесь функцией отклика будет SpeedButton

2Click.Код данной функции следующий:

Шаг 9:Не забудьте про строку состояния StatusBar. Для того чтобы программа выводила  в ней подсказку о компонентах программы и о их назначении, надо  ввести в программу обработчик сообщения на свойство Hint. Для этого вы должны записать следующую функцию:

void __fastcall TMainForm::showhint (TObject  * Sender)

{

 StatusBar1->SimpleText=Application->Hint;

}

А в конструкторе класса формы зделать следуюшую запись:

Application->OnHint=this->showhint;

Всё готово!

Шаг 10:Отправте задачу на выполнение.

                                               Приложение к заданию:

Свойства компоненты TMediaPlayer

AutoEnable Разрешает проигрывателю автоматически управлять активизацией кнопок управления.

AutoOpen Разрешает MediaPlayer' у пытаться открыть файл сразу после запуска приложения.

AutoRewind Если true и текущая позиция - конец файла, то при нажатии Play или StartRecording проигрыватель переходит в начало.

Capabilities Только для чтения. Множество, в котором хранятся сведения о возможностях проигрывателя. Может содержать:

  •  mpCanEject способен выбрасывать носитель из открытого устройства;
  •  mpCanPlay способен воспроизводить данные
  •  mpCanRecord способен записывать данные
  •  mpCanStep способен к навигации по открытому файлу вперед или назад (такое возможно только для некоторых форматов, например для AVI);
  •  mpUsesWindow использует окно для вывода мультимедийных данных.

ColoredButtons Определяет, раскрашены ли кнопки управления.

DeviceID Только для чтения. Идентификатор устройства, открытого методом Open();

DeviceType Тип мультимедийного устройства. Задается константой перечисления типа TMPDeviceTypes.

Display Указатель на TWinControl. Задает окно для вывода данных (например, для устройств AVIVideo, DigitalVideo, Overlay, и VCR).

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

EnabledButtons Множество констант перечисления типа TMPBtnType. Определяет, какие кнопки активны.

EndPos Позиция на носителе, где следует остановить запись или воспроизведение. Задается в формате, указанном в свойстве TimeFormat.

Error Для чтения. Код ошибки. Ноль, если при выполнении команды ошибки не произошло.

ErrorMessage Для чтения. Описание произошедшей ошибки.

FileName Имя воспроизводимого файла.

Frames Шаг, на который происходит перемещение при вызове методов Step() или Back().

Length Для чтения. Размер воспроизводимых данных. Указан в формате, заданном свойством TimeFormat.

Mode Для чтения. Состояние текущего открытого устройства. Является константой перечисления типа TMPModes. Может принимать значения:

  •  mpNotReady не готов
  •  mpStopped остановлен
  •  mpPlaying в процессе воспроизведения
  •  mpRecording  в процессе записи
  •  mpSeeking перемещение по файлу
  •  mpPaused пауза
  •  mpOpen файл открыт

Notify Определяет, следует ли генерировать событие OnNotify.

NotifyValue Для чтения. Результат работы последнего метода, требующего уведомления.

Position Текущая позиция в файле в формате, указанном в свойстве TimeFormat.

Shareable Определяет, могут ли другие приложения совместно использовать мультимедийное устройство.

Start Для чтения. Начальная позиция текущих открытых данных.

StartPos Позиция на носителе, с которой следует начать запись или воспроизведение. Задается в формате, указанном в свойстве TimeFormat.

TimeFormat Определяет формат времени, используемый для задания позиции.

TrackLength Для чтения. Массив с длинами дорожек.

TrackPosition Для чтения. Массив с текущими позициями дорожек.

Tracks Для чтения. Число дорожек в текущем устройстве, доступных для воспроизведения.

VisibleButtons Множество констант перечисления типа TMPBtnType. Определяет, какие кнопки видны.

Wait Определяет, будет ли приложение ждать завершения вызванного метода.

Методы компоненты TMediaPlayer

Back Движение назад на величину, заданную свойством Frames.

Click Генерирует событие OnClick.

Close Закрывает текущее устройство.

DoNotify Генерирует событие OnNotify.

Eject Выброс носителя. (Проверяли при DeviceType = = dtCDAudio - открывает CD-ROM).

KeyDown Обрабатывает нажатие Space или клавиш курсора для навигации по проигрывателю.

Loaded Инициализирует состояние проигрывателя после его загрузки из потока (не пользовалась).

Next Переход на начало следующей дорожки (не пользовалась).

Open Открывает устройство.

Paint Рисует сам MediaPlayer. Может быть переопределен при наследовании.

Pause Вызывается при нажатии на кнопку Pause. Если при вызове проигрыватель уже остановлен, продолжается воспроизведение или запись (не пользовалась).

PauseOnly Пауза. Если при вызове проигрыватель уже остановлен, ничего не происходит (не пользовалась).

Play Запустить воспроизведение.

PostClick Реализация события OnPostClick. Метод может быть переопределен в производных классах. По умолчанию вызывает обработчик события OnPostClick (точно не пользовалась).

Previous Переход на начало предыдущей дорожки.

Resume Возобновляет приостоновленные воспроизведение или запись.

Rewind Переход к позиции, указанной свойством Start.

Save Сохраняет данные в файл с именем, заданным свойством FileName.

StartRecording Начало записи.

Step Движение вперед на величину, заданную свойством Frames.

Stop Остановка воспроизведения или записи.

События компоненты TMediaPlayer

OnClick Возникает при нажатии на кнопку управления проигрывателем с помощью мыши или клавиши Space.

OnNotify Возникает при завершении работы метода класса TMediaPlayer

OnPostClick Возникает при вызове обработчика события OnClick.

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

Методические рекомендации к выполнению задания «Просмоторщик рисунков»

Цель работы

Разработка приложений использующих главное меню формы, всплывающего меню, строки состояния, панели инструментов, быстрых кнопок с картинками, подсказок к кнопкам,  а также стандартных диалогов открытия и сохранения файлов  на примере создания  приложения для просмотра графических файлов (точечных рисунков *.bmp, значков *.ico, метафайлов *.wmf).

В процессе выполнения первой части работы необходимо освоить работу с компонентами MainMenu (главное меню формы), PopupMenu (всплывающего меню), а при выпонении второй части - OpenDialog (диалог открытия файлов) и SaveDialog (диалог сохранения файлов), Image (картинка), SpeedButton (быстрая кнопка), Panel (панель), ScrollBar (полоса прокрутки), Bevel (канавка).

Выполнение работы

Создание меню

Меню это список действий, которые вы можете выбирать по своему желанию. Выбор пунктов меню принято осуществлять с помощью мыши.

Различают два типа меню:

  1.  Главное меню формы
  2.  Вспомогательные всплывающие меню

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

Всплывающие меню  не привязаны к главному меню и появляются, как правило, по щелчку правой кнопки мыши

Для главного и всплывающего меню C++Builder имеет два компонента: MainMenu и PopupMenu. Установка этих компонентов происходит одинаково, но результат будет разным. В первом случае мы получим стандартную строку главного меню, а во втором окно всплывающего меню.

Шаг 1. Создайте новое приложение. Для этого выберите в меню File команду New Application. На экране появится чистая форма с заголовком Form1.

Шаг 2. Можете переименовать форму (свойство Name), например, назовите ее   PictureForm.  При этом одновременно изменится свойство Caption формы.

Шаг 3. Cохраните модуль главной формы и весь проект, выполнив команду меню

File | Save All. Модуль назовите Main.срр, а проект PicView.bpr.

Отображение в форме главного меню обеспечивает компонент MainMenu, расположенный в палитре компонентв на странице Standard (рис.1):

Поместите компонент на форму и присвойте ему

имя MainMenu (значение свойства Name) (рис.2):

Cамые важные свойства компонента MainMenu следующие:

Таблица 1. Важнейшие свойства компонента MainMenu.

Свойство

Описание

AutoMerge 

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

Items

Обеспечивает доступ к пунктам меню верхнего уровня.

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

Шаг 4. Добавление новых пунктов выполняется в окне дизайнера меню. Для вызова дизайнера меню щелкните правой кнопкой мыши на поле значка  компонента MainMenu и в всплывающем меню щелкните мышью на пункте Menu Desiner

Появится окно дизайнера меню с заголовком PictureForm->MainMenu:

Дизайнер меню работает в паре с инспектором объектов. Управление пунктами меню, в частности их создание и удаление, осуществляется в окне дизайнера меню, а свойства каждого пункта, например его текст и клавиатурное сокращение, устанавливаются в инспекторе объектов.

Шаг 5. Пока строка главного меню состоит из одного безымянного пункта. Присвойте  его свойству Name имя FileItem, а свойству Caption присвойте значение &File. Символ & обеспечивает подчеркивание следующего за ним символа при отображении текста, поэтому пункт меню будет виден как File. Подчеркнутая буква используется в комбинации с клавишей Alt для прямого доступа к пункту меню с клавиатуры. В данном случае активизация пункта File будет происходить по комбинации клавиш Alt+F . Щелкните  на поле дизайнера меню. В пункте меню и в самой форме появится надпись File, а под пунктом File появится пустой пункт  выпадающего меню (рис. 3).

Рис3

Шаг 6. Создайте под пунктом File выпадающее меню. Для этого щелкните на пустой ячейке заготовка первого пункта выпадающего меню. Инспектор объектов настроится на  новый пункт меню. Присвойте пункту имя OpenItem и в свойстве Caption впишите текст &Open... Вместо пустой ячейки появится текст Open..., и пустая ячейка переместится ниже.

Шаг 7. Действуя по аналогии, добавьте еще три пункта: Save As..., Close и Exit (рис. 4). 

Рис4

В программе они должны называться SaveAs1, Close1 и Exit1 соответственно.

Для создания сложного меню нужны средства вставки и удаления пунктов, создания вложенных меню и прочие. Поэтому в дизайнере меню для каждого пункта предусмотрено локальное меню с необходимым набором команд (см. таблицу 2), которое появляется при нажатии правой кнопки мыши.

Taблица 2. Команды управления пунктами в дизайнере меню.

Команда

Описание

Insert

Delete

Create Submenu

Select Menu

Save As Template

Insert From Template

Delete Templates

Insert From Resource

Вставляет в позиции курсора новый пункт.

Удаляет пункт в позиции курсора.

Создает в позиции пункта выпадающее меню.

Предлагает выбрать для работы другой компонент меню.

Сохраняет текущую структуру меню в списке шаблонов.

Вставляет в позиции курсора меню, взятое из списка шаблонов.

Удаляет шаблон(ы) меню.

Вставляет в.позиции курсора меню, взятое из файла ресурсов.

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

Пункты меню

Пункты меню, как и все элементы интерфейса C++Builder, являются компонентами. Класс пункта меню называется TMenuItem.  Его самые важные свойства приведены в таблице 3.

Таблица 3. Важнейшие свойства компонента Menultem.

Break

Caption

Checked

Enabled

Groupindex

Hint

Radioltem

ShortCut

Visible

Если равно mbBreak или mbBarBreak, то пункт мeню начииает новую колонку. Значение mbBarBreak обеспечивает отделение новой колонки от старой вертикальной чертой.

Текст пункта меню.

Если равно true, то пункт меню содержит метку: "галочку" или жирную точку в зaвиcимocти oт знaчeния cвoйcтвa RadioItem.

Определяет, доступен ли пункт меню пользователю.

Работает по-разному в зависимости оттого, находится пункт в выпадающем, меню или в строке главного меню. Пункты выпадающего меню с одинаковым положительным значением GroupIndex согласованно переключают "галочку" или жирную точку (вид метки определяется свойством. Radioltem). Пункты строки главного меню, находящиеся в дочерней форме MDI, сливаются с пунктами главного меню обрамляющей формы MDI при активизации дочерней формы. При этом если в строке главного меню обрамляющей формы существуют пункты с таким же значением свойства GroupIndex, тоновый пункт со своим списком пунктов полностью заменяет старый; в противном случае новый пункт со своим списком пунктов вставляется в строку главного меню. Более подробно слияние менюизложено в справочнике С++Builder

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

Если равно true, то метка пункта имеет вид жирной точки и несколько пунктов с одинаковым значением GroupIndex работают кaк зависимые переключателиустановка у одного пункта свойства Checked в true - снимает метку с другого пункта.

Комбинация клавиш для выполнения команды, не открывая меню.

Определяет, виден ли пункт меню пользователю.

По аналогии с остальными классами компонентов можно было бы предположить, что в палитре компонентов существует компонент MenuItem. Однако его там нет, поскольку пункты меню не существуют сами по себе, а работают только в составе строки главного меню или окна всплывающего меню. Тем не менее, они во многом ведут себя как настоящие компоненты, например настраиваются в инспекторе объектов и наряду с остальными компонентами помещаются в исходный текст формы в виде отдельных полей. Чтобы в этом убедиться, активизируйте редактор кода и найдите определение класса формы  заголовочном файле формы (рис.):  

Разделительные линии

Шаг 8. Логически связанные между собой команды принято разделять горизонтальной линией. Например, пункт Exit хорошо бы отделить от остальных. Для этого вставьте новый пункт и запишите в значении свойства Caption символ минуса (-). C++Builder  нарисует для пункта горизонтальную линию. После этого  переместите пункт Exit за разделительную черту .       

Знак минус  при этом не запрещает  создавать пункты, имена которых начинаются со знака минуса. Если вы запишете что-нибудь после этого знака, то в имени пункта отобразится весь введенный текст.
Клавиатурные сокращения

Некоторым пунктам меню принято назначать клавиатурные сокращения. Клавиатурное сокращение (shortcut) это комбинация клавиш на клавиатуре, дублирующая команду меню. Например, в некоторых программах команде меню File | Exit назначается сокращение Alt+X. Текст сокращения отображается в названии пункта справа от него. Сокращения ускоряют работу с приложением.

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

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

Обработка команд меню

Например, реализуйте закрытие формы при выборе пункта меню Exit.  При нажатии кнопки на любом пункте меню возникает событие OnClick. Пункту меню Exit соответствует  компонента  ExitItem.  Поэтому  при нажатии кнопки мыши на поле  пункта меню Exit  возникает событие OnClick для компонента  ExitItem. Откликом на это событие должно быть закрытие формы вызовом метода Close()  класса TPictureForm .

Шаг 10. Активизируйте в дизайнере меню пункт Exit и выберите в инспекторе объектов страницу Events.  Щелкните двойным щелчком мыши на  события OnClick .


В результате откроется редактор кода, в котором появится заготовка обработчика события. Обработка команды Exit сводится к вызову метода Close(), закрывающего форму (а заодно и приложение, поскольку это единственная форма):

Подключение меню к форме выполняется с помощью свойства формы Menu. Активизируйте форму и найдите свойство Menu  в инспекторе объектов. Его поле уже с  одержит имя меню MainMenu.  Этого достаточно

для работы  меню.
            Проверьте,  работает ли меню. Откомпилируйте и запустите проект. На экране появится форма со строкой меню под заголовком. Выбор в меню любой команды, кроме
Exit, безрезультатен. По команде Exit или комбинации клавиш Alt+X окно закроется и приложение завершится.

Пункты-переключатели

Команды меню могут вести себя как переключатели. Если пункт меню помечен «галочкой», то этот пункт включен и действия, связанные с этим пунктом, выполняются. Если «галочку» убрать, то пункт меню будет выключен.  Например, реализуйте такой сценарий. Добавьте в главное меню еще один пункт View  и в его выпадающем меню  команду Toolbar. Если команда Toolbar выбрана, то в форме отображается панель инструментов и в названии пункта меню появляется метка, свидетельствующая о том, что режим включен. Если выбрать команду Toolbar еще раз, то панель инструментов убирается и метка исчезает.

Шаг 11. Для реализации такого переключения в строке главного меню создайте пункт  View и для него в выпадающем меню с пункт с заголовком Toolbar и именем Toolbar1.  Установите  для этого пункта свойство Checked в значение true. Пункт станут помеченными

(рис.).  

Шаг 12. В ответ на выбор пользователем пунктов Toolbar необходимо переключать метку. Для этого определите для пункта меню такой обработчик события OnClick:

void__fastcall TPictureForm::ToolbarItemClick

                           (TObject  *Sender)

{

// Спрятагь или показать панель инсгруменчов

    ToolBar1->Checked=!ToolBar1->Checked;

}   

// -------------------------------------

Шаг 12.1.  По аналогии с созданием пункта Toolbar1 создайте самостоятельно пункт меню Statu Bar1 для отображения или закрытия панели состояния

StatusBar:

 Шаг 12.2. Аналогично добавьте обработчик  события щелчка левой кнопкой мыши на пункте меню Status Bar:
           Взаимоисключающие пункты-переключатели

В Windows 95 стал широко применяться еще один способ пометки пунктовжирной точкой. Он используется в тех случаях, когда несколько пунктов меню работают согласованно как один переключатель с множеством состояний. В нашем примере с помощью жирной точки удобно реализовать выбор масштаба для картинки. Рассмотрим, как это делается.

Шаг 13. Добавьте в меню View три пункта: Half Size (программный идентификатор HalfSize1), Normal Size (программный идентификатор NormalSize1) и Double Size (программный идентификатор DoubleSize1), отделив их от остальных пунктов меню с помощью разделительной линии.

Шаг 14. Прежде всего сделайте метку жирной точкой, установив в каждом новом пункте свойство RadioItem в значение true. Теперь объедините пункты меню в одну согласованно работающую группу, для этого в каждом пункте установите одинаковый ненулевой GroupIndex, например 1. Один из пунктов пометьте.Для этого установите  его свойство Checked в значение true (рис.):

Шаг 15. Чтобы привести в действие механизм переключения пунктов, определите в них следующие обработчики события OnClick:

//--------------------------------------------

void __fastcall TPictureForm :: HalfSizeItemClick (TObject *Sender)

{

  HalfSizeItem->Checked = true;  

  // показать картинку половинного размера

}

//--------------------------------------------void __fastcall TpictureForm :: NormalSizeItemClick (TObject *Sender)

{

  NormalSizeItem->Checked = true; 

  // показать картинку нормального размера

}

// -------------------------------------------

void __fastcall TPictureForm :: DoubleSizeItemClick (TObject *Sender)

{

  DoubleSizeItem->Checked = true; 

  // показать картинку двойного размера

}

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

Запрещенные пункты меню

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

Шаг 16. Запретите пункты Save As..., Close, когда нет открытого графического файла. Для этого в каждом из указанных пунктов меню установите свойство Enabled в значение false (рис.).

 Запретите  также ïóíêòû Half Size, Normal Size и Double Size:

Шаг 17. Во время работы приложения потребуется динамически разрешать и запрещать пункты меню в зависимости от того, открыт графический файл или нет. Так как эти действия достаточно универсальны, оформите их в виде член-функции EnableCommands() класса TPictureForm. Для этого объявите в заголовочном файле Main.h  функцию класса TPictureForm:

class TPictureForm : public TForm

{

             ...

private: // User declarations

void EnableCommands (bool Enable);

}

В файле Unit1.cpp определите после всех функций отклика саму функцию :

void TPictureForm :: EnableCommands (bool Enable)

{

SaveAsItem->Enabled = Enable;

CloseItem->Enabled = Enable;

HalfSizeItem->Enabled=Enable;

NormalSizeItem->Enabled=Enable;

DoubleSizeItem->Enabled=Enable;

}

Если значение параметра Enable равно true, то пункты меню будут открыты, а, если значение false,  то -  закрыты.

Шаг 18. В обработчик команды меню Open  поместите вызов функции EnableCommands() с параметром true, а в обработчик команды Closeвызов метода EnableCommands с параметром false:

void__fastcall TPictureForm :: OpenItemClick

            (TObject *Sender)

{// Открыть файл картинки и разрешишь команды

 EnableCommands (true);}

void__fastcallTPictureForm::CloseItemClick

                            (TObject *Sender)

{// Закрыть файл картинки и запретить команды

 EnableCommands (false);}

Шаг 18.1. Выполните компиляцию и запустите проект. Обратите внимание на то, как изменилось меню приложения. В начале работы отдельные пункты выпадающих меню File и View запрещены. Выбор команды File | Open разрешает их использование, а выбор команды File | Close запрещает.

Всплывающее меню

Всплывающее (локальное) меню (pop-up menu) представлено в C++Builder компонентом PopupMenu. Отыщите его в палитре компонентов на страниц Standard (рис. 14). 

Поместите компонент на форму и присвойте новому компоненту имя PopupMenu:

Познакомьтесь с некоторыми свойствами компонента всплывающего меню (таблица 4).

Таблица 4. Важнейшие свойства компонента PopupMenu.

Свойство

Описание

Alignment 

AutoPopup

Items

Определяет место, в котором появляется меню относительно курсора мыши:

paLeftлевый верхний угол меню совпадает с позицией курсора мыши.

paCenter  середина верхнего края меню совпадает с позицией курсора мыши.

paRight правый верхний угол меню совпадает с позицией курсора мыши.

Если равно true, то меню всплывает автоматически после щелчка правой кнопкой мыши. Если равно false, то за отображение меню отвечает программист.

Обеспечивает доступ к пунктам меню.

Шаг 19. Всплывающее меню формируется, как и главное, в дизайнере меню. Двойным щелчком мыши на компоненте PopMenu откройте окно дизайнера меню и, используя уже известные вам приемы, добавьте в меню пункты Half Size (с идентификатором PopHalfSizeItem), Normal Size (с идентификатором PopNormalSizeItem) и

Double Size (с идентификатором PopDoubleSizeItem).  

Шаг 19. 1.  Во всех пунктах всплывающего меню установите следующие свойства:

     Enabled = false     GroupIndex = 1     Radioltem = true

Кроме этого, пометьте пункт Normal Size, установив в нем свойство Checked в значение true. Таким образом, команды всплывающего меню дублируют некоторые команды главного меню (рис.):

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

Для этого активизируйте в дизайнере меню пункт Half Size и выберите в инспекторе объектов страницу Events. Теперь в значении события OnClick откройте выпадающий список и выберите обработчик

HalfSize1CIick () :

То же самое проделайте с пунктами Normal Size и Double Size, но установите в них обработчики NormalSize1Click() и DoubleSize1Click() соответственно.

Шаг 21. Для синхронной работы главного и всплывающего меню добавьте в следующие функции строки, выделенные жирным шрифтом:

void__fastcall TPictureForm::HalfSize1Click

                            (TObject *Sender)

{

HalfSize1->Checked = true;

 HalfSize2->Checked = true;

 //показать картинку половинного размера

}

// -------------------------------------

void__fastcall TPictureForm::NormalSize1Click

                            (TObject *Sender)

{

NormalSize1->Checked = true;

 NormalSize2->Checked = true;

// показать картинку нормального размера

}

// -------------------------------------

void__fastcall TPictureForm::DoubleSize1Click

                            (TObject *Sender)

{

DoubleSize1->Checked = true;

DoubleSize2->Checked = true;

// показать картинку двойного размера

}

// -------------------------------------

void TPictureForm::EnableCommands(bool Enable)

{

SaveAs1->Enabled = Enable;

Close1->Enabled = Enable;

HalfSize1->Enabled = Enable;

NormalSize1->Enabled = Enable;

DoubleSize1->Enabled = Enable;

HalfSize2->Enabled = Enable;

NormalSize2->Enabled = Enable;

DoubleSize2->Enabled = Enable;

}

Шаг 22. Всплывающее меню создано. Осталось сделать так, чтобы оно вызывалось по щелчку правой кнопки мыши в области формы. Для этого активизируйте форму и запишите в значении свойства PopupMenu имя разработанного всплывающего меню PopupMenu. Можно ввести это значение с клавиатуры или выбрать из выпадающего списка (рис.).

Шаг 22.1. Скомпилируйте и запустите проект. Щелчок правой кнопкой мыши окне приложения вызовет появление всплывающего меню. Все его пункты окажутся запрещены. Чтобы пункты всплывающего меню заработали, выполните команду главного меню

File | Open... После этого убедитесь, что выпaдающее меню работает синхронно с главным меню.

Продолжите развитие приложение для просмотра графических файлов. Теперь предстоит решить две задачи:

  1.  Организовать выбор графического файла по командам меню Open... и Save As...
  2.  Реализовать загрузку и отображение картинки

Первая задача решается с помощью стандартных диалоговых компонентов OpenDialog и SaveDialog, вторая с помощью специального компонента Image.

Диалоговые окна открытия и сохранения файла

Шаг 23. Диалоговые окна для выбора открываемого или сохраняемого файла организуется с помощью компонентов OpenDialog и SaveDialog. 

Найдите их в палитре компонент на странице Dialogs:

и поместите на форму:

Присвойте компонентам имена OpenDialog и SaveDialog:

Шаг 23.1.  Познакомьтесь со свойствами этих компонент, которые приведены в таблице 5.

Таблида.5. Важнейшие свойства компонентов OpenDialog и SaveDialog.

Свойство

Описание

DefaultExt

FileName

Filter

FilterIndex

InitialDir

Options

Title

Расширение, которое добавляется к имени файла, если пользователь его пропустил.

Начальное имя файла.

Фильтр имени файла.

Номер активного фильтра.

Начальный каталог, открываемый при первом появлении окна диалога.

Параметры, определяющие внешний вид и поведение окна диалога (см. таблицу 4.6).

 Заголовок окна диалога. Если значение свойства не указано, то заголовок будет стандартным Open (Открыть) или Save (Сохранить) в зависимости от типа компонента.

Компоненты OpenDialog и SaveDialog очень схожи между собой, оба являются объектно-ориентированными оболочками стандартных диалоговых окон Windows: Open и Save. Например, на следующем рисунке показано окно Open :

Типичный сценарий работы с каждым из компонент OpenDialog и SaveDialog состоит в следующем. Компонент помещается на форму и конфигурируется для выбора тех или иных файлов. По команде меню Open... или Save As... у соответствующего компонента вызывается метод Execute(). Метод Execute() выполняет диалог и возвращает значение true, если пользователь выбрал файл. Полный маршрут к файлу запоминается в значении свойства FileName. Ход дальнейших действий зависит от прикладной задачи и, как правило, включает или чтение, или запись файла, в зависимости от обрабатываемой команды меню.

Придерживаясь написанного сценария, приспособим компоненты OpenDialog и SaveDialog для выбора графических файлов с расширениями *.bmp, *.ico, *.emf и *.wmf. Чтобы пользователь мог просматривать файлы выборочно, т. е. какого-то одного типа, в диалоговых блоках имеется набор фильтров, оформленный в виде выпадающего списка «Тип файлов» (см.рис.). Исходные данные для этого списка устанавливаются в свойстве Filter. Номер активного в данный момент фильтра записывается в свойстве FilterIndex.

Шаг 24. Сформируйте фильтры для приложения. Активизируйте на форме компонент OpenDialog и в инспекторе объектов сделайте двойной щелчок мыши на значении свойства Filter :

Шаг 25. В результате на экране появится редактор фильтра. Он представляет собой список с двумя колонками. В левой колонке вводится текст, отображаемый в выпадающем списке Тип файлов. В правой колонке через точку с запятой записываются маски, на основании которых выполняется фильтрация файлов в окне диалога. Для того чтобы предоставить пользователю максимальное удобство при выборе графических файлов, установите в компоненте OpenDialog фильтры, показанные на рис.

Обратите внимание на первую строку фильтра. В списке расширения отделяются друг от друга точкой с запятой.

Шаг 26. Действуя аналогично, установите фильтр в компоненте SaveDialog, как показано на рис:

Компоненты OpenDialog и SaveDialog имеют большое количество булевых параметров, организованных в виде флагов составного свойства Options. По умолчанию все параметры имеют значение false. Результат установки параметров в значение true прокомментирован в таблице 6.

Шаг 27. В нашем простом примере ограничимся тем, что установим в значение true в обоих компонентах (OpenDialog и SaveDialog) параметр ofHideReadOnly, а в компоненте SaveDialog еще и параметр ofOverwitePrompt (см. таблицу 6).

Таблица 6. Параметры компонентов OpenDialog и SaveDialog.

Параметр

Описание

ofAllowMultiSelect

Если равен true, то пользователь может выделить сразу несколько файлов.

ofCreatePrompt

Если равен true и пользователь вводит имя несуществующего файла, то пользователю задается вопрос, желает ли он создать новый файл с таким именем

ofExtensionDifferent

Этот параметр устанавливается после завершения диалога, если расширение в имени файла отличается от начального расширения.

ofFileMustExist

Если равен true, то пользователь не сможет ввести имя несуществующего файла.

ofHideReadOnly

Если равен true, то переключатель Read-only отсутствует в окне диалога.

ofNoChangeDir

Если равен true, то пользователь не сможет сменить каталог в окне диалога.

ofNoDereferenceLinks

Если равен true, то ярлыки к каталогам трактуются как обычные файлы. В противном случае они трактуются как каталоги.

ofNoLongNames

Если равен true, то длинные имена файлов запрещены.

ofNoNetworkButton

Если равен true, то кнопка Network отсутствует в окне диалога. Этот параметр работает только в паре с параметром ofOldStyleDialog.

ofNoReadOnlyReturn

Если равен true, то пользователь не сможет ввести файл с атрибутом read-only (только для чтения).

ofNoTestFileCreate

Если равен true, то проверка на возможность записи в каталог не выполняется.

ofNoValidate

Если равен true, то пользователь может вводить в имени файла любые символы, даже недопустимые.

ofOldStyleDialog

Если равен true, то окно диалога отображается в старом стиле Windows 3.1.

ofOverwritePrompt

Если равен true, то пользователю выдается предупреждение при попытке сохранить файл с именем, которое уже существует.

ofReadOnly

Если равен true, то переключатель Read-only в окне диалога включен.

ofPathMustExist

Если равен true, то пользователь не сможет ввести для файла несуществующий маршрут.

ofShareAware

Если равен true, то ошибки одновременного доступа к файлу со стороны нескольких приложений игнорируются.

OfShowHelp

Если равен true, то в окне диалога присутствует кнопка Help.

Отображение картинок

Шаг 28. Теперь нужен компонент, обеспечивающий отображение картинок различных форматов. Такой компонент в C++Builder есть, он называется Image и находится в палитре компонентов на странице Additional (рис. 23). Выберите его из палитры и опустите в левый верхний угол формы. Назовите новый компонент Image.

Характерные свойства компонента Image кратко описаны в таблице 7.

Таблица 7. Важнейшие свойства компонента Image.

Свойство

Описание

AutoSize

Center Picture

Stretch

Если равно true, то размеры компонента автоматически подгоняются под размеры картинки.

Центрирует картинку в пределах компонента.

Содержит картинку, отображаемую в области компонента. Свойство Picture является объектом класса TPicture и может хранить точечный рисунок (bitmap), метафайл (metafile), значок (icon).

Если равно true, то картинка масштабируется так, чтобы ее размеры совпадали с размерами компонента. Масштабирование выполняется только для точечных рисунков и метафайлов.

Компонент Image позволяет выводить картинки трех основных форматов: точечный рисунок (bitmap), метафайл (metafile) и значок (icon). Отображаемая картинка хранится в свойстве Picture, доступном и на этапе разработки, и на этапе выполнения приложения.

Шаг 29. Размеры установленной картинки могут не совпадать с текущими размерами управляющего элемента. В этом случае не уместившаяся часть изображения отрезается. Чтобы подогнать размеры управляющего элемента под размеры картинки, установите свойство AutoSize в true (см рис.). После этого при каждой установке свойства Picture размеры управляющего элемента будут изменяться автоматически.

Бывает и обратная ситуация, когда нужно выполнить масштабирование картинки, подогнав ее размеры под заданные размеры управляющего элемента. Для этого свойство Stretch устанавливается в true, a Autosize в false. Масштабирование целесообразно применять только для метафайлов; для точечных рисунков оно не всегда дает приятный результат начинает сказываться точечная природа изображения.

Сейчас компонент Image находится на своем месте и подготовлен к работе (свойство Autosize имеет значение true). Рассмотрим, как осуществляется загрузка и сохранение картинки по командам меню Open... и Save As...

Шаг 30. В файле Main.cpp уже имеется недописанный обработчик команды меню Open... В нем нужно выполнить стандартное диалоговое окно Open и загрузить картинку в том случае, если пользователь ввел в окне имя файла. Добавьте в обработчик строки, выделенные жирным шрифтом:

void __fastcall TPictureForm::OpenltemClick(TObject *Sender)

{if(OpenDialog->Execute())

{

      Image->Picture->LoadFromFile

(OpenDialog->FileName);

EnableCommands(true);

NormalSizeItem->Click();

}

}

В данном обработчике обратите внимание на вызов метода Click() у компонента NormalSizeItem. Он имитирует выбор пункта меню Normal Size с тем, чтобы сразу после загрузки картинка имела нормальный размер.

Шаг 30.1. Запустите приложение на выполнение и откройте файл с расширением *.bmp, который находится  в той же директории, в которой находится текстовый файл лабораторной работы. Вы увидите следующую картинку :

Шаг 31. Пункт меню Save As... еще не имеет обработчика события OnClick, поэтому вам придется его установить (напомним, что это делается в инспекторе объектов на странице Events). Обработка команды Save As... состоит в выдаче стандартного диалогового окна Save с последующим сохранением картинки в файле:

void __fastcall TPictureForm::SaveAsItemClick (TObject *Sender)

{

if (SaveDialog->Execute())

Image->Picture->SaveToFile(SaveDialog->FileName);

}

Шаг 31.1. Снова запустите приложение на выполнение и откройте тот же файл с расширением *.bmp. Затем сохраните этот файл с новым именем в директорию, в которой находится текстовый файл лабораторной работы. Затем  откройте сохраненный файл и убедитесь, что приложение делает то, что Вам необходимо.

Шаг 32. Осталось дописать несколько обработчиков событий. В обработчике команды меню Close добавьте строки для удаления картинки компонента Image и уменьшения размеров компонента до нуля, чтобы в отсутствие картинки компонент не занимал места на форме:

void __fastcall TPictureForm::CloseItemClick (TObject *Sender)

{

   Image->Picture = NULL;

   Image->Width = 0;

   Image->Height = 0;

   NormalSizeItem->Click();

   EnableCommands(false);

}

Шаг 33. Еще остались незавершенными обработчики команд меню Half Size, Normal Size и Double Size, которые тоже нужно доработать. Добавьте в обработчики строки, выделенные жирным шрифтом.  Разберетесь с ними самостоятельно, читая комментарии в тексте программы:

void __fastcall PictureForm::HalfSizeItemClick (TObject *Sender)

{

HalfSizeItem->Checked = true;

PopHalfSizeItem->Checked = true;

Image->AutoSize = true; // восстановить нормальные размеры компонента

Image->Width = Image->Width/2;// уменьшить ширину наполовину

Image->Height = Image->Height/2;// уменьшить высоту наполовину

}

// -------------------------------------------

void __fastcall TPictureForm :: NormalSizeItemClick (TObject *Sender)

{

NormalSizeItem->Checked = true;

PopNormalSizeItem->Checked = true;

Image->AutoSize = true; // восстановить нормальные размеры компонента

}

// -------------------------------------------

void __fastcall TPictureForm :: DoubleSizeItemClick (TObject *Sender)

{

DoubleSizeItem->Checked = true;

PopDoubleSizeItem->Checked = true;

Image->AutoSize = true; // восстановить нормальные размеры компонента

Image->Width = Image->Width * 2;   // удвоить ширину

Image->Height = Image->Height * 2; // удвоить высоту

}

В первом приближении приложение для просмотра графических файлов готово. Выполните компиляцию приложения и проверьте его работоспособность. Обратите внимание на способность формы прокручивать картинки, которые в ней не умещаются. Это явление называется автоматической прокруткой. Автоматическая прокрутка не требует никаких усилий со стороны программиста. Попробуйте изменять свойства Stertch и AvtoSize компоненты Image.

Проектирование строки состояния

Строка состояния (status bar) это панель в нижней части окна, предназначенная для вывода вспомогательной информации: параметров документа, с которым работает пользователь, подсказок к пунктам меню и т. д. В C++Builder она организуется с помощью компонента StatusBar, расположенного в палитре компонентов на странице Win32 (см. рис.).

Шаг 34. Опустите компонент на форму и дайте ему имя StatusBar. Следующая таблица (4.8) знакомит вас с основными свойствами компонента StatusBar.

Таблица 4.8. Важнейшие свойства компонента StatusBar.

Свойство

Описание

Align

Panels

SimplePanel

SimpleText

SizeGrip

Способ выравнивания строки состояния в пределах владельца (формы или компонента).

Информационные панели, отображаемые на строке состояния.

Если равно true, то вместо информационных панелей на строке состояния отображается одна простая строка текста, хранящаяся в свойстве SimpleText.

Строка текста, отображаемая в строке состояния, когда свойство SimplePanel равно true.

Если равно true, то в правом нижнем углу строки состояния рисуется "гармошка" работающая как размерная рамка.

Как только вы добавили на форму строку состояния, она тут же прижимается к нижнему краю формы и растягивается по всей ее ширине (см. рис.).

Измените ширину формы.  Строка состояния тоже корректирует свою ширину и всегда занимает всю нижнюю часть формы. Такое поведение обеспечивает свойство Align, которое в компоненте StatusBar по умолчанию установлено в значение alBottom. Свойство Align есть во многих визуальных компонентах C++Builder. С его помощью вы можете заставить компонент подгонять свои размеры и положение при изменении размеров своего владельца (формы или компонента, на которых он находится). Возможные значения свойства Align описаны в таблице 9.

Таблица 9. Значения свойства Align.

Значение

Описание

АlNone

alTop

alBottom

alLeft

alRight

alClient

Позиция и размеры компонента остаются неизменными в пределах владельца.

Компонент прижимается к верхнему краю владельца и растягивается по всей его ширине.

Компонент прижимается к нижнему краю владельца и растягивается по всей его ширине.

Компонент прижимается к левому краю владельца и растягивается по всей его высоте.

Компонент прижимается к правому краю владельца и растягивается по всей его высоте.

Компонент подгоняется под размеры владельца.

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

Шаг 35. Приспособим строку состояния для отображения размеров картинки и имени файла, в котором картинка хранится на диске. С этой целью разобьем строку состояния на две информационные панели. Выберите в инспекторе объектов свойство Panels и щелчком мыши на многоточии в значении свойства откройте редактор панелей:

Шаг 36. В этом окне создаются, редактируются и удаляются панели строки состояния. Создайте первую панель щелчком на кнопке Add и установите ее свойства так, чтобы она получилась шириной 70 пикселов (Width = 70), продавленной (Bevel = plLowered) и с центрированным текстом (Alignment = taCenter). В этой панели будут отображаться размеры картинки:

Шаг 36.1. Аналогично создайте вторую панель неограниченной ширины (Width = -1), продавленной (Bevel = lpLowered) и с прижатым влево текстом (Alignment = taLeftJustify). В ней будет отображаться имя файла:
Шаг 36.2. Закройте редактор панелей. Строка состояния проектирована. Теперь можно вывести на нее текст. Доступ к панелям обеспечивает свойство Panels строки состояния. Объект Panels содержит массив Items, элементами которого являются объекты-панели. Каждая панель имеет свойство Text, в котором хранится отображаемый на панели текст. Установка содержимого строки состояния в нашем примере будет выглядеть так:

StatusBar->Panels->Items[0]->Text = 

IntToStr(Image->Picture->Width)+ " х " + 

IntToStr(Image->Picture->Height);

StatusBar->Panels->Items[1]->Text = OpenDialog->FileName;

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

Шаг 37. Обновление строки состояния оформите в виде личного (private) член-функции UpdateStatusBar( ) класса TPictureForm. В заголовочном файле формы вставьте в часть private класса  объявление этой функции:

А саму функцию вставьте в конец файла Main.cpp:

//-----------------------------------------

void TPictureForm :: UpdateStatusBar( )

{

if (Image->Width != 0)  //в компоненте Image есть картинка

{

StatusBar->Panels->Items[0]->Text = IntToStr(Image->Picture->Width)+" х " + IntToStr (Image->Picture->Height);

StatusBar->Panels->Items[1]->Text=

OpenDialog->FileName;

  }

  else// в компоненте Image нет картинки

  {

     StatusBar->Panels->Items[0]->Text = "";

     StatusBar->Panels->Items[1]->Text = "";

  }

}

Шаг 38. Разберитесь с работой функции.  Функция будет отображать в строке состояния информацию в том случае, если в компоненте Image есть картинка,  что соответствует ненулевому значению свойства Width.

Вызовы функции UpdateStatusBar() поместите в обработчики команд меню Open... и Close:

Выполните компиляцию приложения и удостоверьтесь, то строка состояния работает:

Подсказки на строке состояния

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

Для того чтобы вы могли получить строку состояния с описанной выше логикой работы, в компоненте StatusBar предусмотрен режим отображения простого текста. Его обеспечивает булево свойство SimplePanel. По умолчанию оно равно false, и в строке состояния отображаются панели объекта Panels. Если установить свойство SimplePanel в значение true, то в строке состояния будет отображаться текст, хранящийся в свойстве SimpleText. 

Таким образом, необходимо при выборе пункта  меню записывать подсказку этого пункта в свойстве SimpleText компоненты StatusBar и, в том случае, если подсказка содержит текст, устанавливать свойство SimplePanel в значение true. 

Для решения этой задачи вначале разберитесь с механизмом работы подсказок, который состоит в следующем. Каждый пункт меню имеет свойство Hint для хранения поясняющего текста (подсказки). Когда выбирается пункт меню с помощью мыши или клавиатуры, поясняющий текст переписывается из пункта меню в объект Application, у которого тоже есть свойство Hint. При этом в объекте Application возникает событие OnHint. В ответ на это событие нужно отобразить Hint объекта Application в строке состояния.

Шаг 39. Поскольку объект Application не виден в инспекторе объектов, вы должны сами объявить новый обработчик (функцию отклика на событие), полностью записать его программный код и назначить объекту Application. Для этого вставьте в заголовочный файл формы в части public следующее объявление функции:

Файл Main. h:

class TPictureForm : public TForm

{

 . . .

public:    // User declarations

void __fastcall ApplicationHint (TObject *Sender);

    . . .

};

Затем в конец файла Mainpp добавьте код самой функции:

Файл Main. cpp:

//--------------------------------------

void __fastcall TPictureForm :: ApplicationHint (TObject *Sender)

{

StatusBar->SimpleText = Application->Hint;

StatusBar->SimplePanel = StatusBar->SimpleText  != "";

}

//--------------------------------------

Обратите внимание на правую часть второго оператора. Результатом его будет значение true или false в зависимости от того будет ли свойство SimpleText компоненты StatusBar содержать текст или нет.

Шаг 40. Установка соответствия между обработчиком события и самим событием осуществляется присвоением свойству Application->OnHint имени функции обработчика события. Установку обработчика выполните при создании формы по событию OnCreate:

//--------------------------------------

void  __fastcall TPictureForm :: FormCreate (TObject *Sender)

{

Application->OnHint = ApplicationHint;

}

//--------------------------------------

Шаг 41. Теперь в свойстве Hint каждого пункта меню впишите  строку-подсказку. Например, для пункта Open… установите подсказку: «Вывод графического файла» (см.рис.). 

Шаг 41.1. Скомпилируйте и запустите программу вы получите приложение с полностью работающей строкой состояния (см. рис.).

Шаг 41.2. Для других пунктов меню установите подсказки самостоятельно.

Прокрутка

Последний вариант приложения имеет существенный недостаток: форма неправильно прокручивает свое содержимое, когда размеры картинки превышают размеры формы. Дело в том, что в прокрутке участвует и строка состояния, а этого быть не должно. Строка состояния должна оставаться на своем месте, прижимаясь к нижнему краю формы. Этого можно избежать с помощью прокрутки в отдельной прямоугольной области.

Прокрутка в рабочей области формы

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

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

Форма имеет встроенную поддержку прокрутки, благодаря чему реализуется просмотр содержимого формы при любом изменении ее размеров. Когда размеры или координаты управляющих элементов превышают размеры формы, форма создает одну или две полосы прокрутки и пользователь получает возможность прокручивать изображение. Полосы прокрутки представлены на форме составными свойствами HorzScrollBar и VertScrollBar. Свойство HorzScrollBar описывает горизонтальную полосу прокрутки, а VertScrollBar вертикальную полосу. Их вложенные свойства кратко описаны в таблице 10.

Таблица 10. Составные свойства HorzScrollBar и VertScrollBar.

Свойство

Описание

Increment

Margin

Position

Range

Tracking

Visible

Величина "информативной строки" в пикселах.

Минимальный отступ прокручиваемых элементов от края области прокрутки.

Позиция бегунка на полосе прокрутки.

Виртуальный размер области прокрутки.

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

Определяет, видна ли полоса прокрутки пользователю.

Наибольший интерес представляют вложенные свойства Tracking и Increment, Установка булева свойства Tracking в true обеспечивает прокрутку изображения в процессе передвижения бегунка с помощью мыши. Свойство Increment задает величину "информативной строки" в пикселах. Уменьшив его значение до 1, вы обеспечите более плавную прокрутку.

Прокрутка в отдельной прямоугольной области

Форма не позволяет организовать прокрутку в отдельной своей части. Например, в приложении для просмотра графических файлов необходимо организовать прокрутку картинки  так, чтобы строка состояния в прокрутке не участвовала. Форма этого сделать не позволяет. Здесь на помощь приходит компонент ScrollBox, реализующий отдельную область прокрутки. Он расположен в палитре компонентов на странице Additional (см. рис.).

Таблица 4.11 содержит краткую характеристику его отличительных свойств.

Таблица 4.11. Важнейшие свойства компонента ScrollBox.

Свойство

Описание

Align

Autoscroll  

BorderStyle

HorzScrollBar

VertScrollBar

Способ выравнивания области прокрутки в пределах владельца.

Если равно true, полосы прокрутки появляются и скрываются автоматически по мере необходимости.

Определяет, имеет ли область прокрутки рамку.

Определяет параметры и поведение горизонтальной полосы прокрутки (см. табл. 10).

Определяет параметры и поведение вертикальной полосы прокрутки (см. табл. 10).

Компонент ScrollBox характеризуется тем, что служит владельцем для других компонентов и обеспечивает прокрутку внутри своей прямоугольной области. Давайте поместим на него картинку (компонент Image), а область прокрутки расположим между меню и строкой состояния. В результате большие картинки будут прокручиваться уже не формой, а компонентом ScrollBox, и строка состояния останется на своем месте прижатой к нижнему краю формы.

Шаг 42. Активизируйте на форме компонент Image и временно удалите его в буфер (команд меню Edit | Copy  и  Edit  | Cut). Теперь опустите на форму компонент ScrollBox, выбрав его из палитры компонентов. Назовите новый компонент ScrollBox и подгоните его под всю незанятую область формы, установив свойство Align в значение alClient. Выберите цвет компонента, например, clInfoBk :

Шаг 43.  Теперь вставьте из буфера компонент Image (команда меню Edit | Paste) и убедитесь, что он стал в левый верхний угол области прокрутки:

Скомпилируйте и запустите приложение, загрузите в него какую-нибудь картинку из каталога CBuilder\lmages\Splash\16color. Увеличивая и уменьшая окно, понаблюдайте за тем, как появляются и исчезают полосы прокрутки между меню и строкой состояния (см. рис.). 

Обратите внимание, что величина бегунков на полосах прокрутки зависит от соотношения видимой части и всего изображения. Это работает компонент ScrollBox без единой строчки кода.

Полосы прокрутки

Полоса прокрутки реализуется компонентой ScrollBar, которая находится в палитре компонент на странице Standard  (см. рис.).

ScrollBar это отдельная полоса прокрутки, без области прокрутки. Её согласованная работа с другими компонентами обеспечивается программистом. Для этого в компоненте ScrollBar предусмотрено событие OnScroll, в ответ на которое и нужно выполнять необходимые действия. Компонента ScrollBar не имеет никакого отношения ни к форме , ни к компоненту ScrollBox.

Свойства компонента приведены в таблице 12. 

Таблица 12. Важнейшие свойства компонента ScrollBar.

Свойство

Описание

Kind

LargeChange

Min, Max

Position

SmallChange

Вид полосы прокрутки: горизонтальная или вертикальная.

Величина "информативной страницы".

Начальная и конечная виртуальные позиции на полосе прокрутки.

Позиция бегунка на полосе прокрутки.

Величина "информативной строки".

Ïàíåëü èíñòðóìåíòîâ

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

В C++Builder панель инструментов строится из нескольких компонентов. Панель делается из компонента Panel, кнопки-инструменты из компонентов SpeedButton, рельефная канавка между инструментальной панелью и менюиз компонента Bevel. Воспользуйтесь этими компонентами и создайте панель инструментов с кнопками, дублирующими команды меню Open..., Save As..., Half Size, Normal Size, Double Size.

Панель

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

Шаг 44. Для этого активизируйте область прокрутки, временно уберите для нее выравнивание (установите свойство Align в значение alNone) и приспустите ее верхнюю границу, освободив на форме немного места (см. рис.). 

Шаг 45. Теперь активизируйте форму и поместите на нее компонент Panel, находящийся в палитре компонентов на странице Standard (см. рис.).

Шаг 46. Назовите новый компонент ToolBar и выровняйте его по верхней стороне формы, установив свойство Align в значение alTop (см. рис.).

Наконец, восстановите в области прокрутки свойство Align в значение alClient.

Основу для панели инструментов вы создали. Теперь познакомьтесь с наиболее важными свойствами компонента Panel  (таблицу 13). Особый интерес представляют свойства BevelInner и BevelOuter. Изменяя их значения, вы получите выпуклую, вдавленную, ограниченную канавкой или выступом панель.

Шаг 47.  Продолжите настройку панели. Во-первых, уберите с нее текст (просто очистите свойство Caption), а во-вторых, откажитесь от рельефа (для этого установите свойства BevelInner и BevelOuter в значение bvNone). В современных приложениях панель инструментов отделена горизонтальной канавкой от строки меню. Канавку легко получить с помощью компонента Bevel.

Таблица 13. Важнейшие свойства компонента Panel.

Свойство

Описание

Align

Способ выравнивания панели в пределах владельца.

BevelInner

Рельефность внутреннего контура панели:

bvLowered вдавленный контур;

bvRaised выпуклый контур;

bvNone нерельефный контур.

BevelOuter

Рельефность внешнего контура панели:

bvLowered вдавленный контур; bvRaif-ed выпуклый контур;

bvNone — нерельефный контур.

BevelWidth

Глубина рельефа в пикселах.

BorderWidth

Расстояние в пикселах между внутренним и внешним контуром.

BorderStyle

Определяет, имеет ли панель рамку.

Caption

Текст на панели.

Locked

Если равно false, то OLE-серверу разрешено заменить панель на свою панель инструментов. Если равно true и панель выровнена по какой-нибудь стороне формы, то она остается нетронутой при активизации OLE-сервера по месту.

Канавка

Компонент рельефа Bevel позволяет создавать на поверхности формы различные рельефные эффекты: углубления, выпуклости, бордюры, канавки. Он расположен в палитре компонентов на странице Additional (см. рис.).

Выполняя роль украшения, этот компонент вообще не имеет списка событий. Его внешний вид регулируется с помощью свойств, описанных в таблице 14.

Таблица 14. Важнейшие свойства компонента Bevel.

Свойство

Описание

Align

Shape

Style

Способ выравнивания компонента в пределах владельца.

Рельефный элемент: прямоугольник, рамка, линия вдоль верхнего, нижнего,  левого или правого края компонента.

Определяет, является рельефный элемент выпуклым или вдавленным.

Шаг 48. Активизируйте на форме панель и опустите на нее компонент Bevel, затем установите свойства нового компонента в следующие значения:

Align = alTop Height = 2 Shape = bsTopLine

Взгляните на панель инструментов (см. рис.).  

Теперь она выглядит в современном стиле Windows 95.

Кнопки-инструменты

Кнопки-инструменты представлены компонентами SpeedButton. Вы найдете этот компонент в палитре компонентов на странице Additional (см. рис).

Шаг 49. Активизируйте на форме панель и поместите на нее компонент SpeedButton первую кнопку. Дайте кнопке имя OpenBtn. Активизируйте панель снова и поместите на нее вторую кнопку с именем SaveBtn. Аналогичным образом добавьте еще три кнопки с идентификаторами HalfSizeBtn, NormalSizeBtn и DoubleSizeBtn. Расположите кнопки на панели так, как показано на рисунке.

При подборе размеров и положения кнопок удобно пользоваться возможностью группового редактирования компонентов. Рассмотрите, как это делается, на примере.

Шаг 50. Выберите щелчком мыши первую кнопку, а затем, удерживая клавишу Shift, выберите щелчками мыши все остальные кнопки. При этой в инспекторе объектов произойдут следующие изменения:

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

Шаг 51. Перейдите в окно инспектора объектов и установите следующие значения для свойств (см. рис.):

Height = 24 Width = 24 Тор=8

Шаг 51.1.  Познакомьтесь с наиболее важными свойствами компонента SpeedButton (таблица 15).

Таблица.15. Важнейшие свойства компонента SpeedButton.

Состояние

Описание

AllowAllUp

Если равно true, то все кнопки одной группы могут находиться в "отжатом"

GroupIndex

Задает группу кнопок, работающих согласованно.

Down

Если равно true, то кнопка нажата. Иначе кнопка отжата.

Caption

Текст на кнопке.

Glyph

Картинка на кнопке.

Layout

Положение картинки относительно текста.

Margin

Расстояние от границы кнопки до картинки. Если оно равно -1, то картинка вместе с текстом центрируются на кнопке.

NumGlyphs

Количество образов кнопки на картинке Glyph. C++Builder отображает один из образов в зависимости от состояния кнопки.

Spacing

Расстояние от картинки до текста. Бели оно равно -1, то текст центрируется между картинкой и границей кнопки.

Картинки на кнопках

Кнопка инструментальной панели может содержать текст и картинку. Текст определяется значением свойства Caption, а картинка значением свойства Glyph.

Шаг 52. Вначале на кнопке нет ни текста, ни картинки. Чтобы назначить кнопке картинку, сделайте двойной щелчок мыши в значении свойства Glyph. Появится окно редактора картинки, в котором существуют средства просмотра, загрузки и сохранения картинок формата *.bmp (см. рис.). 

Шаг 53. Нажмите кнопку Load... и загрузите файл Open.bmp, который находится в директории BMP лабораторной работы. Закройте редактор картинки щелчком по кнопке ОК:

Шаг 53.1. Проделайте все те же действия для остальных кнопок, загрузив картинки из файлов Save.bmp для кнопки сохранения файла, Zoomin.bmp для кнопки увеличения размера рисунка и Zoomout.bmp для кнопки уменьшения размера рисунка:

Шаг 54. Создайте для кнопки показа рисунка нормального размера картинку самостоятельно. Для этого выберите в меню Tools | Image Editor  (редактор изображений). Работа с редактором должна быть вам знакома. Обратите внимание, что цвет фона отображаться не будет, и если размер рисунка 16х16, то  кнопка сохранит свой вид, если 32х32, то – сольется с панелью.  В директории BMP лабораторной работы выберите вначале файл Normal16.bmp, а затем Normal.bmp. Кнопка будет выглядеть такой:

Шаг 54.1. Пока в приложении нет открытого файла, не имеет смысла делать все кнопки, кроме первой, доступными для пользователя, поэтому установите в них свойство Enabled в значение false:

Шаг 55. Познакомьтесь дополнительно с другими свойствами быстрых кнопок. Иногда эти кнопки  имеют и картинку, и текст. В этом случае их взаимное расположение регулируется с помощью свойств Layout, Margin и Spacing. Смысл последних двух свойств наглядно поясняет рисунок :

Свойство Layout определяет общую ориентацию картинки по отношению к тексту: снизу (blGlyphBottom), слева (blGlyphLeft), справа (blGlyphRight) или сверху (blGlyphTop). По умолчанию картинка располагается слева от текста (значение свойства равно blGlyphLeft). Свойства Margin и Spacing регулируют расстояние (в пикселах) от границы кнопки до картинки и от картинки до текста. Если значение Margin равно -1, то картинка и текст центрируются на кнопке. Если значение Spacing равно -1, то текст центрируется между картинкой и границей кнопки.

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

Взаимоисключающие кнопки

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

Шаг 56. Чтобы сгруппировать кнопки HalfSizeBtn, NormalSizeBtn и DoubleSizeBtn, установите свойство GroupIndex каждой из них в одно и то же ненулевое значение, например, 1.  Первую кнопку сделайте нажатой, установив ее свойство Down в значение true.

Обработка нажатий кнопок

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

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

void__fastcall TPictureForm::HalfSizeltemClick (TObject *Sender)

{

HalfSizeBtn->Down = true;  // кнопка согласуется с пунктом меню

}

// -------------------------------------

void__fastcall TPictureForm::NormalSizeltemClick (TObject *Sender)

{

NormalSizeBtn->Down = true;  // кнопка согласуется с пунктом меню

}

// -------------------------------------

void__fastcall TPictureForm::DoubleSizeltemClick (TObject *Sender)

{

DoubleSizeBtn->Down = true;  // кнопка согласуется с пунктом меню

}

Шаг 58. Чтобы обеспечить динамическое разрешение и запрещение кнопок при открытии и закрытии файла картинки, скорректируйте еще метод EnableCommands:

void TPictureForm::EnableCoinmands (bool Enable)

{           …

SaveBtn->Enabled = Enable;

HalfSizeBtn->Enabled = Enable;

NormalSizeBtn->Enabled = Enable;

DoubleSizeBtn->Enabled = Enable;

}

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

Панель инструментов работает. Теперь  добавьте подсказки к кнопкам.

 

Подсказки к кнопкам

Все визуальные компоненты C++Builder, в том числе и кнопки инструментальной панели, могут иметь подсказки. Подсказки бывают двух видов: всплывающие подсказки и подсказки в строке состояния. Оба вида подсказок хранятся в значении одного и того же свойства Hint. Формат свойства следующий:

<всплывающая подсказка> | <подсказка в строке состояния>

Если в программе организована строка состояния, то при попадании курсора мыши на визуальный компонент в ней автоматически отображается поясняющий текст, записанный справа от символа вертикальной черты. Это легко проверить. Впишите в свойстве Hint кнопки OpenBtn текст Open ...| Opens an existing picture file. После запуска программы вы обнаружите, что подсказка для кнопки работает точно так же, как и подсказка к пункту меню.

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

Шаг 59. В каждом визуальном компоненте существует булево свойство ShowHint, определяющее условие всплывания подсказки. Его значение может устанавливаться напрямую, а может копироваться из компонента-владельца. Копирование значения у владельца происходит тогда, когда вспомогательное свойство ParentShowHint установлено в true. Таким образом, появлением подсказок можно управлять из владельца компоненты. Воспользуйтесь  этой возможностью. Так как во всех компонентах свойство ParentShowHint по умолчанию уже равно true, то просто установите в компоненте ToolBar (владелец кнопок) свойство ShowHint в true. В результате во всех кнопках свойство ShowHint тоже получит значение true, и это заставит их отображать свои подсказки.

Шаг 60. Впишите для каждой кнопки подсказку (это делается в свойстве Hint). Как вы знаете, свойство Hint может содержать сразу две подсказки: всплывающую подсказку и подсказку в строке состояния (они разделяются символом вертикальной черты). Если вторая кажется вам лишней, просто не набирайте ее (но символ вертикальной черты поставьте) (см. рис.).


Скомпилируйте и запустите приложение. Убедитесь, что панель инструментов работает правильно.

Управление видимостью панели инструментов

Придайте своему приложению завершенность и доработайте обработчики команд меню View | Toolbar и View | Status bar.

Шаг 61. Обработка команд View | Toolbar и View | StatuSbar выполняется так у соответствующей панели измените значение булева свойства Visible на противоположное. При этом панель исчезает или появляется в окне вместе с изменением значения свойства.  Окончательный вариант обработчиков будет следующим (жирным щрифтом выдлены операторы, котоорые необходимо добавить):

//--------------------------------------------

void __fastcall TPictureForm::ToolbarItemClick (TObject *Sender)

{

ToolBar->Visible = !ToolBar->Visible;

ToolbarItem->Checked = !ToolbarItem->Checked;

// Спрятать или показать панель инструментов

}

// -------------------------------------------void__fastcall TPictureForm::StatusBarltemClick (TObject *Sender)

{

StatusBar->Visible=!StatusBar->Visible;

StatusBarItem->Checked=!StatusBarItem->   Checked;

// Спрятать или показать строку состояния

}

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

Шаг 62. На этом приложение для просмотра графических файлов разработано. Теперь можете самостоятельно  изменять некоторые его части. Например,

  1.  уберите компоненты и операторы необходимые для работы с нормальным размером картинки;
  2.  добейтесь того, чтобы размер картинки увеличивался (уменьшался) каждый раз при нажатии кнопки для увеличения (уменьшения) изображения;
  3.  подберите более плавные коэффициенты увеличения (уменьшения) картинки;
  4.  установите начальную директорию для открытия и сохранения файла;
  5.  обеспечьте появление картинки во всей рабочей области компоненты ScrolBox;
  6.  обеспечьте появление линеек прокрутки сразу же с появлением картинки;
  7.  установите свойства Flat для быстрых кнопок в значение true, для того чтобы кнопки появлялись только при  наведении указателя мыши на поле кнопки.

Такие изменения сделаны в проекте в директории pr_3,  находящейся в директории  описания лабораторной работы:

Шаг 63. Попробуйте самостоятельно поработать с компонентой ToolBar  (панель инструментов), которая специально включена в палитру компонент С++Builder 3 и находится на вкладке Win32:

Примечание: данная работа может быть выполнена с добавлением дополнительных функций и свойств, присущих подобным программам

Методические материалы по теме

«Текстовый редактор»

Условие задачи: 

Используя компоненту TMemo, ввести текст, создать простейший текстовый редактор с пунктами  меню  TEXT,состоящий из пунктов: CUT-удаляет помеченный текст;  CUT ALL- удаляет весь текст; COPY-копирует помеченный текст в буфер;  PASTE-производит вставку из буфера.

 

Создание проекта.

Шаг 1. 

*Запустите C++ Builder 5 и создайте новое приложение: в меню File выберите пункт  New Аpplication (новое приложение). Появившаяся     форма  Form1 является   главной формой приложения.

*   В ИНСПЕКТОРЕ ОБЪЕКТОВ установите свойство  Caption этой формы: “TEXT”.

*  Свойству Color установите значение clAqua.

Шаг 2.

Поместите на форму компонент  TMemo (многострочный редактор текста) .  Для этого:

на вкладке Standard ПАЛИТРЫ КОМПОНЕНТ выберите компонент TMemo (на вкладке Standard 6-ый слева)

* Установите свойству ScrollBars значение ssBoth –видимость обеих полос прокрутки.

Шаг 3.

Поместите на форму компонент TLabel  (метка ).  Для этого:

* на вкладке Standard ПАЛИТРЫ КОМПОНЕНТ выберите компонент ТLabel (3-й слева);

* свойство Caption этого компонента установите  "INPUT TEXT".

Шаг 4.

Поместите на форму компонент Tbutton (кнопка). Для этого:

* на вкладке Standard ПАЛИТРЫ КОМПОНЕНТ выберите компонент Tbutton(6-й слева);

* свойство Caption этого компонента установите “EXIT

Шаг 5. 

Поместите на форму компонент TMainMenu (главное меню). Для этого:

  •  на вкладке Standard ПАЛИТРЫ КОМПОНЕНТ выберите компонент TMainMenu (2-й слева);

*нажмите на нём кнопкой мыши появится окно дизайнера меню,создайте соответствующие пункты меню:

* закройте окно дизайнера меню.

Окончательно Form1 будет иметь вид:

Шаг 6.

*Создадим Form2 для подсказки что делают соответствующие пункты меню,для этого поместите на форму 5 компонент Tlabel,свйству Caption этих компонент присвойте пояснения что делает соответствующие пункты меню.  

*   В ИНСПЕКТОРЕ ОБЪЕКТОВ установите свойство  Caption этой формы: “HELP”.

*  Свойству Color установите значение clWhite.

Окончательно Form2 будет иметь вид:

Теперь можно написать обработчики событий в соответствие со сценарием.

Шаг 7. 

*Подключим для начала Form2 к Form1для этого в файле Text1.cpp добавьте строку  #include "Text2.h":  

Шаг 8.

*Щёлкните мышью на пункте меню PASTE (появится окно  РЕДАКТОРА КОДА  с заголовком функции отклика на нажатие этого пункта меню).Добавьте в тело функции строку:
Memo1->PasteFromClipboard(); //вставка текста из буфера.

Шаг 9.

* Щёлкните мышью на пункте меню СOPY. Добавьте в тело функции строку:

 Memo1->SelText; //указатель на  выделенный текст Memo1->CopyToClipboard(); //копирование выделенного текста в буфер

Шаг 10. 

*Обработаем событие OnEnter,заключающееся в получении компонентой фокуса ввода.В тело появившейся функции добавьте строку:

Memo1->Text=""; //удаляет текст из компоненты

Шаг 11.

*Щёлкните мышью на пункте меню CUT. Добавьте в тело функции строку:

 Memo1->SelText=""; //удаление выделенного текста

Шаг 12.

* Щёлкните мышью на пункте меню CUT ALL. Добавьте в тело функции строку:

Memo1->Text=""; //удаление всего текста

Шаг 13.

* Обработаем событие OnDestroy, соответствующее закрытию главной формы, а, следовательно, и закрытию приложения. Добавьте в тело функции строку:

Application->Terminate(); //закрытие приложения

Шаг 14.

* Щёлкните мышью на пункте меню HELP. Добавьте в тело функции строку:

Form2->ShowModal(); //показ Form2 в модальном режиме

Шаг 15.

* Щёлкните мышью на кнопке EXIT. Добавьте в тело функции строку:

Application->Terminate();//закрытие приложения

Шаг16.

*.  Сохраните проект, выбрав пункт File / Save Project As.

Шаг 17.  Запустите проект на выполнение.Вот что получилось:

Файл Text1.cpp имеет вид:

//-------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Text2.h"

#include "Text1.h"

//-------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//-------------------------------------------

__fastcall TForm1::TForm1 (TComponent* Owner) : TForm(Owner)

{

}

//-------------------------------------------

void __fastcall TForm1::PASTE1Click  (TObject *Sender)

{  Memo1->PasteFromClipboard();

}

//-------------------------------------------

void __fastcall TForm1::COPY1Click (TObject *Sender)

{  Memo1->SelText;

 Memo1->CopyToClipboard();

}

//-------------------------------------------

void __fastcall TForm1::Memo1Enter (TObject *Sender)

{Memo1->Text="";

}

//-------------------------------------------

void __fastcall TForm1::CUT2Click (TObject *Sender)

{  Memo1->SelText="";      

}

//-------------------------------------------

void __fastcall TForm1::CUTALL1Click (TObject *Sender)

{  Memo1->Text="";      

}

//-------------------------------------------

void __fastcall TForm1::FormDestroy (TObject *Sender)

{ Application->Terminate();       

}

//-------------------------------------------

void __fastcall TForm1::HELP1Click(TObject *Sender)

{ Form2->ShowModal();

}

//-------------------------------------------

void __fastcall TForm1::Button1Click (TObject *Sender)

{ Application->Terminate();

}

//--------------------------

Файл Text1.h имеет вид:

//-------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed      Components

       TMemo *Memo1;

       TMainMenu *MainMenu1;

       TMenuItem *CUT1;

       TMenuItem *CUT2;

       TMenuItem *COPY1;

       TMenuItem *PASTE1;

       TMenuItem *CUTALL1;

       TLabel *Label1;

       TMenuItem *HELP1;

       TButton *Button1;

       void __fastcall PASTE1Click(TObject *Sender);

       void __fastcall COPY1Click(TObject *Sender);

       void __fastcall Memo1Enter(TObject *Sender);

       void __fastcall CUT2Click(TObject *Sender);

       void __fastcall CUTALL1Click(TObject *Sender);

       void __fastcall FormDestroy(TObject *Sender);

       void __fastcall HELP1Click(TObject *Sender);

       void __fastcall Button1Click(TObject *Sender);

private : //User declarations

public : // User declarations

   __fastcall Tform1 (Tcomponent *Owner);

};

//------------------------------------------------------

extern PACAGE TForm1 *Form1;

/------------------------------------------------------

#endif

Примечание: данная работа может быть выполнена с добавлением дополнительных функций и свойств, присущих текстовым редакторам.

Методические материалы выполнения задания

«Графический редактор»

                              

  

          

                                        1.Цель задания:

  Создание простейших приложений на Borland C++ Builder 4 c использованием компоненты PageControl(набор вкладок) на тему «Графический редактор»

.

                                            2.Постановка задачи:

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

Внешний вид работающего приложения показан на рисунке 1.

Наряду с набором вкладок в данном проекте были  использованы компоненты CSpinEdit и CColorGrid со страницы Samples палитры компонентов Builder. Первая используется для задания толщины, а вторая – для задания цвета рисуемых линий.

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

    canv->Pen->Width = SpinEdit->Value;

    canv->Pen->Color = ColorGrid->ForegroundColor;

Предполагая, что первый элемент массива Controls[] активной вкладки является указателем на TImage, получаем его и указатель на его свойство Canvas.

TCanvas * canv = ((TImage*)PageControl1->ActivePage->Controls[0])->Canvas;

Создаем еще одну функцию ImageMouseMove .В ее теле проверим условие :

if (Shift.Contains(ssLeft)), т е проверяем нажата ли левая кнопка мыши. Если оно выполняется, то переходим к функции canv->MoveTo(X, Y); Ей передаются начальные координаты мыши. Следующая за ней функция

canv->LineTo(X,Y); продолжает линию  к новому месту.

Создадим еще одну функцию ShowHint для  вывода длинной подсказки в строке состояния statusbar .

StatusBar1->SimpleText = Application->Hint;

Создадим еще одну функцию CreateTab и в ней динамически создадим указатель на объект класса TTabSheet:

TTabSheet * tab = new TTabSheet(this);

Если нам нужно открыть файл то обязательно создается новая вкладка. Сделаем вкладку активной и создадим рисунок.

Наши события должны обрабатываться соответствующими функциями:     

    image->OnMouseMove = ImageMouseMove;

    image->OnMouseDown = ImageMouseDown;

В инспекторе объектов зададим нашей компоненте свойство AllClient  и, таким образом PageControl отображается на всей клиентской области.

Если наш файл существует,то можно загрузить картинку.Тогда мы увидим:

Добавим обработчик события, возникаюшего  при изменении размеров вкладки:

tab->OnResize = TabResize;

Теперь заполним тело функции  TabResize.Для начала получим указатель на TImage:

    TImage * image = (TImage*)PageControl1->ActivePage->Controls[0];

    А затем зменим размеры Bitmap' а, присвоив их ширине и высоте клиентской части:

    image->Picture->Bitmap->Width =

               PageControl1->ActivePage->ClientWidth;

    image->Picture->Bitmap->Height =

               PageControl1->ActivePage->ClientHeight;

    Далее, для  большего удобства создадим на панеле собственные кнопки:New,Open,Save,Save as…,Close.

Для кнопки New рассмотрим следующую конструкцию:

static int count = 1;

String str = "Безымянный";

str = str + count++;

this->CreateTab(str);

Имеется статическая переменная целого типа, равная 1.Наш первый файл будет иметь имя Безымянный1,а далее будет по счетчику прибавляться 2,3,4,5…

    С помощью стандартных диалогов OpenDialog,SaveDialog , открываем файлы,предварительно проверяя условие о существовании файла.Также и сохраняем файл:

image->Picture->SaveToFile(SaveDialog->FileName);

Выход из программы осуществим с помощью события  ExitItemClick функцией Close().

Приложение 1. Свойства компоненты TPageControl

Объявленные в классе TPageControl

ActivePage Указатель на TTabSheet  - текущая вкладка набора.

PageCount Для чтения. Общее число вкладок.

Pages Для чтения. Массив из указателей на TTabSheet. Позволяет получить доступ к любой вкладке.

Унаследованные от TCustomTabControl

Canvas Для чтения. Канва элемента управления.

HotTrack Определяет, подсвечиваются ли заголовки вкладок при наведении мыши.

Images Указатель на TCustomImageList. Список изображений, которые будут отображаться на заголовках вкладок.

MultiLine Определяет, можно ли отображать заголовки вкладок в несколько рядов.

OwnerDraw Определяет, можно ли рисовать на элементе управления.

RaggedRight Определяет, будут ли вкладки или ряды растягиваться, чтобы занять всю доступную ширину. Работает при MultiLine = = true.

ScrollOpposite Работает при MultiLine = = true. Если true, то ряды с заголовками предыдущих вкладок отображаются внизу.

Style Стиль отображения заголовков вкладок. Может принимать значения:

  •  tsTabs стандартные вкладки
  •  tsButtons кнопки
  •  tsFlatButtons плоские утапливаемые кнопки

TabHeight Высота заголовков вкладок.

TabPosition Определяет положение заголовков вкладок. Может принимать значения

  •  tpTop наверху
  •  tpBottom внизу
  •  tpLeft слева
  •  tpRight справа

TabWidth Ширина заголовков вкладок.

Методы компоненты TPageControl

CanShowTab Задает возможность доступа к вкладке с заданным номером.

Change Отвечает на все изменения набора вкладок.

DoAddDockClient Выполняет необходимые действия, когда какой-то элемент управления перетаскивается на PageControl. Например, присваивает свойству Parent этого элемента активную вкладку.

DockOver Определяет, можно ли вставить перетаскиваемый на PageControl элемент управления.

DoRemoveDockClient Выполняет необходимые действия, когда элемент управления с помощью Drag and Drop убирается с PageControl' а. Этими тремя методами точно не пользовались.

FindNextPage Возвращает следующую или предыдущую вкладку относительно заданной.

GetChildren Вызывает заданную процедуру для каждой вкладки (не пользовались).

GetImageIndex Задает картинку для страницы с заданным номером. Можно переопределить в производном классе (не пользовались).

GetPageFromDockClient Возвращает указатель на страницу, куда переместили с поиощью Drag and Drop какой-то элемент управления (не пользовались).

GetSiteInfo Возвращает информацию о возможностях PageControl' а для процедур Drag and Drop (Непонятно и не пользовались)

SetChildOrder Задает порядок записи или чтения страниц при работе с потоками (не проверяли).

SelectNextPage Переходит к следующей или предыдущей видимой странице.

ShowControl Показывает заданную страницу, но непонятно как.

События компоненты TPageControl

OnChange Возникает при выборе новой страницы.

OnChanging Возникает перед тем, как будет выбрана новая страница.

OnDrawTab Возникает перед тем, как страница будет перерисована.

OnGetImageIndex Возникает перед выбором картинки, которую необходимо отобразить на заголовке вкладки.

Свойства компоненты TTabSheet

ImageIndex Номер картинки для заголовка. Картинка берется из списка, принадлежащего PageControl' у.

PageControl Набор, в котором содержится страница.

PageIndex Номер страницы в наборе.

TabIndex Для чтения. Номер страницы в наборе видимых. Если -1, страница невидима.

TabVisible Определяет, видима ли страница в наборе.

Методы компоненты TTabSheet

DoHide Генерирует событие OnHide. Можно переопределить в потомке.

DoShow Генерирует событие OnShow. Можно переопределить в производном классе.

События компоненты TTabSheet

OnHide Возникает при задании свойству Visible страницы значения false.

OnShow Возникает при задании свойству Visible страницы значения true.

Остальные свойства, методы и события унаследованы от TWinControl и остальных и не являются специфичными для этих компонент.


 

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

64625. Роспись стены акрилом 830.24 KB
  История настенной живописи. Материалы для акриловой живописи Акриловые краски их состав и технические свойства Технология и техника акриловой живописи. Представленная курсовая работа посвящена акриловой живописи и росписи стен в частности.
64626. Распределение средств между предприятиями, ООО «Солнышко», ООО «Алладин», ОАО «Береза», ОАО «Свет», ОАО «Сумки» 684.92 KB
  Инвестировать деньги только в один какой-то проект часто может быть не самым прибыльным и надежным вариантом. Причина этого в том что все предприятия дают разную прибыль в зависимости от вложенных инвестиций и кроме того инвестируя лишь один проект шанс потерять свои деньги возрастает во много раз.
64627. Функции таможенны органов в части обеспечения мер по противодействию легализации (отмыванию) доходов, полученных преступным путем и финансированию терроризма 328.97 KB
  Роли таможенных органов в обеспечении мер направленных на борьбу с отмыванием денег и финансирование терроризма. В отчете о стратегии международной борьбы с распространением наркотиков подготовленном Государственным департаментом...
64628. Этика деловых отношений в организации ООО «Аэросервис» 88.56 KB
  Целью данной работы является изучение этики деловых отношений в организации ООО Аэросервис. Для написания данной работы необходимо решить следующие задачи: всесторонне рассмотреть теоретические аспекты этики деловых отношений...
64629. Проектирование и строительство архитектурного ансамбля 40.87 KB
  Икона Казанской Божией Матери, покровительницы государства Российского и дома Романовых, была привезена в Санкт-Петербург Петром І в 1710 году для освящения новой столицы Российской империи. Первоначально икону помещают в церковь Рождества Богородицы на Петроградской стороне.
64632. Югославия в годы Второй мировой войны 55.57 KB
  Верхний хронологический рубеж характеризуется тем что в мае 1945 году в Югославии победу над фашистскими захватчиками одержал Отечественный фронт. Предметом исследования выступают общественные и политические отношения в Югославии складывающиеся в годы Второй мировой войны.
64633. Методы повышения эффективности использования лесозаготовительных машин 156.15 KB
  При диагностировании механизмов трансмиссии прежде всего учитывают информацию водителя о работе ее агрегатов выбеге автомобиля самопроизвольном выключении передач или трудностях их включения шумах и перегревах наблюдаемых в процессе работы автомобиля на линии.