Почему курсор мыши кривой, а не симметричный

В закладки

Шла третья неделя самоизоляции. Дело было то ли сегодня, то ли вчера, разницы никакой уже давно.
Сидел я за рабочим столом, смотрел в экран на курсор и о чём-то думал.
Или нет, я ни о чём не думал, просто смотрел на курсор. Тупил.
Курсор мне резко не понравился. Прямо выбесил.
Впервые за 28 лет жизни я и тысячи человек в интернете заметили: курсор мыши в операционных системах неровный и несимметричный. Неправильный, кривой!
Чёрт возьми, теперь это не развидеть.
Что не так с курсором в Windows и macOS

Вот почти от руки провёл линию. Теперь видите?
Курсоры операционных систем по умолчанию кривые. Так было в Windows 10, Vista, 95 – и точно так же было в Mac OS 20-летней давности.
Это можно и без линий заметить. Если читаете статью с компьютера, присмотритесь к курсору сейчас.
Странно всё это. Решил покопаться в вопросе и нашёл историю, почему так вышло.
Почему курсор в Windows и macOS кривой

Виды курсоров в ОС Xerox Star 8010
В 1981 году инженер Дуглас Эльгенбарт из XEROX изобрёл мышь. Курсор для неё изначально задумали прямым: вертикальной стрелкой, показывающей строго вверх.
Когда эту идею воплотили на разрабатываемом компьютере XEROX Alto, стало понятно: прямой курсор-стрелку тяжело выделить на фоне линий текстовой информации. Он совсем терялся.
Тогда Дуглас банально повернул пиктограмму курсора на 45 градусов. Левая сторона и правый край были сплющены до вертикальной и горизонтальной линии соответственно, чтобы очертания курсора выглядели чётче на дисплеях того времени с очень низким разрешением.

Финальная версия курсора XEROX.
Симметрия стрелки исчезла, но результат понравился всем.
Чуть позднее молодого Стива Джобса пригласили в исследовательский центр XEROX PARC, где он, скажем так, набирался идей. Курсор мыши для будущей Macintosh Operating System Джобс присмотрел именно там, с экрана XEROX Alto.
Через пару лет Билл Гейтс подсмотрел курсор мыши у Apple, когда Microsoft разрабатывала Windows 1.0. Бывает.
Вот и всё. Первый сделал, второй скопировал у первого, третий скопировал у второго. Так и прижилось.
P.S. Пока не определился, надо беситься на курсор дальше или всё, мир.
(58 голосов, общий рейтинг: 4.83 из 5)
Хочешь больше? Подпишись на наш Telegram.

