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 を透明にしたかったのです。
私が間違っているアイデア。ありがとう
-パンカジ