代码之家  ›  专栏  ›  技术社区  ›  Timbo

如何确定图标的大小?

  •  13
  • Timbo  · 技术社区  · 15 年前

    我有一个图标 HICON 在自定义控件上居中绘制的句柄。

    如何确定图标的大小,以便计算正确的绘图位置?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Brian Reichle    8 年前

    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 
    
        2
  •  8
  •   Sergey    12 年前

    这是一个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;
    }