Benish |
Отправлено: 16.02.2005, 13:25 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Есть такой кусок программы:
CODE |
Image1->Canvas->Brush->Color = clBtnFace;
Image1->Canvas->Brush->Style = bsSolid;
Kl = new Graphics::TBitmap();
Kl->LoadFromResourceName((int)HInstance,"KL");
Image1->Canvas->Draw(10,10,Kl);
Image1->Canvas->FloodFill(1,1,clBlack,fsBorder);
|
Все вроде понятно. Загружаем картинку и отрисовываем ее.
НО! Если закомментировать последную строку, то после отрисовки загруженной картинки вся канва становится белой. Вообщем после отрисовки чего-либо на канве приходится ее заливать. А нельзя ли где-то этот самый цвет заливки задать?
|
|
Sl@Sh |
Отправлено: 18.02.2005, 12:03 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Самое любопытное, что если в Image есть рисунок, то ничего не закрашивается и рисует нормально.
Я могу ошибяться, но наверное действительно по-другому нельзя
|
|
Benish |
Отправлено: 18.02.2005, 12:38 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Вообщем я переделал вот так:
Создал (напр. в констр. формы) в памяти невидимый image и закрасил его нужным цветом:
CODE |
//создаем Image в памяти для рисования на нем
// и последующего вывода
Image2 = new TImage(this);
Image2->Width = Image1->Width;
Image2->Height = Image1->Height;
Image2->Canvas->Brush->Color = clTeal;
Image2->Canvas->Rectangle(Rect(0,0,Image2->Width,Image2->Height));
|
Затем рисую что-то на нем и выкидываю на image который лежит на форме (его видно):
CODE |
Image2->Canvas->Draw(4*16,4*16,Kl);
Image2->Canvas->Draw(4*16,12*16,Kl);
//............................
// вывод изображения (копирование на видимый Image)
Image1->Canvas->CopyRect(Image1->Canvas->ClipRect,Image2->Canvas,Image2->Canvas->ClipRect);
|
НО, САМОЕ ГЛАВНОЕ! ЧТОБЫ ИЗБАВИТЬСЯ ОТ МЕРЦАНИЯ ПРИ ПЕРЕРИСОВЫВНИИ НУЖНО:
Видимый image на форме положить на Panel или на ScrollBox, а свойство этих компонент DoubleBuffered сделать true.
Свойство можно изменить только прграммно.
CODE |
// для устранения мерцания при выводе
Panel1->DoubleBuffered = true;
|
Ну а копирование изображения можно встроить в Timer. |
|
Sl@Sh |
Отправлено: 19.02.2005, 18:51 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Попробуйте DoubleBuffered не у компонентов изменить а у формы.
И ставьте его в true только на момент прорисовки т.к. это означает что рисование будет проходить в памяти.
|
|
Benish |
Отправлено: 21.02.2005, 12:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Нет, если выставить у формы, все мерцает.
А вот дополнительный image для рисования в памяти действительно не нужен, DoubleBuffered прекрасно работает и без него. |
|