1

C++ と GDI+ を使用して、画像の上に四角形を描画し、MouseMovements と共に四角形を移動/サイズ変更しています。多くのちらつきが発生していたため、コントロールの上に透明な HDC を作成することにしました。クリック時にその HDC を作成し、その HDC に描画します。

これが私のコードです...

HDC mSourceHDC; // Handle to the display device context 
HDC mMemoryDC;
HBITMAP mBitmap;
HBITMAP mOverlayBitmap;

私のマウスクリックコールバックで

mSourceHDC = GetDC(hWnd); // Hwnd is the HWND of my control

RECT rc;
GetClientRect(hWnd, &rc);
int32 clientheight = rc.bottom - rc.top;
int32 clientWidth = rc.right - rc.left;

mMemoryDC = CreateCompatibleDC(mSourceHDC);
mBitmap = CreateCompatibleBitmap(mSourceHDC, clientWidth, clientheight);
mOverlayBitmap = (HBITMAP)SelectObject(mMemoryDC, mBitmap);

//SetBkMode(mMemoryDC,TRANSPARENT); // Line 1

// 私の Mouse Move CallBack では

if(mMemoryDC != NULL) {
  Gdiplus::Graphics gdiGraphics(mMemoryDC);
  gdiGraphics.Clear(Gdiplus::Color.LightGray);  // Line 2

  Gdiplus::Pen* myPen = new Gdiplus::Pen(Gdiplus::Color::White);
  myPen->SetWidth(2);

  Gdiplus::GraphicsPath *cropRectPath = new Gdiplus::GraphicsPath();
  cropRectPath->AddRectangle(cropRectF); // This cropRectF is my rectangle 
  gdiGraphics.DrawPath(myPen, cropRectPath); 

  BitBlt(mSourceHDC, 0, 0,  clntWdth, clntheight, mMemoryDC, 0, 0, SRCCOPY);
}

// In Mouse Leave コールバック

if(mMemoryDC != NULL) {
  SelectObject(mMemoryDC, mOverlayBitmap);
  DeleteObject(mBitmap);
  DeleteDC(mMemoryDC);

  ReleaseDC(hWnd, mSourceHDC);
}

ただし、長方形は正しく描画されていますが、MouseMovement 中にウィンドウ全体が灰色になり、画像が表示されません。2 行目を削除すると、領域全体が黒くなります。

gdiGraphics.Clear(Gdiplus::Color.Transparent);  in Line 2, still it turns Black.

マウスの移動中にイメージが表示されるように、このメモリ HDC を透明にしたかったのです。

私が間違っているアイデア。ありがとう

-パンカジ

4

1 に答える 1

1

Bitbltwithを使用してメモリ DC からコピーしていますSRCCOPY。それはすべてを上書きします。このSetBkMode呼び出しは、GDI を使用してテキストを描画するためだけのものです。これは、ビットマップのブリットには関係ありません。

ちらつきをなくす方法は、すべてをオフスクリーン ビットマップにレンダリングし、最終結果をウィンドウ DC にブリットすることです。これは、ダブルバッファリングと呼ばれます。

前と同じように、ビットマップとメモリ DC を作成します。メモリ DC をクリアしようとする代わりに、クライアント領域に表示されるはずのものをすべてメモリ DC にコピーします。次に、その上に選択長方形を描画します。最後に、メモリ DC をウィンドウ DC に戻します (既に行っているように)。

于 2012-06-08T19:29:23.413 に答える