代码之家  ›  专栏  ›  技术社区  ›  Gohan

我如何知道HCURSOR对象的大小

  •  1
  • Gohan  · 技术社区  · 15 年前

    我想要得到一个.cur文件的高度和宽度,而不需要查看它的格式。

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

    3 回复  |  直到 14 年前
        1
  •  6
  •   23W    12 年前

    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;
    }
    
        2
  •  6
  •   Adrian McCarthy    3 年前

    这个答案已经过时了

    23W's answer 相反这对我来说是正确的。

    陈雷蒙有一个 blog post 这就解释了 SM_CXCURSOR SM_CYCURSOR 系统度量是显示适配器实现的硬件游标的大小。由于光标不再是现代显示硬件的功能,这些值已经过时,但操作系统仍然报告向后兼容性的值。

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


    历史语境的原始答案

    Windows中图标和光标之间的API有一些重叠。你可以打电话 GetIconInfoEx

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

        3
  •  1
  •   gwell    15 年前