我想使用C++和Win API以編程方式創建32位顏色圖標。爲此我使用以下代碼,我發現here。以編程方式創建32位顏色圖標
HICON CreateSolidColorIcon(COLORREF iconColor, int width, int height)
{
// Obtain a handle to the screen device context.
HDC hdcScreen = GetDC(NULL);
// Create a memory device context, which we will draw into.
HDC hdcMem = CreateCompatibleDC(hdcScreen);
// Create the bitmap, and select it into the device context for drawing.
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, width, height);
HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmp);
// Draw your icon.
//
// For this simple example, we're just drawing a solid color rectangle
// in the specified color with the specified dimensions.
HPEN hpen = CreatePen(PS_SOLID, 1, iconColor);
HPEN hpenOld = (HPEN)SelectObject(hdcMem, hpen);
HBRUSH hbrush = CreateSolidBrush(iconColor);
HBRUSH hbrushOld = (HBRUSH)SelectObject(hdcMem, hbrush);
Rectangle(hdcMem, 0, 0, width, height);
SelectObject(hdcMem, hbrushOld);
SelectObject(hdcMem, hpenOld);
DeleteObject(hbrush);
DeleteObject(hpen);
// Create an icon from the bitmap.
//
// Icons require masks to indicate transparent and opaque areas. Since this
// simple example has no transparent areas, we use a fully opaque mask.
HBITMAP hbmpMask = CreateCompatibleBitmap(hdcScreen, width, height);
ICONINFO ii;
ii.fIcon = TRUE;
ii.hbmMask = hbmpMask;
ii.hbmColor = hbmp;
HICON hIcon = CreateIconIndirect(&ii);
DeleteObject(hbmpMask);
// Clean-up.
SelectObject(hdcMem, hbmpOld);
DeleteObject(hbmp);
DeleteDC(hdcMem);
ReleaseDC(NULL, hdcScreen);
// Return the icon.
return hIcon;
}
原則上,代碼工作,我可以使用它在運行時使用Win API創建彩色圖標。不過,我想討論一些有關該代碼的問題和疑問(以及通常創建的圖標)。
- 使用此功能創建的圖標似乎不是32位顏色深度。如果我使用像RGB這樣的顏色(218,112,214),我會期望它是一些淺紫色。但是,實際顯示的顏色是灰色的。我怎樣才能改變代碼的顏色是真正的32位RGB?
- 創建的圖標完全充滿了顏色,我想在它周圍有一個薄薄的黑色邊框......這怎麼能實現?
- 在MSDN documentation(有點向下)中提到,「之前關閉,您的應用程序必須使用DestroyIcon摧毀它通過使用CreateIconIndirect創建的圖標。這是沒有必要破壞其他功能創建的圖標。」但是,在例如文檔中CreateIcon在MSDN中,據說「當您完成使用圖標後,使用DestroyIcon函數銷燬它。」這幾乎是一個矛盾。我什麼時候需要銷燬圖標?
- 當我將圖標添加到圖像列表並將此列表添加到組合框時,這些規則是否也適用?即我必須清理圖像列表和每個關聯的圖標嗎?
任何幫助,高度讚賞。
嗯,這面具看起來並不像一個適當的口罩。它在AND操作中使用,因此您可以簡單地使用hbmp。 –
是,對於面膜需要使用'CreateBitmap'用'cBitsPerPel == 1'改爲'CreateCompatibleBitmap',顏色也與'cBitsPerPel == 32'與''CreateBitmap' RGB'你不使用阿爾法 – RbMm
嗯,但在MSDN文檔的CreateBitmap它說,對於彩色位圖,出於性能原因,應該使用CreateCompatibleBitmap而不是CreateBitmap,所以不應該同時工作?我試圖爲位圖和hbmpMask = CreateBitmap(寬度,高度,1,1,0)的CreateBitmap(寬度,高度,1,32,0),但沒有改變(但我不知道其餘的參數像例如lpvBits) – SampleTime