Ich hab noch noch eine transparente Möglichkeit gefunden.
Wie schon vermutet funktioniert es mit einer Imageliste, indem man die Maske des orginalen Icons auf die neue Bitmap überträgt. Somit erhält man zwar keine HiColor-Transparenz, aber die nicht belegten Flächen des Icons werden ausgeblendet. Hier mein Testcode:
Code
Def GetSysColor(1) !"user32","GetSysColor"
Def ExtractIconEx(5) !"shell32.dll","ExtractIconExA"
Def CreateCompatibleDC(1) !"gdi32","CreateCompatibleDC"
Def CreateCompatibleBitmap(3) !"gdi32","CreateCompatibleBitmap"
Def SelectObject(2) !"gdi32","SelectObject"
Def CreateSolidBrush(1) !"gdi32","CreateSolidBrush"
Def FillRect(3) !"user32","FillRect"
Def ImageList_Add(3) !"comctl32.dll","ImageList_Add"
Def DeleteDC(1) !"gdi32","DeleteDC"
Def GetColorAdjustment(2) !"gdi32","GetColorAdjustment"
Def SetStretchBltMode(2) !"gdi32","SetStretchBltMode"
Def SetColorAdjustment(2) !"gdi32","SetColorAdjustment"
Def ImageList_Draw(6) !"comctl32.dll","ImageList_Draw"
Def StretchBlt(11) !"gdi32","StretchBlt"
Def ImageList_GetImageInfo(3) !"comctl32.dll","ImageList_GetImageInfo"
Def ImageList_Replace(4) !"comctl32.dll","ImageList_Replace"
Struct COLORADJUSTMENT=caSize%,caFlags%,caIlluminantIndex%,caRedGamma%,caGreenGamma%,caBlueGamma%,caReferenceBlack%,caReferenceWhite%,caContrast%,caBrightness%,caColorfulness%,caRedGreenTint%
Declare largeicon&,bereich#,ilist&,ilist2&,dc&,bitmap&,oldbitmap&,brush&
Declare wert&,x%,y%,z%,z&,xx&,ca#,imageinfo#
CA# = New(COLORADJUSTMENT)
Dim bereich#,32
Window 0,0-%maxx,%maxy
Cls $888888
UsePen 5,0,0
UseBrush 1,RGB(255,200,100)
Rectangle 0,84-%maxx,124
UseBrush 1,RGB(255,255,255)
Rectangle 0,124-%maxx,164
UseBrush 1,RGB(0,0,0)
Rectangle 0,164-%maxx,204
WhileLoop %maxx/32-1
ilist&= Create("ImageList", 32, 32)
ExtractIconEx("shell32.dll",xx&,Addr(largeicon&),0,1)
ImageList("AddIcon", ilist&, largeicon&)
ImageList("AddIcon", ilist&, largeicon&)
DeleteObject largeicon&
dc&= CreateCompatibleDC(%hdc)
bitmap&= CreateCompatibleBitmap(%hdc, 32, 32)
oldbitmap&= SelectObject(dc&,bitmap&)
Long bereich#,0= 0,0,32,32
brush&= CreateSolidbrush($888888)
FillRect(dc&, bereich#, brush&)
DeleteObject brush&
GetColorAdjustment(dc&,CA#)
SetStretchBltMode(dc&,4)
CA#.caColorfulness% = -100
CA#.caIlluminantIndex% = 6
SetColorAdjustment(dc&,CA#)
ImageList_Draw(ilist&,0,dc&,0,0,$0)
StretchBlt(dc&,0,0,32,32,dc&,0,0,32,32,$CC0020)
SelectObject(dc&,oldbitmap&)
ImageList_GetImageInfo(ilist&,0,bereich#)
ImageList_Replace(ilist&,1,bitmap&,Long(bereich#,4))
ImageList_Draw(ilist&,0,%hdc2,xx&*32,8,$0)
ImageList_Draw(ilist&,1,%hdc2,xx&*32,48,$0)
ImageList_Draw(ilist&,1,%hdc2,xx&*32,88,$0)
ImageList_Draw(ilist&,1,%hdc2,xx&*32,128,$0)
ImageList_Draw(ilist&,1,%hdc2,xx&*32,168,$0)
DeleteObject ilist&
DeleteObject bitmap&
DeleteDC(dc&)
Inc xx&
EndWhile
Repaint
WaitInput
Alles anzeigen
http://www.postimage.org/image.php?v=Tsp_DGi
Roland, wenn du vor der Grau-Berechnung die Menü-Hintergrundfarbe setzt, erhälst du perfekte graue Icons.
Code
Def GetSysColor(1) !"user32","GetSysColor"
Def ExtractIconEx(5) !"shell32.dll","ExtractIconExA"
Def CreateCompatibleDC(1) !"gdi32","CreateCompatibleDC"
Def CreateCompatibleBitmap(3) !"gdi32","CreateCompatibleBitmap"
Def SelectObject(2) !"gdi32","SelectObject"
Def CreateSolidBrush(1) !"gdi32","CreateSolidBrush"
Def FillRect(3) !"user32","FillRect"
Def DeleteDC(1) !"gdi32","DeleteDC"
Def GetColorAdjustment(2) !"gdi32","GetColorAdjustment"
Def SetStretchBltMode(2) !"gdi32","SetStretchBltMode"
Def SetColorAdjustment(2) !"gdi32","SetColorAdjustment"
Def ImageList_Draw(6) !"comctl32.dll","ImageList_Draw"
Def StretchBlt(11) !"gdi32","StretchBlt"
Def ImageList_GetImageInfo(3) !"comctl32.dll","ImageList_GetImageInfo"
Def ImageList_Replace(4) !"comctl32.dll","ImageList_Replace"
Struct COLORADJUSTMENT=caSize%,caFlags%,caIlluminantIndex%,caRedGamma%,caGreenGamma%,caBlueGamma%,caReferenceBlack%,caReferenceWhite%,caContrast%,caBrightness%,caColorfulness%,caRedGreenTint%
Declare largeicon&,bereich#,ilist&,ilist2&,dc&,bitmap&,oldbitmap&,brush&
Declare wert&,x%,y%,z%,z&,xx&,ca#,imageinfo#,farbe&
CA# = New(COLORADJUSTMENT)
Dim bereich#,32
farbe&=$EECC88
Window 0,0-%maxx,%maxy
Cls farbe&
WhileLoop %maxx/32-1
ilist&= Create("ImageList", 32, 32)
ExtractIconEx("shell32.dll",xx&,Addr(largeicon&),0,1)
ImageList("AddIcon", ilist&, largeicon&)
ImageList("AddIcon", ilist&, largeicon&)
DeleteObject largeicon&
dc&= CreateCompatibleDC(%hdc)
bitmap&= CreateCompatibleBitmap(%hdc, 32, 32)
oldbitmap&= SelectObject(dc&,bitmap&)
Long bereich#,0= 0,0,32,32
brush&= CreateSolidbrush(farbe&) 'Hier die menü-Hintergrundfarbe setzen
FillRect(dc&, bereich#, brush&)
DeleteObject brush&
GetColorAdjustment(dc&,CA#)
SetStretchBltMode(dc&,4)
CA#.caColorfulness% = -100
CA#.caIlluminantIndex% = 6
SetColorAdjustment(dc&,CA#)
ImageList_Draw(ilist&,0,dc&,0,0,$0)
StretchBlt(dc&,0,0,32,32,dc&,0,0,32,32,$CC0020)
SelectObject(dc&,oldbitmap&)
ImageList_GetImageInfo(ilist&,0,bereich#)
ImageList_Replace(ilist&,1,bitmap&,Long(bereich#,4))
ImageList_Draw(ilist&,0,%hdc2,xx&*32,8,$0)
ImageList_Draw(ilist&,1,%hdc2,xx&*32,48,$0)
DeleteObject ilist&
DeleteObject bitmap&
DeleteDC(dc&)
Inc xx&
EndWhile
Repaint
WaitInput
Alles anzeigen