我打电话MessageBox()
有一个按钮确定(或确定/取消)。我可以将这个味精盒从我的应用程序中心(我使用Delphi,我有窗口句柄h)中的某个窗口。不居中到整个屏幕。Center MessageBox窗口到我自己的窗口?
回答
不,没有文档定位标准Windows MessageBox对话框的方法。
你可以,但是,使用MessageDlgPos,而不是(在对话框单位):
MessageDlgPos('This is my dialog', mtInformation, [mbOk], 0, 100, 100);
困难的部分将被计算坐标到你的窗口中正确中心,在该对话框的大小自动根据提供的文本。
链接的文档是针对XE5文档的,但该函数也存在于早期版本的Delphi中。我已经证实它也存在于Delphi 2007中。
这将导致主题为Windows Vista +的本机任务对话框。 –
@Andreas:没错,但是这些版本的Windows下的MessageBox在外观上非常相似。当然,MessageBox也允许你设置窗口标题并提供一个父窗口句柄,而MessageDlg/MessageDlgPos则不需要。 –
您可以创建自己的对话框,自动以传递给它的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的外观,这可能是一个问题),但比这更灵活。
[/无耻插头]
这是可能的用窗口过程钩,如图this answer。
随着该单元(一个或多个),您可以中心的任何原生对话,如:MessageBox
,TFindDialog
,TOpenDialog
,TFontDialog
,TPrinterSetupDialog
,等...主机提供了两个程序,都与一些可选参数:
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);
- 1. 没有窗口的Tkinter messagebox?
- 2. center align facebook登录窗口
- 3. 在自己的窗口中打开视频的原始窗口
- 4. 一个窗口绑定到自己?
- 5. 关闭tkinter窗口以及messagebox错误窗口
- 6. chrome.desktopCapture.chooseDesktopMedia无法捕捉自己的窗口
- 7. 在自己的窗口中新增cygwinshell
- 8. 来自游戏窗口的窗口getpixel
- 9. 自我窗口为空,但窗口插口正确链接
- 10. 打开的窗口中自我并执行JavaScript的新窗口
- 11. 得到新建窗口的“父”窗口
- 12. 关闭子窗口时避免MessageBox
- 13. 使MessageBox留在其他窗口顶部
- 14. WPF窗口和MessageBox在顶部打开
- 15. MessageBox隐藏在主窗口后面
- 16. 窗口在窗口
- 17. 如何创建自己的窗口而不是使用默认的窗口
- 18. 是否可以为另一个窗口呈现窗口(作为其自己的窗口,而不是表单)?
- 19. 窗口内的HTML窗口
- 20. 窗口内的QT窗口?
- 21. addChild我的窗口到其他应用程序的窗口
- 22. UIWebView Javascript窗口到窗口通信
- 23. Javascript getElementById从父窗口到子窗口
- 24. 父窗口,子窗口的嵌套窗体和自动创建
- 25. 为什么自我窗口在新窗口中打开?
- 26. 全屏窗口无法看到我的窗口
- 27. 添加窗口选项到我的OpenGL渲染器窗口
- 28. 调整显示自定义字体大小的MessageBox窗口?
- 29. 如何在窗口中运行我自己的android模拟器?
- 30. 德尔福:如何让我自己的提示窗口?
您可以使用CBT钩子做到这一点。 Sertac Akyuz在这个网站上有一个答案,显示了如何。如果您希望您的应用在未来的Windows上运行良好,您可能不应该这样做。 –
在Vista +上,应该使用'TaskDialog/Indirect()'而不是'MessageBox()'。他们更加灵活。例如,'TaskDialogIndirect()'有一个'TDF_POSITION_RELATIVE_TO_WINDOW'标志将对话框居中在它的父窗口上。 –