Захват изображения в клиентском окне win32 c ++ - PullRequest
1 голос
/ 04 января 2012

Этот код пытается захватить изображение, нарисованное на окне, в поле размером до 100x100 вокруг курсора. BitBlt не возвращает 0 в любом месте здесь, и я уверен, что проблема заключается в первом вызове функции BitBlt, где я пытаюсь скопировать изображение из фона окна в мету, который является HDC, объявленным глобально , В дополнение к простой попытке создать HDC полностью в памяти, я попытался создать и загрузить растровое изображение пустого пространства и записать новое изображение в связанный с ним дескриптор, но все, что он делал, это действовал как ластик и рисовал белый прямоугольник вокруг курсора, как он двигался. Соответствующий код приведен ниже, mouseRect и clientRect являются глобальными переменными, относящимися к рамке вокруг курсора и прямоугольника клиента соответственно. Любая помощь приветствуется, спасибо!

    case WM_CREATE:
    hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
    GetClientRect(hWnd, &clientRect);
    hdc = GetDC(hWnd);
    meta = CreateCompatibleDC(hdc);
    return 0;


case WM_MOUSEMOVE:    
    x = LOWORD(lParam);
    y = HIWORD(lParam);
    hdc = GetDC(hWnd);
    BitBlt(hdc, mouseRect.left, mouseRect.top, mouseRect.right-mouseRect.left, mouseRect.bottom-mouseRect.top, meta, 0, 0, SRCCOPY);
    ReleaseDC(hWnd, meta);
    meta = CreateCompatibleDC(hdc);
    if(y<50)
        mouseRect.top = 0;
    else
        mouseRect.top = y-50;
    if(x<50)
        mouseRect.left = 0;
    else
        mouseRect.left = x-50;
    if(clientRect.right-x<50)
        mouseRect.right = clientRect.right;
    else
        mouseRect.right = x+50;
    if(clientRect.bottom-y<50)
        mouseRect.bottom = clientRect.bottom;
    else
        mouseRect.bottom = y+50;
    BitBlt(meta, 0,  0, mouseRect.right-mouseRect.left, mouseRect.bottom-mouseRect.top, hdc, mouseRect.left, mouseRect.top, SRCCOPY);
    ReleaseDC(hWnd, hdc);
    return 0;

1 Ответ

0 голосов
/ 06 января 2012

Исправлен код, вот исправленный код WM_MOUSEMOVE

case WM_MOUSEMOVE:    
x = LOWORD(lParam);
y = HIWORD(lParam);
hdc = GetDC(hWnd);
BitBlt(hdc, mouseRect.left, mouseRect.top, mouseRect.right-mouseRect.left, mouseRect.bottom-mouseRect.top, hdcMemDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdcMemDC);
if(y<50)
    mouseRect.top = 0;
else
    mouseRect.top = y-50;
if(x<50)
    mouseRect.left = 0;
else
    mouseRect.left = x-50;
if(clientRect.right-x<50)
    mouseRect.right = clientRect.right;
else
    mouseRect.right = x+50;
if(clientRect.bottom-y<50)
    mouseRect.bottom = clientRect.bottom;
else
    mouseRect.bottom = y+50;
hdcMemDC = CreateCompatibleDC(hdc);
hbmScreen = CreateCompatibleBitmap(hdc, mouseRect.right-mouseRect.left, mouseRect.bottom-mouseRect.top);
SelectObject(hdcMemDC,hbmScreen);    
if(!BitBlt(hdcMemDC, 0, 0, mouseRect.right-mouseRect.left, mouseRect.bottom-mouseRect.top, hdc, mouseRect.left, mouseRect.top, SRCCOPY))
{
    MessageBox(hWnd, "BitBlt has failed", "Failed", MB_OK);
}
ReleaseDC(hWnd, hdc);
return 0;
...