Pergunta

Eu li um monte de problemas com a tentativa de buffer duplo de um controle richedit, mas não vi nenhum direto respostas para esta questão específica (seria ótimo ter um orçamento/link onde a Microsoft tem uma declaração oficial).

Aqui está um código (VCL/Delphi/Borland Builder 6.0) estou usando para testar:

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;
  }

Se eu chamar BeginPaint() antes herdadas::WndProc() (que passa a mensagem para o controlo para aqueles que não sabem, VCL), o controle não desenhar nada na minha memória DC ou a janela actual DC.Se eu chamar GetDC() em vez disso, o controle ainda não desenhar no controlador de domínio de memória, mas, em seguida, ele faz desenhar na janela DC diretamente.Eu confirmo isso por comentar meu BitBlt() chamada..se ele não é comentada, a área do cliente é todo preto (ou seja, o controle não pintar sobre a memória do CC), se eu comentar essa linha, o controle desenha correctamente (ou seja, ele ignroed o WParam memória DC e foi diretamente para a janela do CC).

Enquanto isso soa como se eu respondi a minha própria pergunta, o que eu realmente quero é a confirmação de outros (link para o artigo da microsoft MSDN ou seria ótimo, para que eu possa mostrar o meu patrão :), E possível que outras idéias para alcançar o buffer duplo? Eu não posso usar a maioria dos hacks que eu encontrei gosto de ter o controle ser escondido fora da tela ou usando WM_PRINT, porque eu preciso esse controle realmente funciona para entrada de usuário e barras de rolagem, não é só de leitura apenas para exibição.

Além disso, o controle está usando RichEdit 2.0, mesmo que eu estou usando VCL..ele foi modificado para criar a janela como "richedit20a" de classe.Eu também confirmaram que a VCL camada é não mexer com a pintura em tudo, de modo que este mesmo comportamento deve ser visto com puro código do win32.

Foi útil?

Solução

o que eu realmente quero é a confirmação de outros (link para o artigo da microsoft ou MSDN seria ótimo, para que eu possa mostrar o meu patrão :)

Como sobre o óbvio localização:O documentação para os WM_PAINT mensagem, que , claramente, estados

wParam

Este parâmetro não é usado.

Há, portanto, nenhuma razão para esperar que a modificação do wParam vai ter algum efeito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top