很多控件都有一个Picture属性,它可以支持图标和位图,我现在想知道在只有这个对象的句柄(Picture.Handle)的情况下,怎样用API来识别它的类型。别告诉我用VB的方式Picture.Type = vbPicTypeBitmap或vbPicTypeIcon来判断。

解决方案 »

  1.   

    我有个方案,但可能不是最好的Private Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End TypePrivate Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Private Sub Command1_Click()
        Dim b As BITMAP
        
        Dim i As Long
        
        i = GetObject(Handle, Len(b), b)
        Debug.Print i  ' 偿试用位图的方案来读取其信息,如果是位图它将返回一个非0值。如果不是位图返回值应该是0
    End Sub
      

  2.   

    你用记事本打开一个BMP文件,会在开头有这样的字符 :
    BM~?      6   (   k   2         H?        你直接判断前两个字符就可以了 BM就是位图,否则就是图标ij
      

  3.   

    Option ExplicitPrivate Const OBJ_BITMAP = 7Private Declare Function GetObjectType Lib "gdi32" (ByVal hgdiobj As Long) As LongPrivate Declare Function CopyIcon Lib "user32" (ByVal hIcon As Long) As LongPrivate Sub Command1_Click()    
        Dim FileName As String
        Dim oPict As StdPicture
        
        FileName = "C:\WINDOWS\Blue Lace 16.bmp"
        Set oPict = LoadPicture(FileName)
        MsgBox GetObjectType(oPict.handle) ' OBJ_BITMAP 
        MsgBox CopyIcon(oPict.handle)      ' 0 函数调用失败
        Picture1.Picture = oPict
        Set oPict = Nothing
    End Sub
    Private Sub Command2_Click()
        Dim FileName As String
        Dim oPict As StdPicture
        
        FileName = "C:\WINDOWS\system32\Autorun.ico"
        Set oPict = LoadPicture(FileName)
        MsgBox GetObjectType(oPict.handle) ' 0 函数调用失败
        MsgBox CopyIcon(oPict.handle)      ' <>0
        Picture1.Picture = oPict
        Set oPict = Nothing
    End Sub