2014-02-22 24 views
0

我打电话MessageBox()有一个按钮确定(或确定/取消)。我可以将这个味精盒从我的应用程序中心(我使用Delphi,我有窗口句柄h)中的某个窗口。不居中到整个屏幕。Center MessageBox窗口到我自己的窗口?

+2

您可以使用CBT钩子做到这一点。 Sertac Akyuz在这个网站上有一个答案,显示了如何。如果您希望您的应用在未来的Windows上运行良好,您可能不应该这样做。 –

+2

在Vista +上,应该使用'TaskDialog/Indirect()'而不是'MessageBox()'。他们更加灵活。例如,'TaskDialogIndirect()'有一个'TDF_POSITION_RELATIVE_TO_WINDOW'标志将对话框居中在它的父窗口上。 –

回答

3

不,没有文档定位标准Windows MessageBox对话框的方法。

你可以,但是,使用MessageDlgPos,而不是(在对话框单位):

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

困难的部分将被计算坐标到你的窗口中正确中心,在该对话框的大小自动根据提供的文本。

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

+2

这将导致主题为Windows Vista +的本机任务对话框。 –

+0

@Andreas:没错,但是这些版本的Windows下的MessageBox在外观上非常相似。当然,MessageBox也允许你设置窗口标题并提供一个父窗口句柄,而MessageDlg/MessageDlgPos则不需要。 –

0

您可以创建自己的对话框,自动以传递给它的TWinControl为中心。我只是这样做的,它可以作为我的dzlib library在MPL下的一部分。要添加到程序中的单位是子目录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); 

最后一个(这里:自)参数是控制哪个对话框中心。它必须是一个TWinControl,所以表单很好。但是,对于跨越整个监视器(甚至多个监视器)的大型监视器和窗户,可能对例如传递一个按钮或面板,使对话框集中在用户关注的区域。

该对话框的外观和行为非常类似于Windows XP中的标准ShowMessage对话框(如果您想获得Windows 7的外观,这可能是一个问题),但比这更灵活。

[/无耻插头]

2

这是可能的用窗口过程钩,如图this answer

随着该单元(一个或多个),您可以中心的任何原生对话,如:MessageBoxTFindDialogTOpenDialogTFontDialogTPrinterSetupDialog,等...主机提供了两个程序,都与一些可选参数:

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);
相关问题