Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокирование отрисовки 
:(
    Опции темы
EvgeniyK77
Дата 31.1.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Mysterio
Дата 31.1.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Планирующий
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 28.12.2004

Репутация: нет
Всего: нет



Какие именно компоненты и откуда ты их удаляешь?
PM MAIL   Вверх
586
Дата 31.1.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Form1->DoubleBuffered = true;
PM   Вверх
EvgeniyK77
Дата 31.1.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



Цитата
Какие именно компоненты и откуда ты их удаляешь?

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

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

PM MAIL   Вверх
xvr
Дата 2.2.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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

PM MAIL   Вверх
EvgeniyK77
Дата 2.2.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
xvr
Дата 2.2.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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

Правда, тут ещё надо разбираться, чей это фон, и сколько раз мы попадаем в отрисовку данного компонента.
Угу
PM MAIL   Вверх
EvgeniyK77
Дата 3.2.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



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


Это сообщение отредактировал(а) EvgeniyK77 - 3.2.2009, 09:49
PM MAIL   Вверх
xvr
Дата 3.2.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

Цитата

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

PM MAIL   Вверх
EvgeniyK77
Дата 3.2.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



Да вроде отключение нетекущих страниц ускорило загрузку.

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

PM MAIL   Вверх
586
Дата 3.2.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



А если попробовать перехватить 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;


Это сообщение отредактировал(а) 586 - 4.2.2009, 00:04
PM   Вверх
EvgeniyK77
Дата 4.2.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.8.2006

Репутация: нет
Всего: нет



Цитата
А если попробовать перехватить WM_ERASEBKGND...

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

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.