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

Ваш аккаунт

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

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

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

Проблема с отрисовкой в memdc

32K
25 августа 2008 года
Denis1986
27 / / 25.08.2008
Пользовательский интерфейс приложения построен на базе mfc.
Я использую класс CMemDC (http://www.codeguru.com/Cpp/misc/misc/flickerfreedrawing/article.php/c389).
Я пытаюсь сделать, чтобы вся отрисовка происходила на один memdc, который передаётся от родительского окна дочерним окнам, а инициализируется в методе OnPaint() корня дерева окон моего приложения.
Код:
//CServerTrayView - корень дерева
void CServerTrayView::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    CMemDC l_mem_dc((CDC*)(&dc));
   
    CRect l_rect;
    GetClientRect(l_rect);
    l_rect.left = m_tray_bmp.bmWidth;
    l_rect.bottom = m_tray_bmp.bmHeight;
    l_mem_dc.FillSolidRect(l_rect, g_ServerTrayViewOptions -> bk_color);

    if (m_draw_splitter_flag)
        DrawServersSplitter(&l_mem_dc);
    if (m_tray_item_top.GetSafeHwnd() != NULL)
    {
        m_tray_item_top.Draw((CMemDC*)(&l_mem_dc), this);
    }
    if (m_tray_item_bottom.GetSafeHwnd() != NULL)
    {
        m_tray_item_bottom.Draw((CMemDC*)(&l_mem_dc), this);
    }
}

//CServerTrayItem - дочернее окно для CServerTrayView
void CServerTrayItem::Draw(CMemDC* a_mem_dc, CWnd* a_dc_owner)
{
    if (!m_scroll.IsWindowVisible())
    {
    CRect l_scroll_rect;
    m_scroll.GetWindowRect(&l_scroll_rect);
    a_dc_owner -> ScreenToClient(&l_scroll_rect);
    a_mem_dc -> FillSolidRect(l_scroll_rect, g_ServerTrayViewOptions -> bk_color);
    }
}

void CServerTrayItem::OnPaint()
{
}

Такой подход должен полностью исключить мелькания при перерисовке. Но та область, которая должна отрисовываться в методе Draw() класса CServerTrayItem при этом как будто нигде не отрисовывается.
Как мне реализовать эту задумку с отрисовкой всех окон в один memdc?

Буду рад любым предложениям и замечаниям :)
342
26 августа 2008 года
Yos
209 / / 21.06.2003
Цитата:
Такой подход должен полностью исключить мелькания при перерисовке.

К данному методу я пришел еще очень давно и он отлично работает

А почему как бы ничего нигде не отрисовывает (теория так как я пишу на API) - кроме контекста еще надо создать битмап соответствующего размера, поместить его в контекст, рисуем, и потом выводим в контекс отображения, причем битмап отдельно выводить не надо а копируем из контекста в видимый. А битмап можно держать статическим (создавать при отрытии приложения а удалять при завершении).

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

НО ЭТО ВСЕ ПОДХОДИТ ТОЛЬКО ДЛЯ ОСНОВНОЙ ОБЛАСТИ ОКНА а НЕ ЕГО ДОЧЕРНИХ, так как они закрывают собой ту часть которая как бы им принадлежит а выводит основное...

Так что данный метод надо применять для каждого окна в отдельности внутри его обработчиков. Кстати если внимательно почитать аннотации по вашей ссылке все становиться понятно и без моих разрисовок...

32K
27 августа 2008 года
Denis1986
27 / / 25.08.2008
Проблему удалось решить: оказалось, что я забыл убрать флаг WS_CLIPCHILDREN при создании дочерних окон (раньше отрисовка происходила совершенно иначе).
32K
27 августа 2008 года
Denis1986
27 / / 25.08.2008
Yos
Если не требуется выводить изображение, а только, скажем, фон, а на нём текст, то того, что я написал вполне достаточно. Когда нужно рисовать битмап, то я с вами согласен на счёт способа отрисовки в контекст.

Цитата:
НО ЭТО ВСЕ ПОДХОДИТ ТОЛЬКО ДЛЯ ОСНОВНОЙ ОБЛАСТИ ОКНА а НЕ ЕГО ДОЧЕРНИХ, так как они закрывают собой ту часть которая как бы им принадлежит а выводит основное...
Так что данный метод надо применять для каждого окна в отдельности внутри его обработчиков.



На данный момент все окна отрисовываются на один memdc и это работает :)

342
28 августа 2008 года
Yos
209 / / 21.06.2003
Цитата:
то того, что я написал вполне достаточно

- да, потому что взятый вами класс и так использует битмап у себя, который создает самостоятельно.

WS_CLIPCHILDREN - при работе на API при создании окна это дается на откуп писателю, по умолчанию там нет вообще никаких флагов :)))

Цитата:
На данный момент все окна отрисовываются на один memdc и это работает

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

Вообщем каждый сам выбирает свой путь :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог