2009-12-16 46 views
13

我有一个由HICON句柄标识的图标,我想以自定义控件为中心进行绘制。如何确定HICON图标的大小?

如何确定图标的大小,以便我可以计算出正确的图纸位置?

回答

5

作为响应的一部分,Win32 GetIconInfo调用将返回图标的源位图。您可以从中获取图标图像大小。

Dim IconInf As IconInfo 
Dim BMInf As Bitmap 

If (GetIconInfo(hIcon, IconInf)) Then 
    If (IconInf.hbmColor) Then ' Icon has colour plane 
     If (GetObject(IconInf.hbmColor, Len(BMInf), BMInf)) Then 
      Width = BMInf.bmWidth 
      Height = BMInf.bmHeight 
      BitDepth = BMInf.bmBitsPixel 
     End If 

     Call DeleteObject(IconInf.hbmColor) 
    Else ' Icon has no colour plane, image data stored in mask 
     If (GetObject(IconInf.hbmMask, Len(BMInf), BMInf)) Then 
      Width = BMInf.bmWidth 
      Height = BMInf.bmHeight \ 2 
      BitDepth = 1 
     End If 
    End If 

    Call DeleteObject(IconInf.hbmMask) 
End If 
+0

谢谢,正常工作与我的彩色图标。掩码中“Height = BMInf.bmHeight \ 2”的用途是什么? – Timbo 2009-12-16 09:53:12

+0

@Timbo:参见msdn:ICONINFO,一个单色图标包含hbmMask中的图像和XOR掩码。 – peterchen 2011-01-18 07:35:57

8

这里是一个代码C++版本:

struct MYICON_INFO 
{ 
    int  nWidth; 
    int  nHeight; 
    int  nBitsPerPixel; 
}; 

MYICON_INFO MyGetIconInfo(HICON hIcon); 

// ======================================= 

MYICON_INFO MyGetIconInfo(HICON hIcon) 
{ 
    MYICON_INFO myinfo; 
    ZeroMemory(&myinfo, sizeof(myinfo)); 

    ICONINFO info; 
    ZeroMemory(&info, sizeof(info)); 

    BOOL bRes = FALSE; 

    bRes = GetIconInfo(hIcon, &info); 
    if(!bRes) 
     return myinfo; 

    BITMAP bmp; 
    ZeroMemory(&bmp, sizeof(bmp)); 

    if(info.hbmColor) 
    { 
     const int nWrittenBytes = GetObject(info.hbmColor, sizeof(bmp), &bmp); 
     if(nWrittenBytes > 0) 
     { 
      myinfo.nWidth = bmp.bmWidth; 
      myinfo.nHeight = bmp.bmHeight; 
      myinfo.nBitsPerPixel = bmp.bmBitsPixel; 
     } 
    } 
    else if(info.hbmMask) 
    { 
     // Icon has no color plane, image data stored in mask 
     const int nWrittenBytes = GetObject(info.hbmMask, sizeof(bmp), &bmp); 
     if(nWrittenBytes > 0) 
     { 
      myinfo.nWidth = bmp.bmWidth; 
      myinfo.nHeight = bmp.bmHeight/2; 
      myinfo.nBitsPerPixel = 1; 
     } 
    } 

    if(info.hbmColor) 
     DeleteObject(info.hbmColor); 
    if(info.hbmMask) 
     DeleteObject(info.hbmMask); 

    return myinfo; 
}