2012-06-08 2 views
1

Используя 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

ответ

1

Вы копирования из памяти DC с использованием Bitblt с SRCCOPY. Это перепишет все. Вызов SetBkMode предназначен только для рисования текста с помощью GDI - это не имеет отношения к блицающим растровым изображениям.

Способ устранения мерцания состоит в том, чтобы сделать всем в растровое изображение вне экрана, а затем снова вывести итоговый результат обратно в окно DC. Это называется двойной буферизацией.

Создайте растровое изображение и память DC, как раньше. Вместо того, чтобы пытаться очистить память DC, скопируйте все, что должно появиться в клиентской области, в DC памяти. Затем нарисуйте прямоугольник выделения сверху. Наконец, blit память DC обратно в окно DC (как вы уже делаете).

+0

Как вы сказали, вместо того, чтобы пытаться очистить память DC, скопируйте все, что должно появиться в клиентской области, в память DC. Итак, вы имеете в виду, что я не должен этого делать. gdiGraphics.Clear (Gdiplus :: Color.LightGray); // Line 2 и вместо этого в моем случае мне нужно скопировать фоновое изображение [с помощью gdiGraphics.DrawImage (...)], а затем мой прямоугольник в память DC и мой последний битBlt верен. Пожалуйста, дайте мне знать, если я получу это правильно? Спасибо .. – Pankaj

+0

Может ли кто-нибудь сказать мне, как я могу создать прозрачный HDC в этом случае, чтобы мое оригинальное изображение было видно. Я не хочу копировать свое изображение в память HDC, так как это будет излишним. – Pankaj

+0

@Pankaj: В GDI нет такого понятия, как прозрачный контекст устройства. Вы можете попробовать использовать GDI + для создания 32-битного растрового изображения с альфа-каналом, а затем использовать AlphaBlend, но я бы рекомендовал простой подход, который я изложил в своем ответе. –

Смежные вопросы