Как сделать окно в паскале

Обновлено: 13.05.2024

Текст, который мы выводим на экран с помощью процедуры Writeln или с помощью оператора Write можно изменять. Процедура Textcolor используется для изменения цвета выводимого текста. Процедура Textbackground изменяет цвет фона, на котором выводится текст. Процедура Window задает окно, в котором будет выводиться текст.

Строка №2. Подключаем к программе модуль Crt. Мы уже упоминали этот модуль, когда использовали процедуру очистки экрана Clrscr. Помимо этого данный модуль подключается к программе для управления способами вывода на экран. Он позволяет устанавливать курсор в нужную позицию на экране (gotoxy), устанавливать цвет фона (textbackground) и цвет выводимых символов (textcolor) и многое другое. В конце обязательно ставится точка с запятой.

Строка №5. Записываем процедуру Window. Эта процедура определяет, где на экране будет находиться текстовое окно. Window (x1, y1, x2, y2): (x1, y1) - координаты для верхнего левого угла окна. (x2,y2) – координаты для нижнего правого угла окна. Таким образом, запись Window (20,5,60,20) означает, что у нас задается окно. Его координаты: левый верхний угол (20,5) и нижний правый угол (60,20). Ниже дана простая схема.

razmetka okna v windows

В строке №6 записываем процедуру Textbackground, которая устанавливает цвет для фона, на котором будет выводиться текст. После записи слова Textbackground в скобках указывается значение. Мы указали значение 14. Это число соответствует желтому цвету в палитре цветов Паскаля. Ниже находится таблица, в которой указаны все 16 цветов, входящих в палитру цветов Паскаля.

В строке №7 записываем процедуру Textcolor. Эта процедура устанавливает цвет для выводимого на экран текста. После записи Textcolor в скобках записываем значение 1, что соответствует синему цвету.

palitra tsvetov v Pascal

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

textbackground textcolor window

textbackground textcolor window.

Дополнение к материалу.

CRT – английская аббревиатура, которая обозначает электронно-лучевую трубку. Таким образом, название модуля Crt подчеркивает, что он умеет управлять способами вывода на экран.

Как ни странно, но для того только, чтоб вывести пустое окно нам потребуется совершить довольно много действий. А именно:

1.1 Оконная функция

Минимальная оконная функция будет иметь следующий вид:

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

Замечательно - минимальную оконную функцию, которая нам когда-нибудь послужит каркасом для более сложных, мы написали. Что теперь с ней делать?

1.2 Класс окна

Следующий код реализует создание нового класса окна:

Итак, по порядку:

Переменная WndClass используется для того, чтобы создать в динамической памяти структуру, описывающую класс. Мы используем структуру типа TWndClassEx , хотя можно было бы и удовлетвориться TWndClass . Однако, варианты без Ex - это наследие Win16, и лучше отучаться (или не приучаться) их использовать. Хотя в данном случае - разница между TWndClassEx и TWndClass всего в одном поле - hIconSm , которое к тому же в настоящем примере мы просто зануляем.

Рассмотрим поля структуры:

Заполнив все поля мы передаем структуру функции RegisterClassEx() . Если бы мы использовали старую версию структуры - TWndClass , то и функцию бы взяли RegisterClass() . RegisterClassEx() возвращает специальное значение - атом, соответствующий нашему классу, если регистрация прошла успешно. В противном случае возвращаемое значение - 0, что мы и проверяем.

Мы намеренно поместили регистрацию класса в секцию initialization , таким образом она происходит гарантированно один раз при начале работы программы. В случае, если регистрация неудачна, дальнейшее выполнение программы не имеет никакого смысла, посему вызываем процедуру Halt() . Замечу, что память, выделенная средствами Free Pascal, в таком случае освобождается автоматически операционной системой, поскольку находится в локальной куче приложения.

1.3 Создание окна

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

Что мы делаем? Для того, чтобы создать окно, мы вызываем функцию WinAPI CreateWindowEx() . Как и во многих других случаях, мы могли бы использовать вариант без Ex - функцию CreateWindow() и были бы лишены первого параметра - расширенных стилей окна.

Разберем аргументы функции:

  • dwExStyle - расширенные стили. Представляет из себя комбинацию флагов стилей. В нашем случае были использованы следующие флаги:
    • WS_EX_APPWINDOW - употребляется для главного окна приложения - явное указание того, что окно должно иметь кнопку на панели задач.
    • WS_EX_CONTROLPARENT - флаг используется для того, чтобы между дочерними окнами данного можно было переключаться по клавише Tab. В нашем минимальном примере, конечно, эта возможность не используется, флаг я указал в "шаблонных" целях.
    • WS_EX_WINDOWEDGE - флаг "объемной" кромки окна. Именно такой вид границы окна, как правило, используется программами Win32.
    • WS_CAPTION - указание выводить заголовок окна.
    • WS_CLIPCHILDREN - связан с механизмом прорисовки содержимого окна - указывает на то, что из области перерисовки исключаются области, занятые дочерними окнами, что логично - все равно те перерисовывают себя сами. В нашем случае - добавлен на вырост.
    • WS_MAXIMIZEBOX - окно имеет кнопку максимизации.
    • WS_MINIMIZEBOX - окно имеет кнопку минимизации (сворачивания).
    • WS_OVERLAPPED - нормальное перекрывающееся окно. В отличие от окон со стилями WS_CHILD и WS_POPUP окна с данным стилем перекрывают друг друга в зависимости только от того, какое активно (точнее от позиции Z-Order), не обращая внимание на отношения "родительское-дочернее".
    • WS_SIZEBOX , несмотря на BOX , кнопок не добавляет. Обозначает то, что размеры окна могут быть изменены пользователем.
    • WS_SYSMENU - окно имеет системное меню - то, которое открывается по щелчку на иконке слева от заголовка. Без стиля WS_CAPTION смысла не имеет.
    • WS_VISIBLE - флаг видимости - окно отображается сразу после создания.

    Функция CreateWindowEx() возвращает дескриптор свежесозданного окна, при помощи которого мы сможем в дальнейшем к окну обращаться.

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

    1.5 Резюме

    Собственно, все необходимое для создания приложения "Hello, World!" мы разобрали по косточкам. Осталось свести воедино.

    Советую обратить внимание на директиву компилятора в начале файла hello.pp - в Win32 существует два типа приложений: графические (как наше) и консольные.

    страницы: 1 2 3 4

    Дружественный интерфейс и методы его создания. Возможности текстового режима. Простейшая графика.

    Содержание

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

    Текстовый режим

    В текстовом режиме единицей вывода информации служит символ. На экране каждый символ занимает одно знакоместо — прямоугольный участок размером 8х16 пикселей (зёрен экрана). Во весь экран помещается 80х25 знакомест .

    Курсор (мигающий прямоугольник) помечает то место на экране, куда по умолчанию будет осуществлён вывод очередного символа, — текущую позицию . Для определения текущей позиции курсора предназначена сетка координат, мысленно накладываемая на экран. Левое верхнее знакоместо имеет координаты (1,1), правое верхнее — (1,80), левое нижнее — (25,1) и правое нижнее — соответственно (25,80).

    Рассмотренные в лекции 6 процедуры Write () и WriteLn () работают именно с текстовым экраном: они выводят информацию посимвольно, начиная с текущей позиции курсора .

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

    Остальные символы выводятся на экран в «правильном» виде.

    Процедуры модуля Crt

    В предыдущей лекции мы уже упоминали, что модуль Crt , входящий в состав стандартных библиотек языка Pascal , содержит средства для работы с экраном в текстовом режиме .

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

    Активная область ввода / вывода

    Процедура Window (x1, y1, x2, y2 : Byte ) создаст на экране окно с координатами левого верхнего угла в точке (x1, y1) и координатами правого нижнего угла в точке (x2, y2) . Теперь активная область экрана будет ограничена этим окном. Текущие координаты курсора будут отсчитываться не от левого верхнего угла экрана, а от левого верхнего угла этого окна.

    Очистка

    Процедура ClrScr очистит весь экран (или активное окно); курсор будет помещён в верхний левый его угол.

    Процедура ClrEol очистит текущую строку, начиная с текущей позиции курсора и до правого края экрана (окна).

    Процедура DelLine удалит строку, в которой находится курсор.

    Процедура InsLine очистит текущую строку целиком. Курсор останется на прежней позиции.

    Цвета

    Процедура TextBackground (color : Byte ) установит цвет фона.

    Процедура TextColor (color : Byte ) установит цвет выводимого текста.

    Замечание: Вместо номера цвета возможно использовать соответствующую константу (см. табл. 14.1 или справочник ).

    Таблица 14.1. Стандартные цвета языка Pascal

    Помимо этого, можно использовать константу Blink = 128 (мерцание).

    Процедура Sound (hz : Word ) включит звуковой сигнал с частотой hz Герц.

    Процедура NoSound выключит звуковой сигнал.

    Позиционирование

    Процедура GotoXY (x, y : Byte ) переместит курсор в заданную позицию в пределах текущего окна (экрана).

    Функция WhereX : Byte вычислит положение курсора в текущем окне (или на экране): его горизонтальную составляющую. Напомним, что координата X отсчитывается от левого края экрана (окна).

    Функция WhereY : Byte вычислит положение курсора в текущем окне (или на экране): его вертикальную составляющую. Напомним, что координата Y отсчитывается от верхнего края экрана (окна).

    Ожидание

    Процедура Delay (ms : Word ) приостановит исполнение программы на ms миллисекунд.

    Функция KeyPressed : Boolean отслеживает нажатия клавиш (на клавиатуре).

    Функция ReadKey : Char возвращает код символа, чья клавиша (или комбинация клавиш) была нажата.

    Нажмите, чтобы узнать подробности

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

    Просмотр содержимого документа
    «Методы создания пользовательского интерфейса в Pascal»

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

    Текстовый режим

    В текстовом режиме единицей вывода информации служит символ. На экране каждый символ занимает одно знакоместо - прямоугольный участок размером 8х8 пикселей (зерен экрана). Во весь экран помещается 80х25 знакомест.

    Курсор (мигающий прямоугольник) помечает то место на экране, куда по умолчанию будет осуществлен вывод очередного символа, - текущуюпозицию. Для определения текущей позиции курсора предназначена сетка координат, мысленно накладываемая на экран. Левое верхнее знакоместо имеет координаты (1,1), правое верхнее - (1,80), левое нижнее - (25,1) и правое нижнее - соответственно (25,80).

    Рассмотренные в лекции 6 процедуры write() и writeln() работают именно с текстовым экраном: они выводят информацию посимвольно, начиная с текущей позиции курсора.

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

    Остальные символы выводятся на экран в "правильном" виде.

    Процедуры модуля Crt

    В предыдущей лекции мы уже упоминали, что модуль Crt, входящий в состав стандартных библиотек языка Pascal, содержит средства для работы с экраном в текстовом режиме.

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

    Активная область ввода / вывода

    Процедура Window(x1,y1,x2,y2: byte) создаст на экране окно с координатами левого верхнего угла в точке (x1,y1) и координатами правого нижнего угла в точке (x2,y2). Теперь активная область экрана будет ограничена этим окном. Текущие координаты курсора будут отсчитываться не от левого верхнего угла экрана, а от левого верхнего угла этого окна.

    Процедура ClrScr очистит весь экран (или активное окно); курсор будет помещен в верхний левый его угол.

    Процедура ClrEol очистит текущую строку, начиная с текущей позиции курсора и до правого края экрана (окна).

    Процедура DelLine удалит строку, в которой находится курсор.

    Процедура InsLine очистит текущую строку целиком. Курсор останется на прежней позиции.

    Процедура TextBackground(color: byte) установит цвет фона.

    Процедура TextColor(color: byte) установит цвет выводимого текста.

    Замечание: Вместо номера цвета возможно использовать соответствующую константу (см. табл. 14.1).

    Таблица 14.1. Стандартные цвета языка Pascal

    Стандартная константа

    Стандартная константа

    Помимо этого, можно использовать константу blink = 128 (мерцание).

    Процедура Sound(hz: word) включит звуковой сигнал с частотой hz герц.

    Процедура NoSound выключит звуковой сигнал.

    Позиционирование

    Процедура GotoXY(x,y: byte) переместит курсор в заданную позицию в пределах текущего окна (экрана).

    Функция WhereX: byte вычислит положение курсора в текущем окне (или на экране): его горизонтальную составляющую. Напомним, что координата X отсчитывается от левого края экрана (окна).

    Функция WhereY: byte вычислит положение курсора в текущем окне (или на экране): его вертикальную составляющую. Напомним, что координата Y отсчитывается от верхнего края экрана (окна).

    Процедура Delay(ms: word) приостановит исполнение программы на ms миллисекунд.

    Функция KeyPressed: boolean отслеживает нажатия клавиш (на клавиатуре).

    Функция ReadKey: char возвращает код символа, чья клавиша (или комбинация клавиш) была нажата.

    Пример использования текстовой графики

    Задача 1. Написать простейший скрин-сейвер (screen-saver) - программу, предохраняющую монитор от пережигания. Его основными чертами должны стать:

    преобладание черного фона;

    регулярная смена позиций цветовых пятен;

    прекращение работы при нажатии произвольной клавиши на клавиатуре.

    var n,i,x,y,c,t,z: word;

    then if paramstr(1)='?'

    writeln('scrsav [density: byte] (=10 by default)');

    while not keypressed do

    for i:= 1 to 10 do

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

    Создание дружественного интерфейса

    Напомним, что пользовательский интерфейс - это обеспечение взаимодействия программы и человека 1 .

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

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

    Информационная часть интерфейса, появляющаяся на экране сразу после запуска программы, называется заставкой. Заставка может содержать:

    пояснение (краткую или подробную информацию о решаемой задаче);

    информацию об авторе(-ах) программы;

    номер версии программы;

    Заставка может состоять как из отдельного экрана, который исчезает после нажатия произвольной клавиши (его сменяет рабочая область программы), так и лишь из одной строки, которая остается на экране до конца работы программы (или пока ее не вытеснит объемный вывод). Например:

    Сортировка линейного массива (до 10 000 элементов) методом пирамиды.

    Нахождение кратчайшего пути в связном графе.

    Зодиак. Определение знака гороскопа по дате рождения.

    Поиграем в крестики-нолики на доске 5х5!

    Ввод информации

    Язык Pascal относится к процедурно-ориентированным языкам, поэтому последовательность ввода информации жестко задается самой программой 2 . Эта жесткость накладывает на программиста дополнительные обязательства при оформлении интерфейса.

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

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

    Приглашения

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

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

    Введите координаты центра окружности (два целых числа -10000

    При свободном вводе пользователь, вообще говоря, может вводить что угодно (а то и вовсе что попало) и совсем не обязательно информацию в ожидаемом программой формате. А в языке Pascal, как мы уже знаем, недопустимы несоответствия типов данных. Например, если не отключен контроль ввода/вывода (см. лекцию 6), то попытка ввести букву "О", когда ожидается цифра "0", приведет к аварийной остановке программы. Еще сложнее бывает разобраться с форматами дат, вещественных чисел (часто вместо десятичной точки пользователи ставят привычную русскому человеку запятую) и т.п.

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

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

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

    Не следует думать, что вывод информации происходит только в конце работы программы. Напротив, операторами вывода прошита вся ее ткань.

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

    Адекватными выполняемой задаче

    Учитывающими контингент пользователей, на которых рассчитана программа

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

    Пример пользовательского интерфейса

    В качестве примера мы приведем программу, реализующую широко известную игру "Быки и коровы". Эта программа отслеживает все варианты некорректного ввода (первая цифра вводимого числа - не ноль; все цифры различны; вводится именно цифра, а не любой другой символ), а также нажатие клавиш ESCAPE и BACK SPACE.

    Автор программы попытался застраховать ее и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность "сдваивания" нажатой на клавиатуре клавиши, "промаха" мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру.

    Мы приводим программу в полном, работающем виде, поскольку лишь 10% ее текста не относятся к обеспечению интерфейса:

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

    Использование процедуры SetViewPort.

    В строке №20 записываем процедуру SetViewPort. Данная процедура устанавливает окно в графическом режиме Паскаля, которое является активным окном по отношению ко всему экрану. Процедура SetViewPort имеет 5 параметров. Первые 2 параметра определяют координаты левого верхнего угла окна (в нашем примере 100,100). 3-й и 4-й параметры определяют координаты правого нижнего угла (в нашем примере 300,300). Пятый параметр может принимать только 2 значения. СlipOn – означает, что элементы изображения, которые не умещаются в пределах окна, установленного процедурой SetViewPort, будут отсекаться. Clipoff означает, что изображения будут полностью вырисовываться на экране, даже если они не умещаются в окне, установленном процедурой SetViewPort (в нашем примере 5-й параметр имеет значение ClipOff). После построения окна с помощью процедуры SetViewPort все изображения на экране будут строиться, опираясь на это окно. В частности, теперь начало координат находится в левом верхнем углу окна, построенного с помощью процедуры SetViewPort, а не всего экрана.

    Строка №22. Рисуем окружность. Обратите внимание, что координаты центра окружности имеют значение (0,0). Т.е. центр окружности будет находиться в левом верхнем углу окна, построенного с помощью процедуры SetViewPort. Следует сказать, что само окно на экране не видно, поэтому на рис. снизу показана схема построения этого окна и окружности.

    Procedura SetViewPort

    Прямоугольник ABCD – окно, построенное с помощью процедуры SetViewPort. На экране монитора это окно будет невидимым. После построения окна, начало координат сместится в точку B (с реальными координатами 100,100). Поэтому окружность, которую мы построили (строка №22) имеет координаты центра (0,0), т.е. совпадает с левым верхним углом окна (реально, центр окружности имеет координаты (100,100)).

    Procedura SetViewPort.

    Procedura SetViewPort..

    Теперь изменим 5-й параметр процедуры SetVIewPort на Clipon. Т.е. отсечем изображение, выходящее за пределы окна, установленного процедурой SetViewPort. Строка №20 будет иметь вид: setviewport(100,100,300,300,clipon);.

    Читайте также: