是否有用于为表单的标题栏、系统菜单图标以及最小化、最大化和关闭按钮设置自定义光标的 Windows API?

我有一个为给定控件加载和设置光标的函数:

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);

但是我缺少一种为特定表单部分设置光标的方法,例如表单标题栏、系统菜单图标以及最小化、最大化和关闭按钮。有没有办法为这些表单部分设置光标?

最佳答案

处理 WM_SETCURSOR 消息并针对以下 HitTest 代码值之一测试消息参数的 HitTest 字段,并通过使用 SetCursor 函数设置光标,返回 到消息 Result(Windows API 宏 TRUE 和匹配 与 匹配到 Delphi 的 Boolean 类型值,因此您只能在那里进行类型转换):

  • HTCAPTION - 标题栏
  • HTSYSMENU - 系统菜单图标
  • HTMINBUTTON - 最小化按钮
  • HTMAXBUTTON - 最大化按钮
  • HTCLOSE - 关闭按钮

  • 例如:
    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;
    

    关于delphi - 如何为表单的标题栏、系统菜单图标以及最小化、最大化和关闭按钮设置自定义光标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49591826/

    10-15 06:23