我一直在嘗試加載一個簡單的位圖并使用該位圖繪制一個按鈕。到目前為止,一切都很好。我發現您應該能夠使用標志創建所述按鈕并BS_OWNERDRAW攔截WM_DRAWITEM. WndProc這正是我所做的。如果我畫簡單的形狀,比如FillRect,效果很好。GetLastError()也回傳 0。位圖是從資源檔案中加載的,用 windres 編譯,并與 gcc 一起鏈接。如果我使用 .exe 中的 7zip 提取 .bmp,我可以毫無問題地用任何東西打開它。我也嘗試過不止一張,甚至用油漆畫過一張,位圖本身看起來還不錯。這是代碼:
void on_WM_DRAWITEM(DRAWITEMSTRUCT* drawItem, HWND hwnd)
{
HRSRC bmRes = FindResourceW(NULL, (LPCWSTR)MAKEINTRESOURCE(MY_BITMAP), (LPCWSTR)RT_BITMAP);
HBITMAP hBm = LoadResource(NULL, bmRes);
BITMAP bm;
HDC memDC = CreateCompatibleDC(drawItem->hDC);
if(hBm != NULL)
{
printf("HRSRC: %p\n", bmRes);
printf("HBITMAP: %p\n", hBm);
printf("HDC: %p\n", memDC);
if(GetObject(hBm, sizeof(bm), &bm) != 0)
{
printf("Not printing\n");
WINBOOL b = DrawStateW(memDC, NULL, NULL, (LPARAM)hBm, 0, 0, 0, 0, 0, DST_BITMAP);
//BitBlt(drawItem->hDC, 0, 0, 50, 50, memDC, 0, 0, SRCCOPY);
}
printf("BITMAP: %p\n", bm);
printf("BITMAP BITS: %p\n", bm.bmBits);
}
DeleteDC(memDC);
DeleteObject(bmRes);
DeleteObject(hBm);
}
這些列印的輸出:
HRSRC: 00007ff665ce70a0
HBITMAP: 00007ff665d484c0
HDC: 000000002d010e19
BITMAP: 000000d387bfef70
BITMAP BITS: 000014e0000014e0
一切似乎都是有效的,沒有什么是空的。盡管失敗了,但這些位似乎正在設定。我試圖檢查這個地址的記憶體,但我似乎無法訪問這個地址范圍。我不確定 Windows 句柄應該如何與指標相比,我應該能夠像指標那樣列印它們嗎?
即使我將 BitBlt 或 DrawStateW(它們都應該作業)放在 if 之外,它們也都失敗了。
使用 gcc 和 MinGW 編譯。
uj5u.com熱心網友回復:
LoadResource()回傳HGLOBAL記憶體塊的HBITMAP句柄,而不是位圖影像的句柄。它們不代表相同的東西,因此GetObject()由于您給它錯誤的句柄型別而失敗。
您應該在您的專案中啟用STRICT 型別檢查,這樣當出現此類不匹配時,您的代碼將無法編譯。
獲取資源中位圖句柄的正確方法是使用or代替,例如:HBITMAPLoadBitmap()LoadImage()
void on_WM_DRAWITEM(DRAWITEMSTRUCT* drawItem, HWND hwnd)
{
HBITMAP hBm = (HBITMAP) LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(MY_BITMAP), IMAGE_BITMAP, 0, 0, 0);
if (hBm != NULL)
{
...
DeleteObject(hBm);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520673.html
標籤:C视窗温纳皮位图
