我有一个程序,用了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下就不行了呢?怎样解决?问题解决立即给分!!!!

解决方案 »

  1.   

    ImageList_Draw应该不会出错应该是其他方面的问题
    你跟踪调试看看
      

  2.   

    tbok.HIMAGELIST和lpDrawInfo.hdc返回的句柄都是正确的,但yesok的返回值是0,即ImageList_Draw执行不成功,而在98下yesok的返回值是非零,执行成功.
    对于画菜单来说,windows98和windows xp 到底和有何不同?造成ImageList_Draw执行失败.
      

  3.   

    你ImageList_Draw是怎么声明的?
    你的完整代码?
      

  4.   

    Private Declare Function ImageList_Draw Lib "comctl32.dll" (ByVal himl&, ByVal i&, ByVal hDCDest&, ByVal X&, ByVal Y&, ByVal flags&) As Long
      

  5.   

    给你段代码,你参考一下: Private Const MAX_PATH = 260
    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
      

  6.   

    可叹!可悲!可笑!可恨!
    问题我已找到了,不是我的代码有问题,而是:
    windows common controls 6.0 的Imagelist的控件与windows XP windows 2003不兼容,有大大的BUG.如果把Imagelist控件换成是windows common controls 5.0的,在菜单中显示图标是正常了.但还存在着大大的问题:
    在windows common controls 5.0的Imagelist控件中存入的图标,会莫明其妙地变色,即原来应该是屏蔽透明了的地方,会全变成黑色!!!!!
    唉,为什么会这样,一个不能显示,另一个莫明其妙地变色,真是可叹!可悲!可笑!可恨!
    为什么会这样,怎样解决这个问题,请帮帮我吧.
      

  7.   

    http://www.vbaccelerator.com/home/VB/Code/Controls/ImageList/vbAccelerator_Image_List_Control/VB6_ImageList_Full_Source.asp试试用上面的控件
      

  8.   

    是你写的控件吗?
    为什么windows common controls 5.0的Imagelist控件中存入的图标变成黑色呢?
      

  9.   

    也就是windows common controls 5.0的Imagelist控件中存入的图标会丢失颜色呀,