Я читал много проблем с попыткой двойной буферизации элемента управления richedit, но не видел прямых ответов на этот конкретный вопрос (было бы здорово иметь цитату / ссылку, где у Microsoft есть официальное заявление) .
Вот код (VCL / Delphi / Borland Builder 6.0), который я использовал для тестирования:
if(Message.Msg == WM_PAINT)
{
HDC dc = GetDC(0);
HBITMAP memBitmap = CreateCompatibleBitmap(dc,ClientRect.Right,ClientRect.Bottom);
ReleaseDC(0,dc);
HBITMAP memDC = CreateCompatibleDC(0);
HBITMAP oldBitmap = SelectObject(memDC,memBitmap);
try{
//PAINTSTRUCT ps;
//dc = BeginPaint(Handle,&ps);
dc = GetDC(Handle);
Message.WParam = (int)memDC;
inherited::WndProc(Message);
Message.WParam = 0;
//BitBlt(dc,0,0,ClientRect.Right,ClientRect.Bottom,memDC,0,0,SRCCOPY);
ReleaseDC(Handle,dc);
//EndPaint(Handle,&ps);
} __finally
{
SelectObject(memDC,oldBitmap);
DeleteDC(memDC);
DeleteObject(memBitmap);
}
return;
}
Если я вызову BeginPaint () перед унаследованным :: WndProc () (который передает сообщение элементу управления для тех, кто не знает VCL), то этот элемент управления не рисует ничего на моем контроллере памяти или фактическом DC окна , Если я вместо этого вызываю GetDC (), элемент управления по-прежнему не обращается к DC памяти, но затем он обращается непосредственно к окну DC. Я подтверждаю это, комментируя мой вызов BitBlt () ... если он не закомментирован, клиентская область полностью черная (имеется в виду, что элемент управления вообще не рисует на DC памяти), если я закомментирую эту строку, элемент управления отображается правильно (это означает, что он игнорировал DC-память WParam и перешел непосредственно к окну DC).
Звучит так, будто я ответил на свой вопрос, но я действительно хочу получить подтверждение от других (ссылка на статью MS KB или MSDN была бы отличной, поэтому я могу показать своего босса :), И, возможно, другое идеи для достижения двойной буферизации? Я не могу использовать большинство обнаруженных мною взломов, например скрытие элемента управления вне экрана или использование WM_PRINT, потому что мне нужен этот элемент управления для работы с пользовательским вводом и полосами прокрутки, это не только для чтения для отображения.
Кроме того, элемент управления использует RichEdit 2.0, хотя я использую VCL ... он был изменен для создания окна как класса "richedit20a". Я также подтвердил, что слой VCL вообще не мешает рисованию, поэтому такое же поведение следует видеть с чистым кодом win32.