Элемент управления Richedit 2.0 игнорирует WParam для сообщений WM_PAINT?
Я читал много проблем с попыткой двойной буферизации элемента управления 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), то этот элемент управления не рисует ничего на моем контроллере памяти или фактическом контроллере окна. Если я вместо этого вызываю GetDC(), элемент управления по-прежнему не обращается к DC памяти, но затем он обращается непосредственно к окну DC. Я подтверждаю это, комментируя мой вызов BitBlt()... если он не закомментирован, клиентская область полностью черная (имеется в виду, что элемент управления вообще не рисует на DC памяти), если я закомментирую эту строку, элемент управления отображается правильно (это означает, что он игнорировал DC-память WParam и перешел непосредственно к окну DC).
Звучит так, будто я ответил на свой вопрос, но я действительно хочу получить подтверждение от других (ссылка на статью MS KB или MSDN была бы отличной, поэтому я могу показать своего босса:) И возможные другие идеи для достижения двойной буферизации? Я не могу использовать большинство хаков, которые я нашел, например, скрывать элемент управления вне экрана или использовать WM_PRINT, потому что мне нужен этот элемент управления для фактической работы с пользовательским вводом и полосами прокрутки, а не только для чтения для отображения.
Кроме того, элемент управления использует RichEdit 2.0, хотя я использую VCL.. он был изменен, чтобы создать окно как класс "richedit20a". Я также подтвердил, что слой VCL вообще не мешает рисованию, поэтому такое же поведение следует видеть с чистым кодом win32.
1 ответ
что я действительно хочу, так это подтверждение от других (ссылка на статью MS KB или MSDN была бы отличной, так что я могу показать своего босса:)
Как насчет очевидного местоположения: документация для WM_PAINT
сообщение, в котором четко говорится
WPARAM
Этот параметр не используется.
Поэтому нет оснований ожидать, что изменение wParam
будет иметь какой-либо эффект.