2

我想获得 .cur 文件的高度和宽度,而不查看其格式。

我尝试使用 LoadCursorFromFile() 来获取 HCURSOR,我想有一个 API 函数来获取 HCURSOR 信息,但我发现 GetCursorInfo() 根本不是我想要的。

有什么方法可以获取 HCURSOR 对象的高度和宽度?

4

3 回答 3

6

此答案已过时

请参阅23W 的答案。这对我来说是正确的。

Raymond Chen 有一篇文解释了显示适配器实现的硬件光标大小SM_CXCURSOR和系统指标。SM_CYCURSOR由于光标不再是现代显示硬件的功能,这些值已过时,但操作系统仍会报告向后兼容的值。

感谢@SO_fix_the_vote_sorting_bug 的评论让我注意到了这一点。


历史背景的原始答案

Windows 中的图标和光标之间的 API 有一些重叠。您可以GetIconInfoEx使用 HCURSOR 和 HICON 调用。您返回的结构将包含有关热点的信息。

我看不到获得实际尺寸的方法。从技术上讲,所有光标图标都是固定大小的,您可以通过向系统(使用GetSystemMetrics)询问SM_CXCURSOR和来获得SM_CYCURSOR。看起来更小的那些实际上是那个大小,它们只是有很多透明像素。如果您必须知道表观大小,则必须提取掩码并扫描位以找出边界矩形。

于 2010-03-16T15:17:32.667 回答
6

通用 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;
}
于 2012-11-08T18:22:00.683 回答
1

来自MSDN

nWidth 和 nHeight 参数必须指定当前显示驱动程序支持的宽度和高度,因为系统无法创建其他大小的光标。要确定显示驱动程序支持的宽度和高度,请使用 GetSystemMetrics 函数,指定 SM_CXCURSOR 或 SM_CYCURSOR 值。

于 2009-11-09T17:30:59.047 回答