我想获取.cur文件的高度和宽度,而无需查看其格式。我试图使用LoadCursorFromFile()来获得一个HCURSOR,我想有一个API函数来获取HCURSOR的信息,但我发现GetCursorInfo()不是我想要的。如何知道HCURSOR对象的大小
有什么办法可以获得HCURSOR对象的高度和宽度吗?
我想获取.cur文件的高度和宽度,而无需查看其格式。我试图使用LoadCursorFromFile()来获得一个HCURSOR,我想有一个API函数来获取HCURSOR的信息,但我发现GetCursorInfo()不是我想要的。如何知道HCURSOR对象的大小
有什么办法可以获得HCURSOR对象的高度和宽度吗?
Windows中的图标和光标之间的API存在一些重叠。您可以用HCURSOR和HICON拨打电话GetIconInfoEx
。你回来的结构将有关于热点的信息。
我没有看到获取实际大小的方法。从技术上讲,所有光标图标都是固定大小,您可以通过询问系统(使用GetSystemMetrics
)获得SM_CXCURSOR
和SM_CYCURSOR
。那些看起来更小的实际上是那个尺寸,他们只是有很多透明像素。如果您必须知道表面大小,则必须提取掩码并扫描这些位以找出边界矩形。
从MSDN:
的nWidth和nHeight参数参数必须指定的宽度和高度由当前显示驱动程序支持,因为系统不能创建其他尺寸的游标。要确定显示驱动程序支持的宽度和高度,请使用GetSystemMetrics函数,并指定SM_CXCURSOR或SM_CYCURSOR值。
通用的C++代码,对任何光标:
SIZE GetSize(HCURSOR ico)
{
SIZE res = {0};
if (ico)
{
ICONINFO info = {0};
if (::GetIconInfo(ico, &info)!=0)
{
bool bBWCursor = (info.hbmColor==NULL);
BITMAP bmpinfo = {0};
if (::GetObject(info.hbmMask, sizeof(BITMAP), &bmpinfo)!=0)
{
res.cx = bmpinfo.bmWidth;
res.cy = abs(bmpinfo.bmHeight)/(bBWCursor ? 2 : 1);
}
::DeleteObject(info.hbmColor);
::DeleteObject(info.hbmMask);
}
}
return res;
}
使用SM_CXCURSOR或SM_CYCURSOR是不正确的。例如:切换到控制面板中的巨大光标大小后,SM_CXCURSOR和SM_CYCURSOR的值保持为32x32。 – 23W 2012-11-08 18:30:52
很多的帮助。 +1 – Gohan 2010-03-17 09:31:16