КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Поддержка графики и графические компоненты
Упражнения 1. В заданном тексте выполнить замену заданного слова (если слово встречается несколько раз, то замену выполнить каждый раз) другим словом, также заданным. 2. Удалить в тексте строки, содержащие заданное слово. 3. Текст представляет собой сведения об успеваемости студентов. Строка содержит фамилию студента и результаты сдачи экзаменов. Упорядочить строки в соответствии с убыванием среднего балла. 5. Файл содержит последовательность чисел. Переставить числа в обратном порядке. 6. Файл содержит последовательность чисел. Упорядочить последовательность чисел в файле, считывая в память не более двух чисел. Система Windows предоставляет средства рисования GDI (Graphics Device Interface) для построения графических изображений на графическом контексте независимо от типа устройства вывода. При прямом вызове функций GDI им необходимо передавать дескриптор контекста устройства (HDC – device context handle), который задает инструменты рисования. Графический контекст представляет модель графического устройства. После завершения работы c изображениями, необходимо восстановить контекст устройства в исходное состояние и освободить его. C++Builder берет на себя работу GDI, связанную с поиском дескрипторов изображений и ресурсов памяти. Разрешается прямое обращение приложений к функциям Windows GDI. Рассмотрим пример:
void __fastcall TForm1::Button1Click(TObject *Sender) { HDC hdc =Canvas->Handle; LineTo(hdc,100,100); MessageBox(Form1->Handle,"Вызов Windows API","",MB_OK); }
C++Builder предоставляет простой интерфейс посредством свойства Canvas графических компонентов. Это свойство инициализирует и освободждает контекст устройства. Свойство Canvas представляет собой класс, инкапсулирующий свойства и методы для работы с графикой. В среде C++Builder три способа для работы с графикой: • Канва предоставляет битовую карту поверхности для рисования на форме, графическом компоненте, или на другом битовом образе. Кроме формы, для рисования используются объекты классов TImage и TPaintBox. Canvas является свойством этих классов. Рассмотрим пример рисования на форме:
void __fastcall TForm1::FormPaint(TObject *Sender) { Canvas->Pen->Color = clBlue; // выбрать цвет контура Canvas->Brush->Color = clYellow; // выбрать цвет заливки Canvas->Ellipse(10, 20, 50, 50); // нарисовать эллипс }
Метод FormPaint здесь вызывается событием OnPaint формы при ее рисовании. Отметим, что при рисовании непосредственно на форме возникает ряд проблем, связанных с ее перерисовкой. В следующем примере рассматриваются различные способы задания цвета формы и цвета линий для рисования на компоненте TImage.
void __fastcall TForm1::Button1Click(TObject *Sender) { if (ColorDialog1->Execute()) { Form1->Color = ColorDialog1->Color; } } void __fastcall TForm1::Button2Click(TObject *Sender) { Image1->Canvas->Pen->Width=2; randomize(); Image1->Canvas->Pen->Color =(Graphics::TColor)random(256); Image1->Canvas->LineTo(100,200); } При нажатии на первую кнопку выбирается цвет формы, при нажатии на вторую кнопку рисуются линии случайно выбранным цветом. • Графика ( TGraphic ) представляет абстрактный базовый класс для работы с графикой. C++Builder определяет графические классы TBitmap, TClipBoard, TImage, TIcon и TMetafile, производные от базового класса TGraphic. Объекты этих классов используют методы рисования на канве и имеют собственные методы. Широко используются методы класса TGraphic LoadFromClipboardFormat(), LoadFromFile(), LoadFromStream(), SaveToClipboardFormat(), SaveToFile(), SaveToStream(). • Рисунок ( TPicture ) представляет собой контейнер для графических объектов и может содержать любые графические объекты. Свойствами этого класса являются: Bitmap, Graphic, Icon, Metafile, PictureAdapter. Контейнерный класс TPicture может содержать битовый образ, пиктограмму, метафайл или некоторый другой графический тип, а приложение будет обращаться ко всем объектам контейнера посредством объекта класса TPicture. Если необходимо указать доступ к конкретному графическому объекту, задайте его в свойстве Graphic данного рисунка. Методы этого класса: LoadFromClipboardFormat(), LoadFromFile(), LoadFromStream(), SaveToClipboardFormat(), SaveToFile(), SaveToStream(). Использование канвы. Класс Canvas инкапсулирует графические функции Windows на различных уровнях, начиная с функций высокого уровня для рисования линий, фигур и текста. Далее идут свойства и методы среднего уровня для манипуляций с канвой. В табл. 7 приводятся характеристики основных методов и свойств канвы.
Таблица 7
Объекты класса Canvas являются свойствами формы и всех графических объектов, например TForm, TImage, TBitmap. Рассмотрим пример:
void __fastcall TForm1::FormActivate(TObject *Sender){ WindowState = wsMaximized; Timer1->Interval = 50; randomize(); } //----------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { int x, y; x = random(Screen->Width - 10); y = random(Screen->Height - 10); Canvas->Pen->Color = clYellow; Canvas->Brush->Color = (Graphics::TColor) random(256); switch (random(5)) { case 0: Canvas->Pen->Style = psSolid; break; // стиль линии case 1: Canvas->Pen->Style = psDash; break; case 2: Canvas->Pen->Style = psDot; break; case 3: Canvas->Pen->Style = psDashDot; break; case 4: Canvas->Pen->Style = psDashDotDot; break; } Canvas->Rectangle(x, y, x + random(400), y + random(400)); }
Здесь в методе FormActivate() формы задается интервал времени, через который происходит событие OnTimer компонента TTimer, которое осуществляет перерисовку прямоугольника на форме. В качестве примера рассмотрим рисование графика функции y=f(x). Пусть x принимает значения из промежутка [x1, x2], а y изменяется в промежутке [y1, y2]. График функции будем рисовать в прямоугольнике на экране с координатами верхнего левого угла (Х1, Y1) и нижнего правого угла – (X2, Y2). Таким образом, необходимо выполнить масштабирование: преобразование координат точек функции (x,f(x)) в соответствующие координаты точек (пикселей) заданного прямоугольника на экране. В процессе преобразования будем учитывать, что ось Oy на экране имеет направление сверху вниз. Поэтому изменим направления оси Oy в заданном прямоугольнике на экране на привычное для нас направление снизу вверх. Для преобразования координат точки функции (x, y) в координаты соответствующего пикселя (X, Y) на экране можно использовать следующие формулы: X=X1+[(X2-X1)/(x2-x1)](x-x1); Y=Y2-[(Y2-Y1)/(y2-y1)](y-y1). Ниже приводится фрагмент программы для рисования графика функции y=cos x, где x изменяется в промежутке [0, 2π]. График будем рисовать на всей поверхности компонента Image1, т. е. x [0,Image1->Width], а y [0,Image1->Height]. Получим следующий код:
#define pi 3.14159 double X,Y; // координаты точек функции int PX,PY; // координаты пикселей на экране Y=cos(0); PY=Image1->Height-Image1->Height/2*(Y+1); Image1->Canvas->MoveTo(0,PY); // перемещаем перо в начальную // точку рисования графика for(X=0.05;X<=2*pi;X+=0.05){ Y=cos(X); PX=Image1->Width/(2*pi)*X; PY=Image1->Height-Image1->Height/2*(Y+1); Image1->Canvas->LineTo(PX,PY); }
Графические файлы. Приложения C++Builder поддерживают загрузку и сохранение рисунков и графиков в файлах изображений. Для загрузки изображения из файла можно использовать метод LoadFromFile(). Чтобы сохранить изображение в файле, используется метод SaveToFile(). Единственным параметром этих методов является имя файла. Рисунок распознает стандартное расширение файлов битовых образов.bmp и создает свою графику как объект класса TBitmap, а затем вызывает метод LoadFromFile загрузки изображения из файла с указанным именем. Ниже приводится пример приложения, иллюстрирующего работу с графическим компонентом TImage. На рис. 18 приведена форма приложения в процессе проектирования. Рис. 18. Форма в процессе проектирования
// Обработчик событий для перемещения мыши по // компоненту Image1 void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if((Shift.Contains(ssLeft)) && (drawFlag)) Image1->Canvas->LineTo(X,Y); else Image1->Canvas->MoveTo(X,Y); } //--------------------------------------------------------------------------- // Обработчик события нажатия на клавишу мыши void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {drawFlag=true; } //--------------------------------------------------------------------------- // Обработчик события отпускания клавиши мыши void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { drawFlag=false; } //--------------------------------------------------------------------------- // Обработчик события для кнопки Close void __fastcall TForm1::Button1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- // Обработчик события для кнопки Color void __fastcall TForm1::Button2Click(TObject *Sender) { if(ColorDialog1->Execute()) Image1->Canvas->Pen->Color = ColorDialog1->Color; } //--------------------------------------------------------------------------- // Обработчик события для кнопки LoadPicture void __fastcall TForm1::Button3Click(TObject *Sender) { if (OpenDialog1->Execute()) Image1->Picture->LoadFromFile(OpenDialog1->FileName); } //--------------------------------------------------------------------------- // Обработчик события для кнопки SavePicture void __fastcall TForm1::Button4Click(TObject *Sender) { if (SaveDialog1->Execute()) Image1->Picture->SaveToFile(SaveDialog1->FileName); } //--------------------------------------------------------------------------- // Обработчик изменений в компоненте CSpinEdit1 void __fastcall TForm1::CSpinEdit1Change(TObject *Sender) { Image1->Canvas->Pen->Width= CSpinEdit1->Value; }
Обслуживание палитр. Компонентам, содержащим графические изображения, может потребоваться взаимодействие с Windows и экранным драйвером, чтобы обеспечить надлежащее отображение данных компонентов. Реализация палитр призвана обеспечить, чтобы самое верхнее активное окно использовало полную цветовую палитру, в то время как фоновые окна максимально использовали оставшиеся цвета палитр. C++Builder не содержит самостоятельных средств для создания и обслуживания иных палитр, кроме палитры битовых образов. Однако, можно получить дескриптор некоторой палитры с помощью метода GetPalette(), а затем воспользоваться методом Windows API CreatePalette(). Компоненты C++Builder автоматически поддерживают механизм реализации палитр. Таким образом, если компонент имеет палитру, вы можете воспользоваться двумя методами GetPalette() и PaletteChanged(), наследованными от базового компонентного класса TControl, чтобы управлять тем, как Windows обращается с этой палитрой. Когда ваш компонент ассоциируется с некоторой палитрой посредством перегрузки метода GetPalette(), C++Builder автоматически берет на себя реакцию на сообщения Windows от палитр с помощью метода PaletteChanged(). Внеэкранные битовые образы. Методика программирования графических приложений заключается в создании внеэкранного битового образа, заполнении его конкретным изображением и копировании изображения из битового образа в экранное окно. Благодаря этому уменьшается заметное глазу мерцание экрана монитора, вызванное повторным рисованием непосредственно в экранном окне. C++Builder позволяет создавать объекты класса TBitmap для представления изображений файлов и других ресурсов, которые также способны работать как внеэкранные изображения. C++Builder предусматривает четыре способа копирования изображений, которые приведены в табл. 8. Таблица 8
Далее приводится пример копирования изображения в обработчике события для кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); try { pBitmap->LoadFromFile("C:\\factory.bmp "); pBitmap->Transparent = true; pBitmap->TransparentColor = pBitmap->Canvas->Pixels[50,50]; Form1->Canvas->Draw(0,0,pBitmap); pBitmap->TransparentMode = tmAuto; Form1->Canvas->Draw(50,50,pBitmap); } catch (...) {ShowMessage("Нельзя загрузить или отобразить изображение"); } delete pBitmap; } Анимация. Для воспроизведения анимации, состоящей в последовательном отображении кадров из стандартных avi-файлов Windows используется компонент Animate из страницы Win32 Палитры компонентов. Последовательность действий может быть следующей:
Animate1->FileName=”p.avi”; Animate1->play(1, Animate1->FrameCount,1); Animate1->stop();
Для обеспечения процесса мультимедиа и воспроизведения звука и анимации при отображении war-, rmi-, mid-файлов используется компонент MediaPlayer(страница System). При анимации широко используется невидимый компонент Timer. При этом в одном из методов, например FormCreate() или Button1Click(), устанавливается частота прерывания: Timer1->Interval=time; Компонент Timer генерирует событие OnTimer, в обработчике которого осуществляется перерисовка. Вопросы 1. Как установить режимы рисования на канве? Какие режимы есть у пера? 2. Как очистить поверхность графического компонента Image? 3. Как установить цвет и ширину линии, которой рисуется график функции? 4. Назовите основные методы для рисования класса Canvas. 5. Назовите основные события графических компонентов Image и PaintBox. 6. Как вывести текст в графические компоненты? 7. Как вывести на графическом экране: a) точку в позицию, указанную курсором мыши; б) свою фотографию, загруженную из графического файла; в) установить толщину линии, ее цвет и провести линию указанной длины и под заданным углом. 8. Как установить цвет рисунка при использовании графики и нарисовать указанным цветом две касающихся внутренним образом окружности? 9. Опишите методику анимации изображения. 10. Какой режим пера Pen используется для удаления рисунка при повторном его рисовании? 11. Какие свойства имеет компонент Timer? 12. Назовите основные события мыши. 13. Как в программе распознать координаты курсора мыши? 14. Как распознать нажатую кнопку мыши? 15. Когда наступают события мыши OnStartDrag, OnDragOver, OnDragDrop, OnEndDrag? Что можно распознать при обработке этих событий? 16. С помощью какой клавиши клавиатуры можно перемещать фокус с элемента на элемент? 17. Какие способы вывода графической информации Вы знаете? 18. Какие проблемы могут возникнуть при рисовании непосредственно на форме? Как их преодолеть? Почему такие проблемы не возникают при использовании компонента Image? 19. С помощью какого метода класса Canvas можно вывести текст? Упражнения 1. Нарисовать график функции y=sin x. 2. Нарисовать график функции y=-2x2+3x. 3. Вывести аналоговые часы (со стрелками). Предусмотреть кнопку для запуска и остановки часов. Использовать функцию Time() и класс TDataTime для получения текущего времени. 4. “Летающий” шарик. По достижении границы компонента он отражается от границы по правилам отражения. Предусмотреть кнопку остановки и запуска шарика. 5. Точка равномерно движется по окружности. Предусмотреть возможность увеличения скорости движения. 6. Построить простейший графический редактор с возможностью выбора цвета рисования. 7. Равносторонний треугольник вращается вокруг своего центра. Предусмотреть возможность увеличения скорости вращения. 8. Изобразить прямоугольник (квадрат), вращающийся вокруг своего центра. Предусмотреть возможность увеличения скорости вращения. 9. Вращаются два отрезка, каждый вокруг своей концевой точки. Предусмотреть возможность изменения скорости вращения каждого отрезка отдельно. 10. “Ипподром”. Играющий выбирает одну из трех лошадей, состязающихся на бегах, и выигрывает, если его лошадь приходит первой. Скорость передвижения лошадей на разных этапах выбирается программой с помощью датчика случайных чисел. 11. Игра в слова. Программа выбирает слово и рисует на экране столько прочерков, сколько букв в слове. Отгадать, какое слово загадано программой. За один ход играющий указывает одну букву. Если буква не угадана, то играющий теряет одно очко. В начальный момент у играющего 15 очков. 12. Требуется ввести курсор в область экрана (небольшой круг), расположение которого неизвестно играющему. Если курсор приближается к области, то его цвет становится ярче, если удаляется, то тускнеет.
Дата добавления: 2014-12-27; Просмотров: 965; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |