Icon in Graustufen zeichnen
-
Hallo WinAPI-ler,
ich wollte mal fragen, ob es irgend eine Möglichkeit gibt, mit der DrawIcon(Ex)-Funtktion die Icons in Graustufen zu zeichnen. Ich hab schon versucht mit DrawIconEx die Maske zu zeichnen, aber das war ein Schuss in den Ofen. Im Internet hab ich bis jetzt nur gefunden, wie man eine Bitmap in Graustufen umwandelt, aber nicht ein Icon.
Gibt es irgend eine Funktion, um ein Icon in Graustufen zu zeichnen oder zumindest umzuwandeln?MfG
-
Wenn Du eine Bitmap umwandeln kannst, dann kannst Du Dir ein neues Icon bauen.
Oder Du kanst Die graue Bitmap (Anleitung hast Du ja) "transparent" mit der Maske aus dem Icon blitten.
-
Danke, Martin.
Ich habs jetzt so gemacht: ICONINFO des Icons erzeugen, die Farbbitmpap mit einer Funktion aus dem Internet grau machen und wieder der ICONINFO zuweisen. Dann zeichnen.
-
Sorry, ich muss nochmal nerven.
Meine "Ergrauungs-Funktion" sieht so aus (aus dem Internet übernommen):HBITMAP Taskbar::GetGrayedBitmap(HDC hdcRef, HBITMAP hBmp) { BITMAPINFO bmi; RGBTRIPLE* pRgbTrip; HBITMAP hGrayBmp; BITMAP bm; BYTE* pBits; BYTE bLuma; HDC hdc; int x, y, nBytesPerLine; GetObject((HGDIOBJ)hBmp, sizeof(bm), &bm); ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biWidth = bm.bmWidth; bmi.bmiHeader.biHeight = bm.bmHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biCompression = BI_RGB; nBytesPerLine = (((3 * bm.bmWidth) + 3) & ~3); pBits = (BYTE*)HeapAlloc(GetProcessHeap(), 0, (nBytesPerLine * bm.bmHeight)); hdc = CreateCompatibleDC(hdcRef); hGrayBmp = (HBITMAP)CopyImage(hBmp, IMAGE_BITMAP, bm.bmWidth, bm.bmHeight, 0); GetDIBits(hdc, hBmp, 0, bm.bmHeight, pBits, &bmi, DIB_RGB_COLORS); for(y = 0; y < bm.bmHeight; ++y) { for(x = 0, pRgbTrip = (RGBTRIPLE*)(pBits + y * nBytesPerLine); x < bm.bmWidth; ++x, ++pRgbTrip) { bLuma = LOBYTE(((pRgbTrip->rgbtRed * 30) + (pRgbTrip->rgbtGreen * 59) + (pRgbTrip->rgbtBlue * 11)) / 100); pRgbTrip->rgbtRed = pRgbTrip->rgbtGreen = pRgbTrip->rgbtBlue = bLuma; } } SetDIBits(hdc, hGrayBmp, 0, bm.bmHeight, pBits, &bmi, DIB_RGB_COLORS); DeleteDC(hdc); HeapFree(GetProcessHeap(), 0, pBits); return(hGrayBmp); }
Mein Problem ist: Die Bitmap wird scheinbar horizontal immer etwas "zusammengepresst", was natürlich bei gleich bleibender Maske einen hässlichen Rand zur Folge hat.
Der Aufruf sieht folgendermaßen aus:HICON tmpicon = tmptask.hIcon; //... ICONINFO ii; GetIconInfo(tmpicon, &ii); ii.hbmColor = GetGrayedBitmap(hDc, ii.hbmColor); tmpicon = CreateIconIndirect(&ii); //... DrawIconEx(hDc, i + (TASKBAR_HEIGHT - 32) / 2, (TASKBAR_HEIGHT - 32) / 2, tmpicon, 32, 32, 0, NULL, DI_NORMAL);
Weiß jemand Rat?