Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Устранение мерцания

4.3K
24 августа 2006 года
flat
142 / / 27.12.2005
Господа, я не могу спокойно спать! Я знаю, для того чтобы картинка не мерцала при перерисовке формы, необходимо использовать механизм двойной буферизации. Я понимаю это так: создается объект TBitmap, на его канве рисуется изображение, затем Bitmap копируется на интересующую нас канву. Примерно так:
 
Код:
Graphics::TBitmap * bmp = new Graphics::TBitmap;
// ...
bmp->Canvas->Ellips(0, 0, 10, 10);
Image->Canvas->Draw(0, 0, bmp);

Все равно мерцает! Расскажите, как все таки правильно?
1.9K
24 августа 2006 года
SABROG
242 / / 26.01.2006
Пытался рисовать на канве Form1, при событии OnPaint рисую картинку, ничего не мерцает. Кинул на форму Panel1 и Splitter1, перерисовываю Panel1 каждый раз при движении Splitter1 (OnMove). Тоже ничего не мерцает. Для общего развития инфа как получить доступ к канве любого объекта, который по логике является окном Windows, т.е. любой визуальный элемент.

 
Код:
TCanvas *PanCan;
HDC PanDC;

PanCan = new TCanvas;
PanDC = GetDC(Panel1->Handle);
PanCan->Handle = PanDC;

BtnCan->Draw(0,0,pBitmap);


Соответственно рисуя на PanCan изображение теперь появляется на Панеле. При желании можно сделать свою кнопку аля BitBtn.
9.5K
24 августа 2006 года
ROLpogo
80 / / 22.08.2006
Попробуйте положить Image на панель Panel1 и в конструкторе формы прописать:

Panel1->DoubleBuffered = true;
1.9K
24 августа 2006 года
SABROG
242 / / 26.01.2006
Судя по хелпу к билдеру, можно включать DoubleBuffered = true;
Для отслеживания прорисовки и уменьшения мерцания, а также метод Invalidate() для немедленной прорисовки, опять же с уменьшением мерцания. Вот описалово:
Цитата:

Determines whether the control’s image is rendered directly to the window or painted to an in-memory bitmap first.

__property bool DoubleBuffered = {read=FDoubleBuffered, write=FDoubleBuffered, nodefault};

Description

When DoubleBuffered is false, the windowed control paints itself directly to the window. When DoubleBuffered is true, the windowed control paints itself to an in-memory bitmap that is then used to paint the window. Double buffering reduces the amount of flicker when the control repaints, but is more memory intensive.

When a windowed control is a dock site and has an associated dock manager, it must be double-buffered.

Note: Some controls, such as TRichEdit, can’t paint themselves into a bitmap. For such controls, DoubleBuffered must be set to false.



Цитата:

Completely repaint control.

virtual void __fastcall Invalidate(void);

Description

Use Invalidate when the entire control needs to be repainted. When more than one region within the control needs repainting, Invalidate will cause the entire window to be repainted in a single pass, avoiding flicker caused by redundant repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted.

4.3K
28 августа 2006 года
flat
142 / / 27.12.2005
Хорошая инфа по теме
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог