2009-11-09 3 views
1

Я хочу получить высоту и ширину файла .cur, не заглядывая в его формат.Как узнать размер объекта HCURSOR

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

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

ответ

4

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

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

код
+0

много помощи. +1 – Gohan

0

От MSDN:

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

3

Универсальный 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; 
} 
+0

Использование SM_CXCURSOR или SM_CYCURSOR не является правильным. Например: после переключения на огромный размер курсора на панели управления значения SM_CXCURSOR и SM_CYCURSOR остаются 32x32. – 23W

Смежные вопросы