![](/img/trans.png)
[英]How can I draw an animation on a transparent window using Windows 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.