Элемент управления 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 будет иметь какой-либо эффект.

Другие вопросы по тегам