2014-01-30 1 views
0

Я знаю, как заставить формы появляться на том же мониторе, что и запущенное приложение, но я не вижу, как обращаться к диалоговым окнам «Справка» или «Настройка принтера» для отображения на одном мониторе. Справка отображает, где она отображается в последний раз, но мы хотим, чтобы она отображалась на мониторе приложения. Диалоговое окно «Настройка принтера» всегда появляется на основном мониторе.Как заставить диалоговые окна справки и настройки принтера отображаться на том же мониторе, что и работающее приложение?

ответ

1

Передача исходной формы Handle на TPrinterSetupDialog.Execute, похоже, делает трюк.

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

Используя Delphi 7 (где TPrinterSetupDialog.Execute не принимает параметр), у вас есть два варианта.

Самый простой способ - создать собственный потомок TPrinterSetupDialog. Execute является виртуальным в TCommonDialog, предком TPrinterSetupDialog, где он переопределяется. Вы можете переопределить его в своем собственном потомке, используйте код в TPrinterSetupDialog в качестве основы для своего собственного Execute переопределения, добавив overload. Ваш перегруженный Execute принял бы параметр ParentHandle: HWND и установил PrintDlgRec.hWndOwner этому ручку окна.

Я думал о том, чтобы попытаться написать это для вас (или, по крайней мере, запустить его), но есть дополнительные вещи, которые вам нужно будет скопировать из блока Dialogs (функции, определенные в разделе реализации, которые обертывают некоторый API вызовы и функция обратного вызова, которая используется для цикла сообщений диалога), и у меня нет D7, доступного там, где я даже пытаюсь его скомпилировать.

Другой альтернативный вариант (как упоминал Давид Хеффернан в своем комментарии ниже) должен был непосредственно вызвать Windows API PrintDlgEx. Это обсуждается в MSDN, в разделе Print Dialog Box (Windows). Еще раз, у меня нет D7, поэтому я не могу дать вам пример использования его из Delphi. (Я проверил, и нигде не спрятался.)

Я не уверен, что вы можете установить положение окна справки; Я думаю, что это делается автоматически Windows на основе предыдущего использования пользователя. (Я так и не смог).

+0

Спасибо. В Delphi 7, TPrinterSetupDialog.Execute не принимает параметр ... –

+0

Спасибо, но вы отметили свой вопрос Delphi ** 2007 **, который делает. :-) –

+0

Вы правы! Мое замешательство! Проблема справки находится в Delphi 2007. Проблема установки принтера находится внутри DLL, которая вызывается из приложения Delphi 2007; к сожалению (?!?), DLL написана в Delphi 7. –

Смежные вопросы