中心MessageBox窗口到我自己的窗口?

时间:2014-02-22 22:45:57

标签: delphi winapi

我用一个按钮确认MessageBox()(或确定/取消)。我可以将这个消息框放在我的应用程序的某个窗口中(我使用Delphi,我有窗口句柄h)。不是整个屏幕的中心。

3 个答案:

答案 0 :(得分:3)

不,没有记录的方法来定位标准的Windows MessageBox对话框。

但是,您可以使用MessageDlgPos代替(在对话框中):

MessageDlgPos('This is my dialog', mtInformation, [mbOk], 0, 100, 100);

困难的部分是计算坐标以在窗口中正确居中,因为对话框会根据提供的文字自动调整大小。

链接的文档是针对XE5文档的,但该函数也存在于早期版本的Delphi中。我已经确认它也存在于Delphi 2007中。

答案 1 :(得分:2)

使用窗口过程挂钩可以实现这一点,如this answer

所示

使用该单元,您可以将任何原生对话框居中,例如:MessageBoxTFindDialogTOpenDialogTFontDialogTPrinterSetupDialog, 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),对话框以屏幕的活动形式为中心。

要显示消息对话框,请使用MsgBoxApplication.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,可能会出现问题)但是比这更灵活。

[/无耻插件]