Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Курсор мыши больше чем 32х32 [D7, XP]


fedor-dveniatin ©   (2009-08-14 14:12:00) 

Возможно ли загрузить для своей программы курсор больше чем 32х32?
WinXP и выше. Delphi7


fedor-dveniatin   (2009-08-20 11:34:00) [1]


> CSS   (20.08.09 05:17) [15]

Да, действительно... Спасибо большое.


CSS   (2009-08-20 05:19:00) [2]

Оппа... А она и вне программы срабатывает...

SetSystemCursor(LoadImage(hInstance, PChar('C:\Cur_32bit_128x128.cur'), IMAGE_CURSOR, 128, 128, LR_LOADFROMFILE), OCR_NORMAL);


CSS   (2009-08-20 05:17:00) [3]

> Именно это мне и надо. Было бы замечатель, если бы вы это нашли.

Это я когда-то на каком-то форуме отыскал... ^___^
Воть:

procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursors[1]:=LoadImage(hInstance, PChar('C:\Cur_32bit_128x128.cur'), IMAGE_CURSOR, 128, 128, LR_LOADFROMFILE);
Screen.Cursor:=1;
end;


Как говориться, ларчик просто открывался... =)


KilkennyCat   (2009-08-16 11:25:00) [4]

1. убить системный курсор.
2. при изменении мышиных координат отобразить любую свою картинку с текущими координатами мыши
в чем сложность-то?
а мерцание - это всего лишь неправильная реализация вывода графики.


fedor-dveniatin   (2009-08-16 11:14:00) [5]


> CSS   (16.08.09 03:43) [12]
> Я как-то делал курсор любого размера...Но это только для
> своей программы (формы), а не для всей системы... Подойдёт?

Именно это мне и надо. Было бы замечатель, если бы вы это нашли.


CSS   (2009-08-16 03:43:00) [6]

Я как-то делал курсор любого размера...
Но это только для своей программы (формы), а не для всей системы... Подойдёт? Могу поискать... =)
Только он при больших размерах почему-то начинает мерцать неприятно... =(

А вообще мне интересно как сделана программа "StarDock CursorXP"...
Полупрозрачный курсор 64х64 с анимацией... Для всей системы... И не мерцает как у меня было... =(


fedor-dveniatin   (2009-08-15 01:32:00) [7]


> TIF ©   (15.08.09 01:15) [9]
> http://www.microsofttranslator.com/BV.aspx?ref=Internal&a=http://support.microsoft.com/default.aspx/kb/307213

А вот за это, действительно спасибо ;)


fedor-dveniatin   (2009-08-15 01:29:00) [8]


> TIF ©   (15.08.09 01:15) [9]

Когда я писал, что не получилось, я имел в виду, что не получилось решить задачу в [0].
А то, что описали вы, я понял и так же воспроизвел. Но, во-первых, как вы и говорите, курсор уменьшается, т.е. уже не выполняется поставленая задача. А во-вторых, происходит подмена системного курсора, которая сказывается на всех приложениях, что вообще не приемлимо, к тому же, так же не выполняется требование "загрузить для своей программы".
Попробовав и реализовав все это, я и пришел к выводу, что "Так и не получилось. =("


TIF   (2009-08-15 01:15:00) [9]

> Так и не получилось. =(

Статья базы знаний support.microsoft.com/kb/307213 не помогла?
Или с английским туго? Вот это как раз не проблема...

http://www.microsofttranslator.com/BV.aspx?ref=Internal&a=http://support.microsoft.com/default.aspx/kb/307213

Качество перевода очень даже ничего, не зря Microsoft создавала этот переводчик с рассчётом больше для внутреннего использования внутри корпорации (например, при переводе с разных языков на английский отзывов и сообщений об ошибках в Windows 7), чем ради привлечения народа очередным бесплатным сервисом :)

Смотрим:

Cursor sizes
Although cursors can, in theory, be any size, the system imposes a standard size that is exposed by means of the SM_CXCURSOR and SM_CYCURSOR values. These metrics are read-only. On standard, low-DPI systems, these metrics are set to 32x32 pixels (32 bytes/row). When the system loads cursors by means of the standard LoadCursor function, the cursor is stretched to this dimension.
- - -
Размеры курсора
Хотя в теории, курсоры могут быть любого размера в системе налагает стандартного размера, которые предоставляются в виде значения SM_CXCURSOR и SM_CYCURSOR. Этих показателей доступны только для чтения. На стандартные, низкой DPI систем этих показателей устанавливаются 32 x 32 пикселей (32. байтов в строку). Когда система загружает курсоры в виде стандартных функция LoadCursor, курсор растягивается к этому измерению.

The system also provides the SetSystemCursor API function that you can use to change the system cursor for specific categories. You can use this function to set a cursor of any size. However, you must call the function programmatically, and you can only use it to set a cursor for a specific category. You cannot use it to make all cursors on the system the same size.
- - -
Система также предоставляет функцию SetSystemCursorAPI, которые можно использовать для изменения системы курсора для конкретных категорий. Эту функцию можно использовать для установки указателя любого размера. Однако необходимо вызвать функцию программным путем, и можно использовать только он для установки указателя для определенной категории. Его нельзя использовать вносить все курсоры в системе тот же размер.

Выводы:
1) Хм, значит лазейка вроде как и есть: если нужен курсор нестандартного размера, можно подменить один из системных курсоров своим...
Только я вот не соображу, как мы его тогда загрузим, если LoadCursor или LoadCursorFromFile его сожмут до стандартных размеров:
var C: Cardinal;
begin
 C:=LoadCursorFromFile('my.cur');
 SetSystemCursor(C, OCR_NORMAL);
