Как узнать размер объекта HCURSOR

Я хочу получить высоту и ширину файла .cur без просмотра его формата.

Я пытаюсь использовать LoadCursorFromFile() для получения HCURSOR, я полагаю, что есть функция API для получения информации HCURSOR, но я обнаружил, что GetCursorInfo() мне совсем не нужен.

Есть ли способ получить высоту и ширину объекта HCURSOR?


person Gohan    schedule 09.11.2009    source источник


Ответы (3)


API-интерфейсы значков и курсоров в Windows частично совпадают. Вы также можете вызвать GetIconInfoEx с помощью HCURSOR. как с HICON. Структура, которую вы получите, будет содержать информацию о точке доступа.

Я не вижу способа получить реальный размер. Технически все значки курсора имеют фиксированный размер, который можно получить, запросив у системы (с помощью GetSystemMetrics) для SM_CXCURSOR и SM_CYCURSOR. Те, которые кажутся меньше, на самом деле имеют такой же размер, просто в них много прозрачных пикселей. Если вам необходимо знать видимый размер, вам придется извлечь маску и отсканировать биты, чтобы определить ограничивающий прямоугольник.

person Adrian McCarthy    schedule 16.03.2010

Универсальный код 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;
}
person 23W    schedule 08.11.2012
comment
Использовать SM_CXCURSOR или SM_CYCURSOR неправильно. Например: после перехода на большой размер курсора в панели управления значения SM_CXCURSOR и SM_CYCURSOR остаются 32x32. - person 23W; 08.11.2012
comment
По-прежнему возвращает 32x32 при использовании параметров Windows 10 (Настройки > Специальные возможности > Размер указателя мыши). - person Nicke Manarin; 11.06.2021

Из MSDN:

Параметры nWidth и nHeight должны указывать ширину и высоту, поддерживаемые текущим драйвером дисплея, поскольку система не может создавать курсоры других размеров. Чтобы определить ширину и высоту, поддерживаемые драйвером дисплея, используйте функцию GetSystemMetrics, указав значение SM_CXCURSOR или SM_CYCURSOR.

person gwell    schedule 09.11.2009