Элемент управления Richedit 2.0 игнорирует WParam для сообщений WM_PAINT? - PullRequest
0 голосов
/ 01 марта 2012

Я читал много проблем с попыткой двойной буферизации элемента управления 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.

1 Ответ

4 голосов
/ 01 марта 2012

что я действительно хочу, так это подтверждение от других (ссылка на статью MS KB или MSDN было бы здорово, так что я могу показать своему боссу:)

Как насчет очевидного местоположения: документация для WM_PAINT сообщения , в которой четко указано

WPARAM

Этот параметр не используется.

Поэтому нет оснований ожидать, что изменение wParam будет иметь какой-либо эффект.

...