如何强制帮助和打印机设置对话框与正在运行的应用程序显示在同一监视器上?

时间:2014-01-30 21:24:40

标签: delphi delphi-2007

我知道如何强制表单与正在运行的应用程序显示在同一个监视器上,但我没有看到如何让帮助或打印机设置对话框显示在同一个监视器上。 “帮助”显示上次显示的位置,但我们希望它显示在应用程序监视器上。 “打印机设置”对话框似乎总是出现在主监视器上

1 个答案:

答案 0 :(得分:1)

将父表单的Handle传递给TPrinterSetupDialog.Execute似乎可以解决问题。

if PrinterSetupDialog1.Execute(Self.Handle) then
  //

使用Delphi 7(TPrinterSetupDialog.Execute不接受参数),您有两种选择。

最简单的方法是创建自己的TPrinterSetupDialog后代。 ExecuteTCommonDialog中是虚拟的,TPrinterSetupDialog的祖先,它被覆盖。您可以在自己的后代中覆盖它,使用TPrinterSetupDialog中的代码作为您自己的Execute覆盖的基础,同时添加overload。您的重载Execute会接受ParentHandle: HWND参数,并将PrintDlgRec.hWndOwner设置为提供的窗口句柄。

我考虑过为你编写这个(或者至少开始),但还有其他一些你需要从Dialogs单元复制的东西(在实现部分中定义的函数)包装一些API调用,以及用于对话框消息循环的回调函数),并且我没有D7可用于我甚至尝试编译它。

另一种选择(正如David Heffernan在下面的评论中提到的)将直接自己调用Windows API PrintDlgEx。这在MSDN中的Print Dialog Box (Windows)主题中进行了讨论。再一次,我没有D7可用,所以我不能给你一个从Delphi中使用它的例子。 (我检查过,并没有藏在任何地方。)

我不确定你可以设置帮助窗口的位置;我认为这是由Windows根据用户之前的使用情况自动完成的。 (无论如何,我无法这样做。)