Controle Richedit 2.0 ignora WParam as mensagens WM_PAINT?
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.
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.