Этот топик писал(а):
Обмен опытом.
Давненько на форуме не появлялся по причине занятости новым проектом (Японские кроссворды на компе реализовывал
). Накопил опыта (по Borland C++ Builder 6) и хочу им поделиццо, если Вам это будет полезно.
Итак, случилось однажды вот что: сделал пару изменений в коде, и после того, как тыкнул кнопку Run, запустившаяся скомпиллированная прога выдавала разнообразные непонятные глюки.
Но дело оказалось отнюдь не в моей криворукости.
Я попробовал сделать
полную компилляцию (Project -> Build All Projects), и всё стало хорошо.
1) Так что если после обычной быстрой компилляции (кнопка "Run") творится неопознанное чёрти-чё, делайте полную компилляцию (т.е. выберите в закладке "Project" опцию "Build All Projects"). Возможно проблема в этом.
----------------
Ну, второй интересный нюанс касается рисования 2-мерной графики на форме. Раньше я пользовался простым способом, т.е. рисовал на форме попиксельно таким образом:
Canvas->Pixels[x][y] = RGB(r,g,b);
где "x" и "y"- координаты пикселя на форме, а "r", "g", "b" - интенсивности цветовых составляющих красного, зелёного и синего, соответственно (в диапазоне от 0 до 255).
Несмотря на предупреждения в мануале про тормознутость данного способа, мне было пофигу.
Но кроме тормознутости этого способа, у него был ещё один минус: когда окно с нарисованным на нём рисунком из пикселей закрывалось другим окном, пиксели стирались. Так что все громоздкие алгоритмы рисования приходилось записывать в тело стандартной функции "OnPaint" (чтобы она появилась, (2 новички
), надо в окошке "Object Inspector" в закладке "Events" дважды кликнуть по пустому полю "OnPaint". Коды рисования писать в появившейся автоматически сгенерированной функции. Она будет автоматически запускаться каждый раз, когда Виндус решит, что нужно перерисовать содержимое окна).
Так вот, я изучил человеческий способ вывода графики на форму.
Рисовать нужно не прямо на форме, а на отдельном рисунке, а потом при перерисовке просто отображать этот рисунок.
Как это делается, щас бибъясню.
а) сначала нужно затоварить объект "холст" для рисования.
Для этого нужно написать такой код в "*.h" в разделе "
public":
Graphics::TBitmap *Bitmap1;
где "Bitmap1" - это такое название мы дадим нашему "холсту".
б) теперь нужно описать наш "холст". Это нужно сделать как можно раньше и в "*.cpp". К примеру, в этом месте:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
Введём туда описание нашего холста, чтобы получилось вот что:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Bitmap1 =
new Graphics::TBitmap();
Bitmap1->PixelFormat = pf24bit;
Bitmap1->Height = x;
Bitmap1->Width = y;
}
где "х" и "у" - это ширина и высота (в пикселях) нашего холста (подставьте требуемые числа).
Всё, теперь мы можем пользоваться данным священным папирусом в целях рисования.
в) Рисовать на нём нужно точно также, как и на форме. К примеру, если нужно нарисовать на нём пиксел, то это будет выглядеть так:
Bitmap1->Canvas->Pixels[x][y] = RGB(r,g,b);
Чем хорош Битмап, так это тем, что то, что на нём нарисовано, никак не будет стёрто без Вашего ведома.
г) Ну и наконец вывод обрисованного "холста" на форму производится так: вместо того, чтобы писать в вышеописанной функции "OnPaint" сами коды рисования, которые прогонялись бы каждый раз при перерисовке окна, введите туда всего лишь одну строчку кода:
Canvas->Draw(0,0,Bitmap1);
Вывод Битмапа на поверхность формы - простая и безумно-быстрая операция. Поэтому это намного лучше, чем каждый раз прогонять коды рисования.
----------------
Ну и последний кусочек накопленного опыта, которым я собрался поделиццо, это функции рисования.
На собственном опыте убедился, что вывод линий, прямоугольников и т.д. выполняется намного быстрее, чем если эти фигуры рисовать с помощью пикселей.
Итак, прежде чем нарисовать какой-нить "примитив" (так, "по-научному", называются простейшие фигуры), нужно описать цвета "ручки" и "кисточки". "Ручкой" рисуются контуры, "кисточкой" - заполняется внутреннее пространство (внутренняя часть прямоугольника, к примеру).
Чтобы подступиться к настройкам цвета этих двух рисовальных агрегатов, перед рисованием примитивов пишем такой код:
Bitmap1->Canvas->Pen->Color = RGB(r,g,b); //Настройка цвета ручки
Bitmap1->Canvas->Brush->Color = RGB(r,g,b); //Настройка цвета кисточки
Когда цвет определён, можно рисовать примитив:
Линия. Для начала, поставим нашу "ручку" в место, откуда начнём вести линию:
Bitmap1->Canvas->MoveTo(x,y);
где "х" и "у" - координаты этой точки.
Затем проведём саму линию:
Bitmap1->Canvas->LineTo(y,x);
где "х", "у" - координаты точки, до которой мы протянем "ручку", т.е. это координаты конца линии. Если мы захотим провести из этой точки ещё одну линию, то "МуватьТу" нашу ручку снова не нужно, поскольку она осталась торчать там, где закончилась предыдущая линия.
Насчёт линий есть такие нюансы: последняя точка линии не прорисовывается. Не знаю, зачем так сделано, но надо иметь в виду, что линия выходит чуть короче, чем предполагалось.
Кстати, линии рисуются только с помощью "ручки", так что настраивать "кисточку" не обязательно.
Прямоугольник. Тут уже нужно настроить и "кисточку" и "ручку". "Ручкой" будут отрисованы края прямоугольника, "кисточкой" будет заполнена его внутренняя часть.
Рисуется прямоугольник так:
Bitmap1->Canvas->Rectangle(x1,y1,x2,y2);
где "х1", "у1" - координаты верхнего левого угла прямоугольника, а "х2", "у2" - нижнего правого.
Примитивов, конечно, намного больше - я только некоторые описал, т.е. те, что сам юзал.
Также и настроек у них целая куча, хотя я ограничился лишь описанием настройки цвета.
---------------
Пока всё, надеюсь, был хоть чем-то полезен...