Используя C++ и GDI +, я рисую прямоугольник поверх изображения и перемещая/изменяя размер прямоугольника вместе с моими MouseMovements, это вызывало много мерцания, поэтому я решил создать aa transprent HDC сверху на моем контроле. Во время клика я создаю этот HDC и Draw на этом HDC.Рисунок на прозрачном HDC при перемещении мыши
Вот мой код ...
HDC mSourceHDC; // Handle to the display device context
HDC mMemoryDC;
HBITMAP mBitmap;
HBITMAP mOverlayBitmap;
в моей мыши Нажмите CallBack
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
// В моей мыши 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);
}
// В Маус Отпуска Обратный звонок
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 прозрачной, чтобы мое изображение отображалось во время перемещения мыши.
Любая идея, в которой я ошибаюсь. Благодаря
-Pankaj
Как вы сказали, вместо того, чтобы пытаться очистить память DC, скопируйте все, что должно появиться в клиентской области, в память DC. Итак, вы имеете в виду, что я не должен этого делать. gdiGraphics.Clear (Gdiplus :: Color.LightGray); // Line 2 и вместо этого в моем случае мне нужно скопировать фоновое изображение [с помощью gdiGraphics.DrawImage (...)], а затем мой прямоугольник в память DC и мой последний битBlt верен. Пожалуйста, дайте мне знать, если я получу это правильно? Спасибо .. – Pankaj
Может ли кто-нибудь сказать мне, как я могу создать прозрачный HDC в этом случае, чтобы мое оригинальное изображение было видно. Я не хочу копировать свое изображение в память HDC, так как это будет излишним. – Pankaj
@Pankaj: В GDI нет такого понятия, как прозрачный контекст устройства. Вы можете попробовать использовать GDI + для создания 32-битного растрового изображения с альфа-каналом, а затем использовать AlphaBlend, но я бы рекомендовал простой подход, который я изложил в своем ответе. –