TestStringGrid->Cells[MovedCell. x][MovedCell. y]=tstr;

}

}

void __fastcall TTestForm::TestEditKeyPress(TObject *Sender, char &Key)

{int i, n;

n=sizeof(TrChar)/sizeof(TrChar[0]);

for (i=0;i<n;i++)

if (Key==TrChar[i].from) {Key=TrChar[i].to;break;}

if (i==n)

{for (i=0;i<n;i++)

if (Key==TrChar[i].to) break;

if (i==n) Key=0;}}

void __fastcall TTestForm::TestMemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{static int i=1;

if (Shift. Contains(ssCtrl))

{if (Key=='Y') TestMemo->Lines->Delete(TestMemo->CaretPos. y);

else if (Key=='A') TestMemo->SelectAll(); }

if (Key==VK_F2) TestMemo->Alignment=algn[i++%3];

}

void __fastcall TTestForm::FormKeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

{ if (Key=='Q' && Shift. Contains(ssAlt) && Shift. Contains(ssCtrl))

Application->Terminate();}

Вывод

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

7. Графика в C++Builder

7.1. Основы графического интерфейса Windows

В операционной системе Windows за графический интерфейс отвечает группа специализированных функций API, имеющая общее название GDI (Graphic Device Interface) [6]. Эти функции отвечают за отображение графических примитивов на устройстве отображения (окружности, линии, прямоугольники и т. п.), настройку основных инструментов отображения (цвет, тип линий, шрифт), получение информации об устройстве отображения. Располагаются функции GDI в файлах gdi. dll и gdi32.dll. Основным достоинством GDI является то, что посредством него унифицируется работа с различными устройствами отображения. Это означает, что вывод графической информации на экран монитора, принтер или плоттер выполняется в приложении Windows совершенно единообразно, а особенности того или иного устройства отображения учитываются уже самим модулем GDI в диалоге с драйвером устройства. Подобная универсальность достигается за счет использования контекста отображения для устройства. Контекст отображения представляет собой структуру данных, описывающую основные характеристики устройства, с которым он связан (размер, тип, разрешение, используемая система координат и др.). Таким образом, для вывода информации на то или иное устройство отображения (в том числе – в окно приложения), программист должен получить его контекст отображения и уже на него осуществлять вывод. Взаимодействие прикладной программы и устройства отображения в Windows показано на рис. 7.1.

НЕ нашли? Не то? Что вы ищете?


Еще одна важная функция GDI – работа с инструментами рисования. Для отображения графической информации в Windows используется большое количество инструментов – кисти, перья, шрифты, битовые изображения, регионы. Для того, чтобы использовать при выводе, например, шрифт, отличный от стандартного, программист должен создать этот шрифт специальной GDI-функцией и выбрать этот шрифт в контекст отображения. После этого функции вывода текста будут использовать именно этот шрифт для формирования изображения. В листинге 7.1 приведен пример вывода информации в окно Windows с использованием функций GDI.

Листинг 7.1. Пример работы с функциями GDI

HDC hdc;HPEN hPen;HFONT hFont;

hdc=GetDC(hWnd); //Получить контекст окна с дескриптором hWnd

hPen=CreatePen(PS_SOLID,4,RGB(255,0,0)); //создать перо

SelectObject(hdc, hPen); //выбрать перо в контекст отображения

Ellipse(hdc,100,100,200,200); //нарисовать эллипс

hFont=CreateFont(20,10,0,0,FW_THIN, TRUE, TRUE, FALSE, ANSI_CHARSET,

OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); //создать шрифт

SelectObject(hdc, hFont); //выбрать шрифт в контекст отображения

TextOut(hdc,150,150,"HELLO",5); //отобразить текст

ReleaseDC(hWnd, hdc); //освободить контекст отображения

DeleteObject(hPen); DeleteObject(hFont);//уничтожить GDI-объекты

7.2. Обзор графических компонент C++Builder

