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

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

PaintBox - bugs [Delphi, Windows]


Raki ©   (2004-03-12 19:44:00) 


procedure Draw(resource:string);
var
bm:Pbitmap;
begin
bm:=Newbitmap(0,0);
bm.loadfromfile(resource);
bm.draw(Paintbox1.canvas.handle,0,0);
end;

Это максимально упрощенный код из моей программы. Проблема такова: нарисовал в PaintBox картинку, затем над формой провел другим окном- все нарисованное исчезает. Я попробовал создать таймер, который каждые 100 милисекунд делает bm000.draw(Paintbox1.canvas.handle,0,0);.
Толку никакого. Что не так делаю?


SPeller   (2004-03-20 00:46:00) [1]

LMD :-))


Gandalf   (2004-03-19 10:25:00) [2]

>Кстати говоря, когда делал
>bm1:=bmt;
>вылетала ошибка Access violation...
>А если
>bm1.assign(bmt);

Так думать надо, это ведь совсем разные вещи...


Raki   (2004-03-18 22:09:00) [3]

Решение нашел довольно простое, не знаю почему сразу не допер.
Создал буферную переменную типа Pbitmap (p.x. bmt), которая хранит изображение,рассчитанное в самом начале программы.
А на On-Paint поставил:
bm1.assign(bmt);
bm1.StretchDraw(form1.PaintBox1.Canvas.Handle,PaintBox1.clientRect);
Кстати говоря, когда делал
bm1:=bmt;
вылетала ошибка Access violation...
А если
bm1.assign(bmt);
то все нормально.


Raki   (2004-03-18 22:09:00) [4]

Решение нашел довольно простое, не знаю почему сразу не допер.
Создал буферную переменную типа Pbitmap (p.x. bmt), которая хранит изображение,рассчитанное в самом начале программы.
А на On-Paint поставил:
bm1.assign(bmt);
bm1.StretchDraw(form1.PaintBox1.Canvas.Handle,PaintBox1.clientRect);
Кстати говоря, когда делал
bm1:=bmt;
вылетала ошибка Access violation...
А если
bm1.assign(bmt);
то все нормально.


Gandalf   (2004-03-13 08:22:00) [5]

может с ClientRect беда? Попробуй задать Rect  жестко - попробубуй в файл сохранить - и посмотри - если там "не то" - то у тебя где идет очистка...


Raki   (2004-03-12 22:03:00) [6]

Понимаешь, не в этом фишка. И память в коде освобождается и on paint процедура тоже есть. Но у меня код навороченный: он занимется красивым (без погрешностей) сжатием изображений размерами 800х600-1280х1024 до 166х128(типа preview). Так вот, там несколько pbitmap ов, один-исходный, другой-после конвертирования. Если конвертировать каждый раз по OnPaint-то все нормально, вот только при проце в 1.8 Ghz(AMD 2400+) это 5 секунд, когда винда замирает. Соответственно, bitmap-ы я подготавливаю еще при загрузке программы. А на OnPaint-е, грубо говоря, оставил лишь
bm1.StretchDraw(form1.PaintBox1.Canvas.Handle,PaintBox1.clientRect);
И вот таким макаром у меня перерисовка не происходит (как будто переменная bm1 сама очистилась)-почему не пойму.
P.S. NewBitmap(0,0) происходит по созданию окна
    bm.free - по уничтожению.


Gandalf   (2004-03-12 21:38:00) [7]

Мда и память надо освобождать bm.Free;


Ал   (2004-03-12 21:34:00) [8]

Прорисовку нужно делать в событии OnPaint.


Наверх

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