我有一个程序,用了ImageList_Draw函数来在一个菜单项画一个图标,具体语句如下:
yesok=ImageList_Draw(tbok.HIMAGELIST, 1, lpDrawInfo.hdc, 1,1, &H1)
说明:
tbok.HIMAGELIST为ImageList控件实例tbok的句柄,tbok中已加载了多个图标;
lpDrawInfo.hdc是要绘制的菜单项的名柄;
我检查过tbok.HIMAGELIST和lpDrawInfo.hdc在windows xp下的返回值,是正常的.
现象:
这个程序在window98下运行,完全正常;在windows xp下远行,没有要绘制的菜单项中没有显示图标.同一个程序,为什么在windows98下可以正常在菜单中显示图标,而在xp下就不行了呢?怎样解决?问题解决立即给分!!!!
yesok=ImageList_Draw(tbok.HIMAGELIST, 1, lpDrawInfo.hdc, 1,1, &H1)
说明:
tbok.HIMAGELIST为ImageList控件实例tbok的句柄,tbok中已加载了多个图标;
lpDrawInfo.hdc是要绘制的菜单项的名柄;
我检查过tbok.HIMAGELIST和lpDrawInfo.hdc在windows xp下的返回值,是正常的.
现象:
这个程序在window98下运行,完全正常;在windows xp下远行,没有要绘制的菜单项中没有显示图标.同一个程序,为什么在windows98下可以正常在菜单中显示图标,而在xp下就不行了呢?怎样解决?问题解决立即给分!!!!
你跟踪调试看看
对于画菜单来说,windows98和windows xp 到底和有何不同?造成ImageList_Draw执行失败.
你的完整代码?
Private Const SHGFI_DISPLAYNAME = &H200 ' get display name
Private Const SHGFI_EXETYPE = &H2000 ' return exe type
Private Const SHGFI_LARGEICON = &H0 ' get large icon
Private Const SHGFI_SHELLICONSIZE = &H4 ' get shell size icon
Private Const SHGFI_SMALLICON = &H1 ' get small icon
Private Const SHGFI_SYSICONINDEX = &H4000 ' get system icondex
Private Const SHGFI_TYPENAME = &H400 ' get type name
Private Const ILD_BLEND50 = &H4
Private Const ILD_BLEND25 = &H2
Private Const ILD_TRANSPARENT = &H1
Private Const CLR_NONE = &HFFFFFFFF
Private Const CLR_DEFAULT = &HFF000000
Private Type SHFILEINFO
hIcon As Long ' : icon
iIcon As Long ' : icondex
dwAttributes As Long ' : SFGAO_ flags
szDisplayName As String * MAX_PATH ' : display name (or path)
szTypeName As String * 80 ' : type name
End Type
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Private Declare Function ImageList_Draw Lib "comctl32.dll" (ByVal himl As Long, ByVal i As Long, ByVal hdcDst As Long, ByVal x As Long, ByVal y As Long, ByVal fStyle As Long) As Long
Private Declare Function ImageList_DrawEx Lib "comctl32.dll" (ByVal himl As Long, ByVal i As Long, ByVal hdcDst As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal rgbBk As Long, ByVal rgbFg As Long, ByVal fStyle As Long) As Long
Private Sub Form_Load()
Dim hImage As Long, udtFI As SHFILEINFO
'set the graphics mode of form1 to persistent
Me.AutoRedraw = True
'get the handle of the system image list that contains the large icon images
hImage = SHGetFileInfo("c:\thefile.tst", ByVal 0&, udtFI, Len(udtFI), SHGFI_SYSICONINDEX Or SHGFI_LARGEICON)
'draw the icon (normal)
ImageList_Draw hImage, udtFI.iIcon, Me.hDC, 0, 0, ILD_TRANSPARENT
'draw the icon (blended)
ImageList_DrawEx hImage, udtFI.iIcon, Me.hDC, 32, 0, 32, 32, CLR_NONE, CLR_DEFAULT, ILD_BLEND50
End Sub
问题我已找到了,不是我的代码有问题,而是:
windows common controls 6.0 的Imagelist的控件与windows XP windows 2003不兼容,有大大的BUG.如果把Imagelist控件换成是windows common controls 5.0的,在菜单中显示图标是正常了.但还存在着大大的问题:
在windows common controls 5.0的Imagelist控件中存入的图标,会莫明其妙地变色,即原来应该是屏蔽透明了的地方,会全变成黑色!!!!!
唉,为什么会这样,一个不能显示,另一个莫明其妙地变色,真是可叹!可悲!可笑!可恨!
为什么会这样,怎样解决这个问题,请帮帮我吧.
为什么windows common controls 5.0的Imagelist控件中存入的图标变成黑色呢?