Delphi/C++ Builder「既定のボタン」へマウスカーソル移動
Delphi/C++ Builder で、既定のボタンへマウスカーソル移動
コントロールパネルの情報「ポインタを自動的に既定のボタン上に移動する」がチェックされている場合、指定されたフォームから Default == True のボタンを探して、マウスカーソルを移動する関数↓
※横に長いのでコピペして見て下さい
この関数は、フォームの位置が決定していないと、ボタンの絶対位置を正しく取得できません
フォームの Position プロパティで、位置を決定している場合は、CM_SHOWINGCHANGED を利用して
等とするとよいです
また、ダイアログの場合は FormActivate が一度しか呼ばれないため、そこへ記述すると簡単です
コントロールパネルの情報「ポインタを自動的に既定のボタン上に移動する」がチェックされている場合、指定されたフォームから Default == True のボタンを探して、マウスカーソルを移動する関数↓
- procedure MoveMouseCursorToDefaultButton(AForm: TForm);
- var I: Integer;
- MoveCursor: Integer; // Delphi XE2 アップデートにより、例外が発生するようになったため Boolean → Integer へ変更
- begin
- if SystemParametersInfo(SPI_GETSNAPTODEFBUTTON, 0, @MoveCursor, 0) and (MoveCursor <> 0) and (AForm <> nil) then begin
- for I := AForm.ComponentCount - 1 downto 0 do begin
- if (AForm.Components[I] is TButton) and TButton(AForm.Components[I]).Default then begin
- with TButton(AForm.Components[I]) do begin
- SetCursorPos(ClientOrigin.X + (Width div 2), ClientOrigin.Y + (Height div 2));
- end;
- Exit;
- end;
- end;
- end;
- end;
この関数は、フォームの位置が決定していないと、ボタンの絶対位置を正しく取得できません
フォームの Position プロパティで、位置を決定している場合は、CM_SHOWINGCHANGED を利用して
- private
- procedure CMShowingChanged(var message: TMessage); message CM_SHOWINGCHANGED;
- // :
- procedure TForm1.CMShowingChanged(var message: TMessage);
- begin
- inherited;
- if Visible then begin
- Update;
- MoveMouseCursorToDefaultButton(Self); //
- end;
- end;
また、ダイアログの場合は FormActivate が一度しか呼ばれないため、そこへ記述すると簡単です
- procedure TForm1.FormActivate(Sender: TObject);
- begin
- MoveMouseCursorToDefaultButton(Self); //
- end;
コメント