Вопрос, поднятый в данном запросе, связан с использованием пользовательского курсора в области не-клиента окна в приложениях, созданных с помощью Delphi. Разработчик столкнулся с проблемой, когда, делая контроль перемещаемым, возвращая сообщение WM_NCHITTEST значение HTCAPTION, пользовательский курсор сбрасывался на стандартный курсор Windows при наведении на контроль. Задача заключается в том, чтобы сохранить возможность перемещения контроля, возвращая HTCAPTION, и при этом отображать пользовательский курсор.
Подход к решению
Для решения данной проблемы можно использовать обработчик сообщения WM_SETCURSOR. В этом обработчике следует установить пользовательский курсор, что позволит сохранить его даже при возврате HTCAPTION. Вот пример кода на Object Pascal, который решает проблему:
procedure TCustomVCLControl.WMSetCursor(var Message: TWMSetCursor);
begin
SetCursor(Screen.Cursors[crCustomCursor]); // Замените crCustomCursor на идентификатор вашего курсора
Message.Result := 1;
end;
Обсуждение
В комментариях к подтвержденному ответу обсуждается, необходимо ли проверять, что курсор не должен быть изменен, если Message.HitTest <> HTCAPTION. Однако, поскольку в данном случае WM_NCHITTEST всегда возвращает HTCAPTION, дополнительная проверка не требуется. Тем не менее, важно понимать, что WM_NCHITTEST и WM_SETCURSOR используются для разных целей: первый определяет тип перехвата при нажатии мыши, а второй - изменение курсора при наведении.
Также стоит отметить, что если не обработать WM_SETCURSOR, то по умолчанию будет установлен стандартный курсор. Поэтому, если задача состоит в использовании пользовательского курсора, игнорирование этого сообщения не является решением.
Вывод
Использование обработчика WM_SETCURSOR позволяет сохранить пользовательский курсор при перемещении контролов, возвращающих HTCAPTION в ответ на WM_NCHITTEST. Это решение позволяет разработчикам Delphi сохранить функциональность перемещения контролов, не теряя при этом возможности использования пользовательских курсоров.
Проблема сохранения пользовательского курсора при перемещении контролов в Delphi, используя WM_NCHITTEST, и решение с помощью обработчика WM_SETCURSOR.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.