Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TPaintBox & TImage [D7]


Страницы:   1 2

Елена ©   (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 должны быть именно такими

А почему должны?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо