bugger
bugger

Reputation: 313

Why does BitBlt() Zoom in when copying the exact same pixels from the same bitmap onto itself?

I'm trying to make a window that copies the desktop, and mess around with the pixels on it. I do this by using BitBlt from the Desktop Handle to my Window handle. This works as expected - a window is created which looks exactly like the desktop. However, when I use BitBlt() again to move a segment of pixels from my Window to another area of my Window, the pixels are zoomed in. Why does this happen and how do I fix it?

Here is the code, I have commented on the section where the issue seems to be coming from:

#include <windows.h>

int myWidth, myHeight;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
    {
        HDC DhWnd = GetDC(HWND_DESKTOP);
        HDC MhWnd = GetDC(hwnd);
        BitBlt(MhWnd, 0, 0, myWidth, myHeight, DhWnd, 0, 0, SRCCOPY);
        ShowWindow(hwnd, SW_SHOW);
        BitBlt(MhWnd, 300, 0, 100, 500, MhWnd, 300, 0, SRCCOPY);

        /*^^^^ The above segment zooms in the pixels despite copy pasting the EXACT
       SAME coordinates of the bitmap onto itself. ^^^^*/


        ReleaseDC(hwnd, DhWnd);
        ReleaseDC(hwnd, MhWnd);
        return 0;
    }
    case WM_PAINT:
        ValidateRect(hwnd, NULL);
        return 0;

    case WM_CLOSE:
    case WM_DESTROY:
        DestroyWindow(hwnd);
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

}



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    RECT Drc;
    MSG msg;
    HWND DhWnd = GetDesktopWindow();
    HWND MyhWnd;
    GetWindowRect(DhWnd, &Drc);
    myWidth = Drc.right - Drc.left;
    myHeight = Drc.bottom - Drc.top;


    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = NULL;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MyWindow";


    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    MyhWnd = CreateWindow("MyWindow", NULL, WS_POPUP, 0, 0, myWidth, myHeight, NULL, NULL, hInstance, NULL);
    if (MyhWnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }


    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;

}

Upvotes: 0

Views: 89

Answers (0)

Related Questions