如何让打印机对话框保持顶层显示且呈现Option 1样式
打印机对话框置顶同时保持指定样式的解决办法
问题原因
你遇到的情况是:设hwndOwner为NULL时,对话框是你要的Option 1样式,但会被其他窗口压在下面;设成GetForegroundWindow(),对话框能置顶,却变成了不想要的Option 2样式。这是因为系统会根据父窗口的类型自动切换打印对话框的UI风格——当你指定前台窗口(可能是其他程序的,或者当前程序的现代风格窗口)时,系统会加载新的对话框样式。
解决方法
1. 强制启用旧版UI样式
给pd.Flags加上PD_USEOLDUI标志,这个参数能强制系统使用传统的打印对话框(就是你要的Option 1),同时指定父窗口让它保持置顶。修改后的代码如下:
#include "commdlg.h" static PRINTDLG pd; ZeroMemory(&pd, sizeof(pd)); pd.lStructSize = sizeof(pd); pd.hDevMode = NULL; pd.hDevNames = NULL; // 加上PD_USEOLDUI强制启用旧版样式 pd.Flags = PD_NOWARNING | PD_RETURNDC | PD_NOSELECTION | PD_HIDEPRINTTOFILE | PD_USEOLDUI; // 建议用自己程序的主窗口句柄,别用GetForegroundWindow(),避免拿到其他程序的窗口 pd.hwndOwner = GetActiveWindow(); // 或者直接传你程序主窗口的HWND变量 int ok = PrintDlg(&pd);
2. 使用自身程序的窗口作为父窗口
GetForegroundWindow()可能抓到其他程序的窗口,导致样式乱变。最好直接传你自己程序的主窗口句柄——比如你启动程序时创建的那个窗口的HWND,或者用GetActiveWindow()获取当前线程的活动窗口,这样既能保证对话框在你程序窗口上方,样式也不会跑偏。
补充说明
PD_USEOLDUI是Windows公共对话框的标准标志,专门用来强制切换到旧版打印对话框界面,不受父窗口的UI风格影响。加上这个标志后,只要父窗口句柄合法,对话框就会是你要的Option 1样式,同时保持顶层显示。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

