リッチエディットコントロールをダブルバッファリングしようとする際の多くの問題を読みましたが、この特定の質問に対する直接的な答えは見ていません(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()を呼び出すと(VCLを知らない人のためにメッセージをコントロールに渡します)、コントロールはメモリDCまたは実際のウィンドウDCに何も描画しません。代わりにGetDC()を呼び出すと、コントロールはメモリDCを描画しませんが、ウィンドウDCを直接描画します。BitBlt()呼び出しをコメントアウトすることでこれを確認します。コメントアウトされていない場合、クライアント領域はすべて黒になります(つまり、コントロールがメモリDCにまったく描画されませんでした)。その行をコメントアウトすると、コントロールは正しく描画します(つまり、WParamメモリDCに点火し、ウィンドウDCに直接移動しました)。
私は自分の質問に答えたように聞こえますが、私が本当に望んでいるのは、他の人からの確認です(MS KBの記事またはMSDNへのリンクは素晴らしいので、上司に見せることができます:)、およびダブルバッファリングを実現するための他のアイデアの可能性? コントロールを画面外に非表示にしたり、WM_PRINTを使用したりするなど、見つけたハックのほとんどを使用することはできません。このコントロールは、ユーザー入力とスクロールバーで実際に機能する必要があるため、表示専用ではありません。
また、VCLを使用しているにもかかわらず、コントロールはRichEdit2.0を使用しています。ウィンドウを「richedit20a」クラスとして作成するように変更されています。また、VCLレイヤーがペイントをまったく混乱させていないことも確認しました。したがって、これと同じ動作が純粋なwin32コードでも見られるはずです。