Здравствуйте, Dervish, Вы писали:
D>Если рассматривать именно TabControl, то мерцание в нём происходит по традиционным причинам: этот контрол честно отрабатывает сообщения WM_ERASEBKGND и WM_PAINT. Двойная буферизация в реализации этого контрола не предусмотрена.
Достаточно обеспечить атомарность обработки WM_ERASEBKGND и WM_PAINT, без двойной буферизации.
LRESULT CALLBACK CWrapperTab::TabCtrlSubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_ERASEBKGND)
return 0;
if (uMsg == WM_PAINT)
{
::ValidateRect(hWnd, NULL);
HDC hControlDC = ::GetDC(hWnd);
CallWindowProc(pTabControlProc, hWnd, WM_ERASEBKGND, (WPARAM)hControlDC, 0);
CallWindowProc(pTabControlProc, hWnd, WM_PRINTCLIENT, (WPARAM)hControlDC, PRF_CLIENT);
::ReleaseDC(hWnd, hControlDC);
return 0;
}
return CallWindowProc(m_pTabProc, hWnd, uMsg, wParam, lParam);
}