В закладки
Курсор
The cursor CSS property specifies the mouse cursor displayed when the mouse pointer is over an element.
| Начальное значение | auto |
|---|---|
| Применяется к | все элементы |
| Наследуется | да |
| Обработка значения | как указано, но с абсолютными значениями url |
| Animation type | discrete |
Синтаксис
/* Применение ключевых значений */ cursor: pointer; cursor: auto; /* Использование URL и координат */ cursor: url(cursor1.png) 4 12, auto; cursor: url(cursor2.png) 2 2, pointer; /* Глобальные значения */ cursor: inherit; cursor: initial; cursor: unset;
Значения
Ссылка или разделённый запятыми список ссылок: url(…), url(…), … , указывающие на файл изображения. Дополнительные ссылки могут быть предоставлены в качестве запасных значений, на случай если изображение по основной ссылке не поддерживается в качестве курсора. Запасное значение, не являющееся ссылкой (одно или несколько ключевых слов) должно находиться в конце списка значений. See Using URL values for the cursor property for more details.
Необязательные значения х- и у- координат. Два безразмерных неотрицательных числа меньше 32.
Наведите курсор на картинку, чтобы увидеть пример в действии:
Указывает на возможность перемещения объекта.
Приближение или уменьшение.
Указывает на возможность схватить и переместить объект.
Формальный синтаксис
cursor =
[ (en-US) [ (en-US) | (en-US) ] (en-US) [ (en-US) ] (en-US) ? (en-US) ] (en-US) # (en-US) ? (en-US) [ (en-US) auto | (en-US) default | (en-US) none | (en-US) context-menu | (en-US) help | (en-US) pointer | (en-US) progress | (en-US) wait | (en-US) cell | (en-US) crosshair | (en-US) text | (en-US) vertical-text | (en-US) alias | (en-US) copy | (en-US) move | (en-US) no-drop | (en-US) not-allowed | (en-US) grab | (en-US) grabbing | (en-US) e-resize | (en-US) n-resize | (en-US) ne-resize | (en-US) nw-resize | (en-US) s-resize | (en-US) se-resize | (en-US) sw-resize | (en-US) w-resize | (en-US) ew-resize | (en-US) ns-resize | (en-US) nesw-resize | (en-US) nwse-resize | (en-US) col-resize | (en-US) row-resize | (en-US) all-scroll | (en-US) zoom-in | (en-US) zoom-out ] (en-US)
=
url( (en-US) * (en-US) ) | (en-US)
src( (en-US) * (en-US) )
Примеры
.foo cursor: crosshair; > /* use prefixed-value if "zoom-in" isn't supported */ .bar cursor: -webkit-zoom-in; cursor: zoom-in; > /* standard cursor value as fallback for url() must be provided (doesn't work without) */ .baz cursor: url(hyper.cur), auto; >
Спецификации
| Specification |
|---|
| CSS Basic User Interface Module Level 4 # cursor |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Using URL values for the cursor property
- pointer-events
- Cursor Property (MSDN)
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Динамическое изменение состояния курсора
Есть такая интересная WindowsAPI-функция — setSystemCursor. У нее есть два параметра.
□ Курсор, который надо изменить. Чтобы указать на системный курсор, МОЖНО ИСПОЛЬЗОВАТЬ ФУНКЦИЮ GetCursor.
Вид системного курсора, который нужно установить. Здесь можно указать одно из следующих значений:
• ocr_NORMAL — нормальный курсор в виде стрелки;
• ocr_ibeam — курсор, используемый для выделения текста;
• ocr_wait — большие песочные часы;
• ocr__up — стрелка вверх;
• OCRSIZE — курсор изменения размера;
• ocr__sizewe — курсор горизонтального изменения размера;
• OCR_sizens — курсор вертикального изменения размера;
• ocr_sizeall — курсор горизонтального и вертикального изменения размера;
• ocr__sizeno — интернациональный несимвольный курсор;
• ocr_appstarting — маленькие песочные часы со стрелкой.
И сразу же небольшой пример изменения текущего вида указателя мыши:
procedure TForml.ButtonlClick(Sender: TObject);
Вопрос: Можно ли рандомно менять вид системного курсора, чтобы в течение определенного времени курсор последовательно принимал все перечисленные значения?
| Rabid Coyote |
| Посмотреть профиль |
| Отправить персональное сообщение для Rabid Coyote |
| Отправить Email для Rabid Coyote |
| Найти все сообщения от Rabid Coyote |
31.12.2012, 17:32
Профессионал
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Вы сказали Спасибо: 52
Поблагодарили 346 раз(а) в 319 сообщениях
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
Можно. В чем проблема?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
31.12.2012, 18:30
Регистрация: 08.06.2012
Сообщения: 32
Вы сказали Спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Версия Delphi: 10 Lite, 2007
Репутация: 10
Сообщение от Bargest
Можно. В чем проблема?
проблема в том, что у меня не получается. )))
попробовал вот так:
procedure TForm1.Button1Click(Sender: TObject); begin repeat randomize; setSystemCursor(GetCursor, ocr_cross); setSystemCursor(GetCursor, ocr_wait) setSystemCursor(GetCursor, ocr_up); setSystemCursor(GetCursor, ocr_normal); until true; end; end.;
lmikle: пользуемся правильными тегами!
но может быть, можно лучше? ))
Последний раз редактировалось lmikle, 01.01.2013 в 12:21 .
| Rabid Coyote |
| Посмотреть профиль |
| Отправить персональное сообщение для Rabid Coyote |
| Отправить Email для Rabid Coyote |
| Найти все сообщения от Rabid Coyote |
31.12.2012, 22:11
Профессионал
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Вы сказали Спасибо: 52
Поблагодарили 346 раз(а) в 319 сообщениях
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
Во-первых, рандомайз внутри цикла лишен смысла. Он делается один раз при старте программы. Далее используется рандом. Во-вторых, рандомности в коде нет. Как вариант, сделать массив из всех возможных значений курсоров, в цикле брать рандом от размера этого массива и юзать полученное число как индекс курсора в массиве. Вариант 2 — посмотреть, чему соответствуют эти константы курсоров. Это будут числа, и скорее всего они будут по порядку. Поэтому можно брать рандом сразу от них. Ну и в цикле надо делать ожидание, иначе курсоры будут мигать с огромной скоростью и сольются в марево.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.