Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Блокирование отрисовки


Автор: EvgeniyK77 31.1.2009, 12:58
Проблема такая. При удалении в цикле большого количества компонент видно, как они промаргивают цветом фона. Смотрится, конечно, не красиво. Можно ли как то этого избежать? Может, есть метод, который запрещает отрисовку и парный ему, разрешающий?

Автор: Mysterio 31.1.2009, 19:56
Какие именно компоненты и откуда ты их удаляешь?

Автор: 586 31.1.2009, 21:02
Form1->DoubleBuffered = true;

Автор: EvgeniyK77 31.1.2009, 21:18
Цитата
Какие именно компоненты и откуда ты их удаляешь?

Удаляются с TabSheet-а PageControl-а. А какие - не помню, так как данную программу делает коллега.
Цитата
Form1->DoubleBuffered = true;

Спасибо! Попробуем.

Автор: xvr 2.2.2009, 19:00
Цитата(EvgeniyK77 @ 31.1.2009,  21:18)
Цитата
Какие именно компоненты и откуда ты их удаляешь?

Удаляются с TabSheet-а PageControl-а. А какие - не помню, так как данную программу делает коллега.

А может будет достаточно сбросить ненужным TabSheet'ам проперть TabVisible в false?

Автор: EvgeniyK77 2.2.2009, 21:29
Цитата
А может будет достаточно сбросить ненужным TabSheet'ам проперть TabVisible в false?

А это уже есть. Промаргивает именно фон. Правда, тут ещё надо разбираться, чей это фон, и сколько раз мы попадаем в отрисовку данного компонента.

Автор: xvr 2.2.2009, 23:22
Цитата(EvgeniyK77 @ 2.2.2009,  21:29)
Цитата
А может будет достаточно сбросить ненужным TabSheet'ам проперть TabVisible в false?

А это уже есть. Промаргивает именно фон. 

Не понял - у вас удаляется целиком TabSheet или только компоненты с него? Если второе, то делать TabVisible=false нельзя - будет моргать собственно PageControl.
Цитата

Правда, тут ещё надо разбираться, чей это фон, и сколько раз мы попадаем в отрисовку данного компонента.
Угу

Автор: EvgeniyK77 3.2.2009, 09:46
Удаляется не страница целиком, а несколько (много) компонент с неё. И в процессе удаления заметно неприятное промаргивание фона.
А свойство Visible (TabVisible то тут не при чём) сбрасывается для всех страниц, кроме текущей не при удалении элементов, а при смене текущей страницы.

Автор: xvr 3.2.2009, 11:36
Цитата(EvgeniyK77 @ 3.2.2009,  09:46)
Удаляется не страница целиком, а несколько (много) компонент с неё. И в процессе удаления заметно неприятное промаргивание фона.

Понятно, тогда только двойная буферизация (DoubleBuffered = true)

Цитата

А свойство Visible (TabVisible то тут не при чём) сбрасывается для всех страниц, кроме текущей не при удалении элементов, а при смене текущей страницы.
О!  smile  Зачем? (Кстати, я говорил именно о TabVisible - оно удалит страницу из закладок в PageControl, но это именно для удаления страницы целиком)

Автор: EvgeniyK77 3.2.2009, 22:00
Да вроде отключение нетекущих страниц ускорило загрузку.

А вот с двойной буферизацией облом-с получился. Не помогло ни фига. Как промаргивал фон, так и промаргивает. 

Автор: 586 3.2.2009, 23:46
А если попробовать перехватить WM_ERASEBKGND...
Код
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:
    bool FLockEraseBkgnd;
    void __fastcall wm_erasebkgnd(TWMEraseBkgnd &msg);

    void SetLockEraseBkgnd(bool bLock);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    __property bool LockEraseBkgnd = {read=FLockEraseBkgnd, write=SetLockEraseBkgnd};

    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, wm_erasebkgnd);
    END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Код
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    FLockEraseBkgnd = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::wm_erasebkgnd(/*TMessage*/TWMEraseBkgnd &msg)
{
    if(FLockEraseBkgnd)
    {
        msg.Result = TRUE;
        return;
    }

    // default handler
    TForm::Dispatch((void*)&msg);
}

void TForm1::SetLockEraseBkgnd(bool bLock)
{
    FLockEraseBkgnd = bLock;

    if(!FLockEraseBkgnd)
    {
        InvalidateRect(Handle, NULL, TRUE);
    }
}

// твой код
Код
LockEraseBkgnd = true;

// удаление компонентов

LockEraseBkgnd = false;

Автор: EvgeniyK77 4.2.2009, 22:18
Цитата
А если попробовать перехватить WM_ERASEBKGND...

Вот... вот... вот... Я интуитивно подозревал что-то такое. Мы сначала ставили счётчики на WM_PAINT, но они давали меньшее число отрисовок, чем наблюдалось визуально. А когда я читал про InvalidateRect() из WinAPI, то обратил внимание на параметр bErase и заподозрил зацепку. Получается, что у Windows-а две фазы рисования: 1 - фон, 2 - что-то ещё?

Кстати, получилось с DoubleBuffered. Нужно было его менять на true не для формы, а для страницы.

Спасибо, кстати, отозвавшимся; вы реально помогли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)