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;
コメント