|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перерисовка PaintBox
Большая прога долго-долго вырисовывает в PaintBox график функции. Подскажите, плз., как можно потом быстро перерисовывать это изображение, помещая его куда-нибудь, и выводя в канву при перерисовке (ну чтобы после сворачивания и открытия окна снова не ждать 2 часа, пока прога все посчитает и нарисует, а чтоб она просто брала уже готовое изображение).
|
#2
|
||||
|
||||
Так это ж просто. Создай экземпляр класса TBitmap, который будет выполнять роль Z-буфера, и рисуй на нем. Пример:
Код:
var Form1: TForm1; bm: TBitmap; ... procedure TForm1.FormCreate(Sender: TObject); var i, x, y, Radius: integer; begin bm := TBitmap.Create; bm.Width := PaintBox1.Width; bm.Height := PaintBox1.Height; for i := 1 to 20 do begin Radius := Random( 15 ); x := Random( PaintBox1.Height ); y := Random( PaintBox1.Width ); bm.Canvas.Ellipse( x, y, x+2*Radius, y+2*Radius ); end; end; После этого уже не нужно вновь пересчитывать и строить гравик, достаточно отрисовать на PaintBox содержимое bm. Код:
procedure TForm1.FormPaint(Sender: TObject); begin // Можно так // PaintBox1.Canvas.Draw( 0, 0, bm ); // Но лучше так BitBlt( PaintBox1.Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0, SRCCOPY ); end; Не забудь уничтожить Z-буфер при закрытии программы. Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin bm.Free; end; |
#3
|
|||
|
|||
Гм...
Нужен совет не про то, как это делается, а про то, как это проще исправить. На канве пейнтбокса уже выведено изображение. Вопрос в том, как это (!!!!!) изображение загнать в буфер и потом использовать при перерисовке канвы пейнтбокса.
Последний раз редактировалось krot, 23.07.2006 в 21:37. |
#4
|
||||
|
||||
Так все практичетки тоже самое. Создай BitMap размером с PaintBox:
Код:
procedure TForm1.FormCreate(Sender: TObject); begin bm := TBitmap.Create; bm.Width := PaintBox1.Width; bm.Height := PaintBox1.Height; end; Теперь сохранить содержимое PaintBox в bm можно следующим образом: Код:
BitBlt( bm.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height, PaintBox1.Canvas.Handle, 0, 0, SRCCOPY ); Ну а теперь все с точностью до наоборот, отрисовываем bm на PaintBox: Код:
BitBlt( PaintBox1.Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0, SRCCOPY ); |
#5
|
|||
|
|||
Thanks!!!!!!!!!!!!
Спасибо.
Такое большое, человеческое спасиииииииибо! |