我想获得 .cur 文件的高度和宽度,而不查看其格式。
我尝试使用 LoadCursorFromFile() 来获取 HCURSOR,我想有一个 API 函数来获取 HCURSOR 信息,但我发现 GetCursorInfo() 根本不是我想要的。
有什么方法可以获取 HCURSOR 对象的高度和宽度?
我想获得 .cur 文件的高度和宽度,而不查看其格式。
我尝试使用 LoadCursorFromFile() 来获取 HCURSOR,我想有一个 API 函数来获取 HCURSOR 信息,但我发现 GetCursorInfo() 根本不是我想要的。
有什么方法可以获取 HCURSOR 对象的高度和宽度?
此答案已过时
请参阅23W 的答案。这对我来说是正确的。
Raymond Chen 有一篇博文解释了显示适配器实现的硬件光标大小SM_CXCURSOR
和系统指标。SM_CYCURSOR
由于光标不再是现代显示硬件的功能,这些值已过时,但操作系统仍会报告向后兼容的值。
感谢@SO_fix_the_vote_sorting_bug 的评论让我注意到了这一点。
历史背景的原始答案
Windows 中的图标和光标之间的 API 有一些重叠。您可以GetIconInfoEx
使用 HCURSOR 和 HICON 调用。您返回的结构将包含有关热点的信息。
我看不到获得实际尺寸的方法。从技术上讲,所有光标图标都是固定大小的,您可以通过向系统(使用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;
}
来自MSDN:
nWidth 和 nHeight 参数必须指定当前显示驱动程序支持的宽度和高度,因为系统无法创建其他大小的光标。要确定显示驱动程序支持的宽度和高度,请使用 GetSystemMetrics 函数,指定 SM_CXCURSOR 或 SM_CYCURSOR 值。