![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPaintBox & TImage [D7]
Елена © (2011-11-22 00:33:00)Добрый вечер мастера. Пожалуйста помогите в таком вот вопросе - нужно нарисовать на форме пиксельную сетку, наподобие формы Delphi на этапе проэктирования.
Сделать можно так:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i,j: Integer;
Step: Integer;
begin
Step := 10;
for i := 0 to 10000 div Step do
for j := 0 to 7000 div Step do
PaintBox1.Canvas.Pixels[i*Step,j*Step] := clBlack;
end;
Но это будет требовать постоянной перерисовки, в результате чего будет подтормаживать, а размеры 10000Х7000 должны быть именно такими (может даже больше).
Если нарисовать подобным образом на TImage, то на размере его более 2000px вылазит белый фон, с которым ничего не поделаеш.
Как быть?
Anatoly Podgoretsky (2011-11-22 11:06:00) [21]> Омлет (22.11.2011 11:00:09) [9]
Это особенность Виндоус
Омлет (2011-11-22 11:00:00) [22]> Кстати TImage перерисовывает что нужно, а не все подряд
Это в какой версии Дельфи?
Anatoly Podgoretsky (2011-11-22 09:55:00) [23]
> Но это будет требовать постоянной перерисовки,
Но это принципы работы виндоус, в любой момент изображение на экране может быть зменено другим, так что или ты сама постоянно перерисовываешь, или используешь TImage, который это делает за тебя, то что у тебя ничего не выходит с TImage значения не имеет.
Кстати TImage перерисовывает что нужно, а не все подряд
Омлет (2011-11-22 09:35:00) [24]> Елена (22.11.11 00:33)
1. Pixels в циклах категорически нежелательно использовать, т.к. это медленная операция. Чтобы выводить линии, пользуйтесь методами MoveTo и LineTo.
2. Перерисовывать надо только видимую часть и только требующую перерисовки область.
3. TImage - выкинуть и забыть.
KilkennyCat (2011-11-22 02:12:00) [25]
>
> Это как?
еще раз:
при запуске программы:
создаем битмап fonBMP, квадрат, равен какому-нить разумному размеру, например, четверть от монитора.;
Об этом можно прочитать в справке про TBitMap, TScreen
рисуем на fonBMP.Canvas сетку.
создаем битмап mainBMP с размером, равным отображаемому.
работа программы:
при ресайзинге:
изменяем размер mainBMP
при скроллинге или иных причинах перерисовки делаем следующее:
заполняем mainBMP содержимым fonBMP с учетом смещения скроллинга (создаем эффект движения сетки при скроллинге) при помощи функции BitBlt (читаем про нее в MSDN)
если координаты скроллинга сообщают нам о том, что это будет видно, рисуем на mainBMP то, что собственно хотим.
при помощи BitBlt копируем mainBMP на хоть Form.canvas
по окончании программы:
убиваем mainBMP и fonBMP
Елена (2011-11-22 01:44:00) [26]
> KilkennyCat © (22.11.11 00:50) [2]
TImage или TPaintBox находится в ScrollBox, чтобы прокручивать этот размер, а монитор самый обычный.
> может, стоит рисовать только то, что будет видно?
> то нарисуй ее один раз, на битмаре, и не удаляй его.
> а потом просто берешь новый битмап, делаешь на него BitBlt()
> битмапа фона и рисуешь остальное.
Это как?
KilkennyCat (2011-11-22 00:53:00) [27]да, ну и в конечном итоге BitBlt на че хочешь, паинтбокс, имадж, хоть сразу на форму.
KilkennyCat (2011-11-22 00:52:00) [28]
> Но это будет требовать постоянной перерисовки,
все зависит от того, что ты хочешь сделать. если эта сетка является фоном для всего остального, то нарисуй ее один раз, на битмаре, и не удаляй его.
а потом просто берешь новый битмап, делаешь на него BitBlt() битмапа фона и рисуешь остальное.
если остальное такого же рода, то и с ним точно также - BitBlt битмапов.
KilkennyCat (2011-11-22 00:50:00) [29]
> размеры 10000Х7000
у тебя такой монитор? офигеть....
может, стоит рисовать только то, что будет видно?
Германн (2011-11-22 00:48:00) [30]
> а размеры 10000Х7000 должны быть именно такими
А почему должны?