PRINTDLG 打印对话框操作

Posted 我来乔23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PRINTDLG 打印对话框操作相关的知识,希望对你有一定的参考价值。

typedef struct tagPD {
  DWORD           lStructSize;
  HWND            hwndOwner;
  HGLOBAL         hDevMode;
  HGLOBAL         hDevNames;
  HDC             hDC;
  DWORD           Flags;
  WORD            nFromPage;
  WORD            nToPage;
  WORD            nMinPage;
  WORD            nMaxPage;
  WORD            nCopies;
  HINSTANCE       hInstance;
  LPARAM          lCustData;
  LPPRINTHOOKPROC lpfnPrintHook;
  LPSETUPHOOKPROC lpfnSetupHook;
  LPCTSTR         lpPrintTemplateName;
  LPCTSTR         lpSetupTemplateName;
  HGLOBAL         hPrintTemplate;
  HGLOBAL         hSetupTemplate;
} PRINTDLG, *LPPRINTDLG;

  参数说明

  lStructSize:本结构大小(字节数)
  hwndOwner:父窗口句柄(可为NULL)
  hDevMode:包含打印机设备与环境信息的DEVMODE结构句柄
  hDevNames:包含驱动器名、打印机名和输出端口名的设备名结构DEVNAMES句柄
  hDC:确定DC或IC(information context),由Flags是否设置PD_RETURNDC或PC_RETURNIC标志来决定
  Flags:用于打印公用对话框初始化的标志位
  nFromPage:指定开始页码编辑控件的初始值
  nToPage:指定结束页码编辑控件的初始值
  nMinPage:指定开始/结束页码编辑控件的页码范围的最小值,若nMinPage=nMaxPage,则“页码范围”单选钮和开始/结束页码编辑控件被灰化
  nMaxPage:指定开始/结束页码编辑控件的页码范围的最大值
  nCopies:指定拷贝份数编辑控件的初始值
  hInstance:以下结构成员很少使用
  lCustData:
  lpfnPrintHook:
  lpfnSetupHook:
  lpPrintTemplateName:
  lpSetupTemplateName:
  hPrintTemplate:
  hSetupTemplate:

Flags初始化标志

  PD_ALLPAGES(0x00) 指定“全部”单选钮在初始时被选中(缺省标志)
  PD_COLLATE(0x10) 指定“自动分页”复选框在初始时被选中
  PD_DISABLEPRINTTOFILE(0x80000) 使打印到文件复选框失效
  PD_ENABLEPRINTHOOK
  PD_ENABLEPRINTTEMPLATE
  PD_ENABLEPRINTTEMPLATEHANDLE
  PD_ENABLESETUPHOOK
  PD_ENABLESETUPTEMPLATE
  PD_ENABLESETUPTEMPLATEHANDLE
  PD_HIDEPRINTTOFILE(0x100000) 隐藏“打印到文件”复选框(缺省标志)
  PD_NONETWORKBUTTON(0x200000) 隐藏网络按钮
  PD_NOPAGENUMS(0x08) 使“页码范围”单选钮和开始/结束页码编辑控件失效(缺省标志)
  PD_NOSELECTION(0x04) 使“选定范围”单选钮失效(缺省标志)
  PD_NOWARNING(0x80) 防止系统在没有缺省打印机时显示警告消息
  PD_PAGENUMS(0x02) 指定“页码范围”单选钮在初始时被选中,若返回时该标志位被设置,则nFromPage与nFromPage中为用户设置的开始与结束页码
  PD_PRINTSETUP(0x40) 使系统显示打印设置对话框而不是打印对话框
  PD_PRINTTOFILE(0x20) 指定“打印到文件”复选框在初始时被选中
  PD_RETURNDC(0x100) 使打印对话框返回与用户选择相匹配的DC到hDC成员
  PD_RETURNDEFAULT(0x400) 不显示打印对话框,将hDevNames与hDevMode分别设置为用系统缺省打印机来初始化的结构DEVMODE与DEVNAMES的句柄
  PD_RETURNIC(0x200) 使打印对话框返回与用户选择相匹配的IC到hDC成员
  PD_SELECTION(0x01) 指定“选定范围”单选钮在初始时被选中
  PD_SHOWHELP(0x800) 使对话框显示帮助按钮,在用户单击帮助按钮时对话框会发送HELPMSGSTRING注册消息,hwndOwner成员必须指定接受该消息的窗口
  PD_USEDEVMODECOPIES(0x40000) 同PD_USEDEVMODECOPIESANDCOLLATE
  PD_USEDEVMODECOPIESANDCOLLATE(0x40000) 指定你的应用程序不支持多份打印与自动分页(缺省标志)。此时PRINTDLG结构的nCopies成员总是返回1,而且PD_COLLATE决不被设置

举例

    PRINTDLG pd ;
    memset( &pd, 0, sizeof( PRINTDLG ) ) ;
    pd.lStructSize = sizeof( PRINTDLG ) ;
    pd.hwndOwner   = m_hWnd ;
    pd.hDevMode    = m_hDevMode ;
    pd.hDevNames   = m_hDevNames ;
    pd.hDC         = NULL ;
    pd.Flags       = PD_RETURNDC | PD_SELECTION | PD_NOPAGENUMS | PD_COLLATE ; 
    pd.nFromPage   = 0 ;
    pd.nToPage     = 0 ;
    pd.nMinPage    = 0 ; 
    pd.nMaxPage    = 0 ;
    pd.nCopies     = 1 ;  
    pd.hInstance   = NULL ; 
    pd.lCustData   = 0L ;     
    pd.lpfnPrintHook = NULL ;
    pd.lpfnSetupHook = NULL ;
    pd.lpPrintTemplateName  = NULL ;
    pd.lpSetupTemplateName  = NULL ;
    pd.hPrintTemplate       = NULL ;
    pd.hSetupTemplate       = NULL ;
    
    if ( !PrintDlg( &pd ) )
        return 0 ;

    if ( NULL != pd.hDevMode )
        ::GlobalFree( pd.hDevMode ) ;

    if ( NULL != pd.hDevNames )
        ::GlobalFree( pd.hDevNames ) ;

效果

 再来一个例子:

PRINTDLG pd ;
memset( &pd, 0, sizeof( PRINTDLG ) ) ;
pd.lStructSize = sizeof( PRINTDLG ) ;
pd.Flags = PD_PRINTSETUP ;
pd.hDevMode    = m_hDevMode ;
pd.hDevNames   = m_hDevNames ;

if ( PrintDlg( &pd ) )
{
     m_hDevMode = pd.hDevMode ;
     m_hDevNames = pd.hDevNames ;
}

 

以上是关于PRINTDLG 打印对话框操作的主要内容,如果未能解决你的问题,请参考以下文章

Win32:为啥我的 PRINTDLG(或 PRINTDLGEX)有灰色背景?

Honeycomb 中的片段加载微调器/对话框

执行代码时有时不显示对话框片段

argparse 代码片段只打印部分日志

无法在片段内创建对话框

我该如何做模态对话框片段(代码在我关闭之前不会执行)