C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вопрос по Image->Canvas, Приходится все время вызывать FloodFill
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 есть рисунок, то ничего не закрашивается и рисует нормально.

Я могу ошибяться, но наверное действительно по-другому нельзя sad.gif
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 прекрасно работает и без него.

Вернуться в Вопросы программирования в C++Builder