Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [wx] Двойная буферизация, мерцание при перерисовке 
:(
    Опции темы
monax
Дата 28.10.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На панели (wxPanel) во время перерисовки (OnPaint) всё очень сильно мерцает. Пробовал двойную буферизацию - эффект тот же.
Код

void DFrame::OnPaint(wxPaintEvent& event)
{
    wxPaintDC dc(design);
    PrepareDC(dc);
    wxBitmap bitmap(dc.GetSize().GetWidth(), dc.GetSize().GetHeight(), -1);

    wxMemoryDC mdc;
    mdc.SelectObject(bitmap);
    mdc.SetBackground(*wxWHITE_BRUSH);
    mdc.Clear();

    // нарисовать сетку из точек
    const int step = 10;
    mdc.SetPen(*wxLIGHT_GREY);
    int width = mdc.GetSize().GetWidth();
    int height = mdc.GetSize().GetHeight();
    for (int i = 0; i < width; i += step) {
        for (int j = 0; j < height; j += step) {
            mdc.DrawPoint(i, j);
        }
    }

    mdc.SelectObject(wxNullBitmap);

    dc.DrawBitmap(bitmap, 0, 0, true);
}


Перерисовка происходит, когда двигается мышь с нажатой кнопкой.
Код

void DFrame::mouseMotion(wxMouseEvent& event)
{
    if (isDrag)
    {
        // перетаскивание
        int x = event.GetX();
        int y = event.GetY();
        draggedElement->position.x += (x - prevX);
        draggedElement->position.y += (y - prevY);
        prevX = x;
        prevY = y;
        Refresh(true);
        Update();
    }
}

--------------------
Лаборатория программиста
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 28.10.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



создайте обработчик панели для wxEraseBackgroundEvent 
Код

{
   event.Skip (false);
}



--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 28.10.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



во-первых, вы продолжаете делать двойную буфферизацию:
пишете в mdc, а потом делаете дамп битмапы на нужный DC из памяти.

согласен с предыдущим советом, и кроме того, в туториалах, к-рые как я видел использовали wxMemoryDC как вспомогательный буффер, 
делали так:
Код

retval=dc.Blit(0,0,dc.GetSize().GetWidth(), dc.GetSize().GetHeight(),
         &mdc,0,0,dc.GetSize().GetWidth(), dc.GetSize().GetHeight());
if (!retval) ::MessageBox(//что-то тут);

или использовали wxBufferedPaintDC и писали всё на него.
он в дестракторе выплёвывает всё одним Blit()-ом на экран.
т.е. не заморачивались с этими битмапами без надобности.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
monax
Дата 28.10.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mes, спасибо, мерцание исчезло.


bilbobagginz, по поводу использования Blit - это один из методов. Вот текст из официального руководства, там DrawBitmap идёт как альтернатива Blit-у.
Код

    // Draw a bitmap using a wxMemoryDC
    wxMemoryDC memDC;
    memDC.SelectObject(bitmap);
    // Draw the bitmap at 100, 100 on the destination DC
    destDC.Blit(100, 100,                              // Draw at (100, 100)
                bitmap.GetWidth(), bitmap.GetHeight(), // Draw full bitmap
                & memDC,                               // Draw from memDC
                0, 0,                                  // Draw from bitmap origin
                wxCOPY,                                // Logical operation
                true);                                 // Take mask into account
    memDC.SelectObject(wxNullBitmap);
    // Alternative method: use DrawBitmap
    destDC.DrawBitmap(bitmap, 100, 100, true);


Разницу между двумя этими подходами я не знаю, но результат меня устраивает. К тому жу DrawBitmap проще понять, а мой код предстоит читать инженерам, которые не имеют ИТ-шнго образования и большого опыта в программировании.

--------------------
Лаборатория программиста
PM MAIL WWW ICQ Jabber   Вверх
t_rex
Дата 28.10.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

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



--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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