end;

У меня курсор 48x48 уменьшается до 32x32

2) Работаем только под системой с high DPI, например, DPI 200, и система расширит допустимые размеры курсора до 64x64 (при DPI 120 действует 32x32, промежуточные значения не проверял).
Но выглядеть всё этоизвращение будет вот так:
http://pinpic.ru/img/1447/6ed7f72423f34e5deb890449f458b06a.jpg.html
Страшно, да? :)))

3) А зачем вообще нужен курсор 48x48, да ещё и анимированный? Это какая-то игрушка создаётся? Тогда лучше поискать другие пути ;-)
Вообще, в Microsoft, судя по всему вышеизложенному, не одобряют курсоры больше 32x32 и считают это лишним для пользователей... Так что и правда стоит уменьшить анимацию до 32x32 (самое простое), либо отрисовывать анимацию на экране (ой, ё...)


fedor-dveniatin   (2009-08-14 23:29:00) [10]

Так и не получилось. =(

Курсор у меня в .ani 48х48 RGB/A Как выполнить CreateCursor (с такими исходными данными) я не понимаю. Остается только LoadCursor и иже с ним. Устанавливаю курсор в обработчике WM_SetCursor с помощью SetCursor.

Где и как задавать размеры - не понимаю.


fedor-dveniatin   (2009-08-14 17:42:00) [11]

Jeer © Спасибо, попробую.


Jeer   (2009-08-14 17:32:00) [12]

http://support.microsoft.com/kb/307213


Jeer   (2009-08-14 17:26:00) [13]

CursorSizeX := GetSystemMetrics(SM_CXCURSOR);
CursorSizeY := GetSystemMetrics(SM_CYCURSOR);

Узнаешь предельные (максимальные) размеры курсора.


fedor-dveniatin   (2009-08-14 17:09:00) [14]


> turbouser ©   (14.08.09 16:52) [3]
> нет

Что нет? Нельзя узнать или нельзя загрузить?


turbouser   (2009-08-14 16:52:00) [15]

нет


fedor-dveniatin   (2009-08-14 16:45:00) [16]

Можно узнать как?

В случае ответа - да, дополнительный вопрос - как?


KilkennyCat   (2009-08-14 16:39:00) [17]

да.


Наверх

Титульная страница Поиск, карта сайта Написать письмо