2012-01-03 5 views
1

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

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; 

ответ

0

Исправлен код, вот исправленный код 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; 
Смежные вопросы