我用一个按钮确认MessageBox()
(或确定/取消)。我可以将这个消息框放在我的应用程序的某个窗口中(我使用Delphi,我有窗口句柄h)。不是整个屏幕的中心。
答案 0 :(得分:3)
不,没有记录的方法来定位标准的Windows MessageBox对话框。
但是,您可以使用MessageDlgPos代替(在对话框中):
MessageDlgPos('This is my dialog', mtInformation, [mbOk], 0, 100, 100);
困难的部分是计算坐标以在窗口中正确居中,因为对话框会根据提供的文字自动调整大小。
链接的文档是针对XE5文档的,但该函数也存在于早期版本的Delphi中。我已经确认它也存在于Delphi 2007中。
答案 1 :(得分:2)
使用窗口过程挂钩可以实现这一点,如this answer。
所示使用该单元,您可以将任何原生对话框居中,例如:MessageBox
,TFindDialog
,TOpenDialog
,TFontDialog
,TPrinterSetupDialog
, etc ...主单元提供两个例程,都带有一些可选参数:
function ExecuteCentered(Dialog: TCommonDialog;
WindowToCenterIn: HWND = 0): Boolean;
function MsgBox(const Text: String; Flags: Cardinal = DefFlags;
const Caption: String = DefCaption;
WindowToCenterIn: HWND = 0): Integer;
如果你使用OpenDialog1.Execute
并让Windows决定在哪里显示对话框,你现在使用ExecuteCentered(OpenDialog1)
,对话框以屏幕的活动形式为中心。
要显示消息对话框,请使用MsgBox
,Application.MessageBox
周围的包装(后者是Windows.MessageBox
的包装)。一些例子:
MsgBox('Hello world!');
MsgBox('Cancel saving?', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2);
MsgBox('Please try again.', MB_OK, 'Error');
MsgBox('I''m centered in the toolbar.', MB_OK, 'Fun!', Toolbar1.Handle);
答案 2 :(得分:0)
您可以创建自己的对话框,自动以传递给它的TWinControl为中心。我做到了这一点,它可以作为MPL下dzlib library的一部分。要添加到程序中的单位是子目录src\forms中的w_dzDialog。
你这样使用它:
Tf_dzDialog.ShowMessage(mtWarning, _('Your message goes here.'#13#10
+ 'I can have multiple lines and even' + #13#10
+ #13#10
+ 'empty lines as the one above', [dbeOK], Self);
最后一个参数(此处为:Self)是对话框所在的控件。它必须是TWinControl,所以表单很好。但是对于跨越整个监视器(或甚至多个监视器)的大型监视器和窗口,例如可能是方便的。传递按钮或面板,使对话框以用户注意力集中的区域为中心。
该对话框的外观和行为与Windows XP中的标准ShowMessage对话框非常相似(如果您希望获得Windows 7,可能会出现问题)但是比这更灵活。
[/无耻插件]