Как настроить пользовательский курсор для заголовка формы, значка системного меню и свернуть, увеличить и закрыть кнопки?

Существует ли API Windows для настройки пользовательского курсора для строки заголовка формы, значка системного меню и кнопок минимизации, максимизации и закрытия?

У меня есть функция загрузки и настройки курсоров для данного элемента управления:

type

 TFrm_Main = class(TForm)
 ....
 private
 procedure SetCursor_For(AControl: TControl; ACursor_FileName: string;
 Const ACurIndex: Integer);
 ...
 end;
 const
 crOpenCursor = 1;
 crRotateCursor = 2;
 crCursor_Water = 3;

 var
 Frm_Main: TFrm_Main;
 ...
 procedure TFrm_Main.SetCursor_For(AControl: TControl; ACursor_FileName: 
 string; const ACurIndex: Integer);
 begin
 Screen.Cursors[ACurIndex] := Loadcursorfromfile(PWideChar(ACursor_FileName));
 AControl.Cursor := ACurIndex;
 end;

И я использую его таким образом для формы:

SetCursor_For(Frm_Main, 'Cursors\Cursor_Rotate.ani', crRotateCursor);

Но у меня отсутствует способ установки курсора для определенных частей формы, таких как панель заголовков форм, значок меню системы и кнопки минимизации, максимизации и закрытия. Есть ли способ установить курсор для этих частей формы?

1 ответ

Обращайтесь с сообщением WM_SETCURSOR и протестируйте поле параметра HitTest параметра message для одного из следующих значений кода тестового теста и установите курсор, используя функцию SetCursor, возвращающую True в сообщение Result (макросы Windows API TRUE и FALSE по совпадению совпадают с значениями типа Delphi Boolean, так что вы можете там только typecast):

Например:

type
 TForm1 = class(TForm)
 private
 procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;
 end;

implementation

procedure TForm1.WMSetCursor(var Msg: TWMSetCursor);
begin
 case Msg.HitTest of
 HTCAPTION:
 begin
 Msg.Result := LRESULT(True);
 Winapi.Windows.SetCursor(Screen.Cursors[crHandPoint]);
 end;
 HTSYSMENU:
 begin
 Msg.Result := LRESULT(True);
 Winapi.Windows.SetCursor(Screen.Cursors[crHelp]);
 end;
 HTMINBUTTON:
 begin
 Msg.Result := LRESULT(True);
 Winapi.Windows.SetCursor(Screen.Cursors[crUpArrow]);
 end;
 HTMAXBUTTON:
 begin
 Msg.Result := LRESULT(True);
 Winapi.Windows.SetCursor(Screen.Cursors[crSizeAll]);
 end;
 HTCLOSE:
 begin
 Msg.Result := LRESULT(True);
 Winapi.Windows.SetCursor(Screen.Cursors[crNo]);
 end;
 else
 inherited;
 end;
end;

licensed under cc by-sa 3.0 with attribution.