簡體   English   中英

如何使用Window API在窗口中顯示位圖(帶有顏色值的數組)?

[英]How can I display a bitmap (array with color values) in a window using Window API?

我想使用BitBlt將顏色值的緩沖區移至窗口,僅該窗口顯示為空。 當我編譯並運行代碼時, 如何在窗口中加載位圖? (使用我自己的示例.bmp文件),該窗口也顯示為空。

經過一些測試,問題似乎出在SelectObject() 根據文檔,當返回值為NULL時,就會發生錯誤: https ://docs.microsoft.com/zh-cn/windows/desktop/api/wingdi/nf-wingdi-selectobject。 返回值為NULL,但GetLastError()給出0,表示沒有錯誤。 這里有什么問題?

    case WM_CREATE:
        std::fill(arr, arr + sizeof(arr), RGB(255,0,0));
        hBitmap = CreateBitmap(240, 120, 1, sizeof(COLORREF), (void*) arr);
        UpdateWindow(hwnd);
        break;
    case WM_PAINT:
        PAINTSTRUCT ps;
        BITMAP bitmap;
        HGDIOBJ oldBitmap;
        HDC hdcMem;
        HDC hdc;

        hdc = BeginPaint(hwnd, &ps);

        hdcMem = CreateCompatibleDC(hdc);
        oldBitmap = SelectObject(hdcMem, hBitmap);
        std::cout << (oldBitmap == NULL) << std::endl;
        std::cout << GetLastError();

        GetObject(hBitmap, sizeof(bitmap), &bitmap);
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, oldBitmap);
        DeleteDC(hdcMem);

        EndPaint(hwnd, &ps);
        break;

(順便說一句:每次需要hInstance時,我都使用main()而不是WinMain()GetModuleHandle(NULL) 。由於窗口功能正常,我懷疑它與此無關,但無論如何我都會提及。)

- -解決了! - -

我現在可以正常使用了:)對於其他人,這是我已更改的內容:

    case WM_CREATE:
        std::fill(arr, arr + 240 * 120, RGB(255,0,0));
        hBitmap = CreateBitmap(240, 120, 1, sizeof(COLORREF) * 8, (void*) arr);
        UpdateWindow(hwnd);
        break;

如果arr是指針,則使用元素總數( 240 * 120

如果arr是一個數組,則sizeof將返回總大小(以字節為單位)。 而是使用sizeof(arr)/sizeof(*arr)查找數組的數量(數組元素的總數或像素總數)。 例如,假設arr的元素為32位,則您查看的是240 * 120像素,其中每個像素為4字節或32位。

CreateBitmap的第4個參數期望以位為單位的大小,因此它應為sizeof(*arr) * 8或僅32。

uint32_t arr[240 * 120];
std::fill(arr, arr + sizeof(arr)/sizeof(*arr), RGB(255, 0, 0));
//or std::fill(arr, arr + 240 * 120, RGB(255, 0, 0));
hBitmap = CreateBitmap(240, 120, 1, 32, (void*)arr);

請注意,這將產生藍色位圖,而不是紅色位圖,因為它使用的是BGR格式而不是RGB。

看來您已經知道如何使用內存DC。 您可以使用CreateCompatibleBitmap創建位圖,然后選擇該位圖到內存dc中,並使用標准的GDI函數(例如FillRect 這將避免在計數位和字節時出現陷阱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM