Delphi中呼叫系統的一些Modal模態對話框(如ShowMessage,MessageDlg, Application.MessageBox,InputBox,InputQuery等),一般是螢屏居中,也有其他表單的TForm.Position未定義主視窗居中poMainFormCenter,在主視窗不在螢屏中間或多個
顯示屏時,這些對話框位置不在主視窗中間,既不美觀也不便于操作,
本文提供一簡易方法,不修改模態對話框任何代碼,實作將任意模態視窗相對于主視窗(或任意父視窗)居中,本方法也可移植到C#,Java等
procedure NextModalFormMoveToMyCenter(Owner: TForm); begin
//From HeZiHang@cnBlogs TThread.ForceQueue(nil, procedure var R: TRect; X, Y: Integer; begin GetWindowRect(Application.ActiveFormHandle, R); X := Owner.Left + (Owner.Width - R.Width) div 2; Y := Owner.Top + (Owner.Height - R.Height) div 2; // 將InputBox或MessageBox在Owner Form居中 SetWindowPos(Application.ActiveFormHandle, HWND_TOP, X,Y, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW or SWP_NOOWNERZORDER); end); end;
//Demo1:MessageBox自動居中 procedure TForm1.btnResetClick(Sender: TObject); begin NextModalFormMoveToMyCenter(Self); if Application.MessageBox('是否復位重啟?', '重啟', MB_YESNOCANCEL or MB_ICONQUESTION or MB_DEFBUTTON2) <> mrYes then ,,,,,,,,,//此時MessageBox對Form1居中 end;
//Demo2:InputBox自動居中
procedure TForm1.btnCommandClick(Sender: TObject);
var S: String; begin NextModalFormMoveToMyCenter(Self); S := InputBox('請輸入命令', '命令:', '');,//此時InputBox對Form1居中 ,,,, end;
//Demo3:其他表單,自動居中 procedure TForm1.btnCommandClick(Sender: TObject); var F:TMyForm; S: String; begin NextModalFormMoveToMyCenter(Self); F:=TMyForm.Create(Self); F.ShowModal;//此時 F對Form1居中 end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/464002.html
標籤:Delphi
