![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Курсор мыши больше чем 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]да.