Как определить размер иконки от HICON? - PullRequest
13 голосов
/ 16 декабря 2009

У меня есть значок, идентифицируемый дескриптором HICON, который я хочу нарисовать в центре пользовательского элемента управления.

Как определить размер значка, чтобы можно было рассчитать правильную позицию рисования?

Ответы [ 2 ]

8 голосов
/ 18 декабря 2012

Вот версия кода на 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;
}
5 голосов
/ 16 декабря 2009

Вызов 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...