I have an icon identified by an HICON
handle that I want to draw centered on a custom control.
How do I determine the size开发者_StackOverflow社区 of the icon so that I can calculate the correct drawing position?
Here is a C++ version of code:
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;
}
The Win32 GetIconInfo
call will return, as part of its response, the icon's source bitmap. You can get the icon image size from this.
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
Here is a Python version of the code:
import win32gui
hIcon = some_icon
info = win32gui.GetIconInfo(hIcon)
if info:
if info[4]: # Icon has colour plane
bmp = win32gui.GetObject(info[4])
if bmp:
Width = bmp.bmWidth
Height = bmp.bmHeight
BitDepth = bmp.bmBitsPixel
else: # Icon has no colour plane, image data stored in mask
bmp = win32gui.GetObject(info[4])
if bmp:
Width = bmp.bmWidth
Height = bmp.bmHeight // 2
BitDepth = 1
info[3].close()
info[4].close()
精彩评论