Пример на Си++ Рисование графиков
Система C++Builder по своей структуре практически ничем не отличается от системы Delphi, только программа в ней составляется на языке Си++. Поэтому с принципами визуального проектирования можно познакомиться в предыдущем разделе.
Постановка задачи
Некоторая подпрограмма задает зависимость значения функции от аргумента. Надо нарисовать в окне график, показывающий эту зависимость.
Принципы рисования в C++Builder
Перерисовывать экран в Windows приходится по самым разным причинам. Например, окно было закрыто другими приложениями, свернуто или оказалось временно заслоненным своими вспомогательными окнами. При этом перерисовывать приходится или все содержимое, или только часть. Программа, созданная с помощью C++Builder, сама определяет, что и когда ей надо перерисовать, и все элементы управления тоже это «понимают». Особое требование к организации перерисовки возникает, только когда программист напрямую использует функции рисования. Все эти функции в таком случае надо размещать в обработчике события OnPaint, которое вызывается автоматически.
Технология рисования
Каждая форма в C++Builder имеет свойство Canvas (Холст), представляющее собой достаточно сложный класс с набором методов, позволяющих рисовать точки, линии, фигуры, заполнять их цветом и т. д. Для создания графика потребуются два метода этого класса — метод MoveTo(x,y), устанавливающий новое начальное положение — точку (х,у) для следующих операций рисования, и метод LineTo(x,y), проводящий линию из предыдущей точки в новую.
Метод отрисовки
После того как программа C++Builder запущена, она автоматически открывает новый проект. Дополнительные компоненты на форме размещать не надо — требуется только переопределить метод, ответственный за перерисовку изображения на форме.
Для этого в Инспекторе объектов надо выбрать закладку Events (События), на ней найти строку с названием OnPaint и дважды щелкнуть на ней мышкой. C++Builder автоматически сгенерирует соответствующий программный код обработки события перерисовки:
void fastcall TForml::FormPaint(TObject *Sender)
{
}
Алгоритм отображения графика несложен. Он умещается в нескольких операторах.
Переменные Width (Ширина) и Height (Высота) — свойства формы, определяющие ее текущую ширину и длину в пикселах. Координату по оси Y нельзя взять непосредственно из переменной у, а надо вычислять по формуле Height-y, потому что в C++Builder считается, что точка с координатами (0,0) расположена в верхнем левом углу окна, а ось Y направлена вниз. Для удобства восприятия эту ось надо перевернуть.
void fastcall TForml::FormPaint(TObject *Sender)
{
int x,y;
// начальные координаты
х = 0; у = 0;
// начальная точка графика
Canvas->MoveTo(0,Height);
// цикл, пока каждая координата очередной точки
// укладывается в размер экрана
while ( х < Width && у < Height )
{
// следующая точка по оси X
х = х + 1;
// соответствующее значение по оси Y
У = f (x) ;
// в новую точку (x,Height-y) рисуется линия
Canvas->LineTo(x,Height-y);
}
}
Чуть выше метода Form Paint надо определить функцию f(), не привязанную ни к какому классу. В ней происходит вычисление значения анализируемой математической функции по заданному аргументу. Для примера она может выглядеть так:
int f(int x)
{
int у;
у = floor(50*log(x));
return у;
}
Стандартная функция log() вычисляет значение логарифма. Коэффициент 50 нужен, чтобы кривая пропорционально размещалась в окне. Функция floor() вычисляет целую часть аргумента (преобразовывает его в целое число), потому что в методах рисования надо указывать координаты только в целых числах (пикселах).
Исходно функции log(), floor() и ряд других не подключены к текущему проекту. Чтобы они стали доступными, библиотеку, в которой они хранятся, необходимо явно указать компилятору. Делается это с помощью командной строки
#include "Math.h"
которую можно поместить в самое начало текущего файла.
Далее проект надо сохранить, выполнить компиляцию и запустить, нажав клавишу F9.В дальнейшем, изменив один оператор присваивания в функции f() и подобрав подходящие коэффициенты, с помощью этой программы можно строить самые разные графики.