Проблема с отрисовкой в memdc
Я использую класс CMemDC (http://www.codeguru.com/Cpp/misc/misc/flickerfreedrawing/article.php/c389).
Я пытаюсь сделать, чтобы вся отрисовка происходила на один memdc, который передаётся от родительского окна дочерним окнам, а инициализируется в методе OnPaint() корня дерева окон моего приложения.
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?
Буду рад любым предложениям и замечаниям :)
К данному методу я пришел еще очень давно и он отлично работает
А почему как бы ничего нигде не отрисовывает (теория так как я пишу на API) - кроме контекста еще надо создать битмап соответствующего размера, поместить его в контекст, рисуем, и потом выводим в контекс отображения, причем битмап отдельно выводить не надо а копируем из контекста в видимый. А битмап можно держать статическим (создавать при отрытии приложения а удалять при завершении).
Кстати решается стандартная процедура при перерисовке - если ничего не произошло, кроме к примеру перетаскивание чужого окна над твоим, просто выводиш твой ранее сформированный битмап...
НО ЭТО ВСЕ ПОДХОДИТ ТОЛЬКО ДЛЯ ОСНОВНОЙ ОБЛАСТИ ОКНА а НЕ ЕГО ДОЧЕРНИХ, так как они закрывают собой ту часть которая как бы им принадлежит а выводит основное...
Так что данный метод надо применять для каждого окна в отдельности внутри его обработчиков. Кстати если внимательно почитать аннотации по вашей ссылке все становиться понятно и без моих разрисовок...
Если не требуется выводить изображение, а только, скажем, фон, а на нём текст, то того, что я написал вполне достаточно. Когда нужно рисовать битмап, то я с вами согласен на счёт способа отрисовки в контекст.
Так что данный метод надо применять для каждого окна в отдельности внутри его обработчиков.
На данный момент все окна отрисовываются на один memdc и это работает :)
- да, потому что взятый вами класс и так использует битмап у себя, который создает самостоятельно.
WS_CLIPCHILDREN - при работе на API при создании окна это дается на откуп писателю, по умолчанию там нет вообще никаких флагов :)))
- тута есть один нехороший момент, как пример изменение в дочернем окне, если при этом вывод делается только в memdc а его выводит основное. Тады надо еще оповещение основного делать, а это, на мой субъективный взгляд, лишние операции и загромождение кода...
Вообщем каждый сам выбирает свой путь :)