Приведенный в листинге 7.1 фрагмент программы иллюстрирует проблемы программирования с использованием API: громоздкость кода для выполнения даже простых действий, необходимость управления системными ресурсами, высокая требовательность к квалификации программиста. С++Builder предлагает ряд компонент для отображения графической информации. Достоинства этих компонент заключаются в том, что всю низкоуровневую работу вроде получения и освобождения контекстов отображения, создания и удаления тех или иных инструментов рисования они берут на себя, предоставляя программисту возможность сосредоточиться на процессе формирования нужного ему изображения.

Перечень основных графических компонент и их место в общей схеме иерархии классов VCL приведен на рис.7.2 (графические компоненты выделены). Графические компоненты С++Builder охватывают различные аспекты работы с графикой. Компонент TCanvas предоставляет пользователю удобный интерфейс для доступа к функциям GDI. Не являясь самостоятельным компонентом, объект типа TCanvas используется как свойство других компонент (например, TForm или TPrinter), заменяя собой контекст отображения. Таким образом, рисуя на канве, программист формирует изображение на том компоненте, которому данная канва принадлежит. Компонент TGraphic и производные от него классы позволяют работать с растровыми изображениями некоторого ресурса (битового изображения, метафайла, файла в формате jpeg). Компонент TPicture представляет собой контейнер для хранения графических изображений, представленных компонентами типа TGraphic. Таким образом, TPicture выступает как объект, в котором могут храниться битовый образ, пиктограмма или метафайл. Сам же объект типа TPicture может быть свойством другого компонента (например, TImage), представляя, таким образом, универсальный способ представления графики для своего владельца.


7.3. Компонент TCanvas

Компонент TCanvas представляет удобный объектно-ориентированный интерфейс с функциями GDI. При этом он не требует от программиста знания нюансов реализации графического интерфейса Windows, его методы и свойства позволяют непосредственно выводить информацию или задавать параметры вывода. Для опытных пользователей канва предоставляет дескриптор контекста отображения как одно из своих свойств, что дает возможность использовать любые функции GDI.

Основные свойства и методы компонента TCanvas приведены в таблицах 7.1 и 7.2.

Таблица 7.1.

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

Свойство

Назначение

Pen

Перо. Предназначено для установки параметров отображения линий (цвет, стиль, толщина). Экземпляр класса TPen

Brush

Кисть. Предназначено для установки параметров заливки объектов (цвет, текстура). Экземпляр класса TBrush

Font

Шрифт. Определяет параметры выводимого текста (цвет, размер, стиль). Экземпляр класса TFont

PenPos

Текущая позиция пера. Используется как опорная точка в некоторых функциях вывода (MoveTo, LineTo)

ClipRect

Определяет прямоугольный регион отсечения при выводе. Отрисовка осуществляется только внутри этого прямоугольника

Pixels

Массив цветов точек канвы. Представляет собой двумерный массив элементов типа TColor, каждый из которых Pixels[x, y] хранит цвет точки с координатами (x, y) холста (канвы)

Handle

Дескриптор контекста отображения устройства вывода, с которым связана канва

CopyMode

Определяет способ наложения рисунков при использовании метод CopyRect

Таблица 7.2.

Методы компонента TCanvas

Методы

Назначение

MoveTo

Изменяет позицию пера

LineTo

Рисует линию от позиции пера к указанной точке

Arc, Ellipse, Rectangle, Pie, Chord

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

Polygon, Polyline

Рисуют ломаные по координатам точек, Polygon замыкает ломаную и закрашивает полученную фигуру, Polyline - нет

TextOut,

TextRect

Выводят текст. TextOut - в указанную точку холста, TextRect - в рамках заданного прямоугольника

TextHeight, TextWidth,

TextExtent

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

FloodFill

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

Продолжение таблицы 7.2

CopyRect

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

Draw, StrethDraw

Рисует графический ресурс (битовый образ, пиктограмму, метафайл) на канве. Draw – в реальных размерах, StretchDraw – с масштабированием

После обзора методов и свойств можно переписать листинг 7.1 средствами C++Builder. Это возможно благодаря тому, что компонент TForm имеет свойство Canvas, представляющее собой объект класса TCanvas. Получившийся код представлен в листинге 7.2.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14