2014-01-10 52 views
0

我已经将自定义打印属性页/页面添加到PrintDlgEx显示的对话框中。这些属性表当然用于更改其他选项。问题在于,似乎没有任何文档化的方式来激活属性表对话框中的应用按钮,或者任何地方。这似乎是微软方面的一大漏洞。有没有办法使用PrintDlgEx从打印页面激活“应用”按钮?

是否有任何“官方”方式来更改“应用”按钮的状态?如果没有,是否有任何可能的解决方法?

回答

1

是否有任何“官方”方式来改变Apply按钮的状态?如果没有,是否有任何可能的解决方法?

不直接,没有。您将不得不手动检索按钮的HWND,然后根据需要对其进行处理。

  1. 使用SetWindowHookEx()安装本地WH_CBT钩正在调用PrintDlgEx()线程。当收到通知时,对话框的HWND将作为回调函数的参数。然后,您可以在对话框中找到Apply按钮的HWND(使用Spy ++或类似工具获取有关按钮的详细信息,然后让您的代码使用GetDlgItem()FindWindowEx()获取按钮的HWND)。在PrintDlgEx()退出后(或者至少在完成使用按钮HWND后),请务必拨打UnhookWindowsHookEx()

  2. 使用SetWinEventHook()以注册EVENT_OBJECT_CREATEEVENT_OBJECT_SHOW,和/或通知EVENT_SYSTEM_DIALOGSTART(个),正在调用PrintDlgEx()线程。对话框和按钮HWNDs将作为回调函数的参数。 PrintDlgEx()退出后(或者至少在您完成使用按钮HWND后),请务必致电UnhookWinEvent()

一旦你有了按钮的HWND,你就可以随心所欲地做任何事情。这是一个标准的按钮控制,所以任何标准的按钮消息/功能都可以使用它。

+0

是的,我也在想类似的东西,但我的想法并不好。谢谢! – DOS

1

更接近“官方”的方式是调用PropSheet_Changed()。 我得到属性表对话框的方式是查看发送到IPrintDialogCallback :: HandleMessage()的PSN_通知的来源。或者你可以使用GetParent(GetParent(generalDialog))。

一旦你调用PropSheet_Changed(),应用按钮将被激活。

你说得对,这似乎是微软方面的一个巨大漏洞,因为编码并不是一件简单的事情,但这是大多数人添加属性表所需要的东西。

我可以把一些代码,如果任何人需要它。

+0

这非常好!去年我完成了这个项目,但当时我没有注意到MSDN上的属性表参考页中的宏。 – DOS

相关问题