#ifndef _AFXPRNTX_H_
#define _AFXPRNTX_H_

#ifdef _DEBUG
# ifdef _UNICODE
#  ifdef _AFXDLL
#   pragma comment(lib, "MFCPrintDialogExDUD.lib")
#  else
#   pragma comment(lib, "MFCPrintDialogExSUD.lib")
#  endif
# else
#  ifdef _AFXDLL
#   pragma comment(lib, "MFCPrintDialogExDAD.lib")
#  else
#   pragma comment(lib, "MFCPrintDialogExSAD.lib")
#  endif
# endif
#else
# ifdef _UNICODE
#  ifdef _AFXDLL
#   pragma comment(lib, "MFCPrintDialogExDU.lib")
#  else
#   pragma comment(lib, "MFCPrintDialogExSU.lib")
#  endif
# else
#  ifdef _AFXDLL
#   pragma comment(lib, "MFCPrintDialogExDA.lib")
#  else
#   pragma comment(lib, "MFCPrintDialogExSA.lib")
#  endif
# endif
#endif

//WINBUG: these declarations are not yet in the NT5 Headers
#ifndef PD_RESULT_CANCEL

#undef  INTERFACE
#define INTERFACE   IPrintDialogCallback

DECLARE_INTERFACE_(IPrintDialogCallback, IUnknown)
{
    // *** IUnknown methods ***
    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;

    // *** IPrintDialogCallback methods ***
    STDMETHOD(InitDone) (THIS) PURE;
    STDMETHOD(SelectionChange) (THIS) PURE;
    STDMETHOD(HandleMessage) (THIS_ HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult) PURE;
};


//
//  Result action ids for PrintDlgEx.
//
#define PD_RESULT_CANCEL               0
#define PD_RESULT_PRINT                1
#define PD_RESULT_APPLY                2

#define START_PAGE_GENERAL             0xffffffff

//
//  Page Range structure for PrintDlgEx.
//
typedef struct tagPRINTPAGERANGE {
   DWORD  nFromPage;
   DWORD  nToPage;
} PRINTPAGERANGE, *LPPRINTPAGERANGE;


//
//  PrintDlgEx structure.
//
typedef struct tagPDEXA {
   DWORD                 lStructSize;          // size of structure in bytes
   HWND                  hwndOwner;            // caller's window handle
   HGLOBAL               hDevMode;             // handle to DevMode
   HGLOBAL               hDevNames;            // handle to DevNames
   HDC                   hDC;                  // printer DC/IC or NULL
   DWORD                 Flags;                // PD_ flags
   DWORD                 Flags2;               // reserved
   DWORD                 ExclusionFlags;       // items to exclude from driver pages
   DWORD                 nPageRanges;          // number of page ranges
   DWORD                 nMaxPageRanges;       // max number of page ranges
   LPPRINTPAGERANGE      lpPageRanges;         // array of page ranges
   DWORD                 nMinPage;             // min page number
   DWORD                 nMaxPage;             // max page number
   DWORD                 nCopies;              // number of copies
   HINSTANCE             hInstance;            // instance handle
   LPCSTR                lpPrintTemplateName;  // template name for app specific area
   LPUNKNOWN             lpCallback;           // app callback interface
   DWORD                 nPropertyPages;       // number of app property pages in lphPropertyPages
   HPROPSHEETPAGE       *lphPropertyPages;     // array of app property page handles
   DWORD                 nStartPage;           // start page id
   DWORD                 dwResultAction;       // result action if S_OK is returned
} PRINTDLGEXA, *LPPRINTDLGEXA;
//
//  PrintDlgEx structure.
//
typedef struct tagPDEXW {
   DWORD                 lStructSize;          // size of structure in bytes
   HWND                  hwndOwner;            // caller's window handle
   HGLOBAL               hDevMode;             // handle to DevMode
   HGLOBAL               hDevNames;            // handle to DevNames
   HDC                   hDC;                  // printer DC/IC or NULL
   DWORD                 Flags;                // PD_ flags
   DWORD                 Flags2;               // reserved
   DWORD                 ExclusionFlags;       // items to exclude from driver pages
   DWORD                 nPageRanges;          // number of page ranges
   DWORD                 nMaxPageRanges;       // max number of page ranges
   LPPRINTPAGERANGE      lpPageRanges;         // array of page ranges
   DWORD                 nMinPage;             // min page number
   DWORD                 nMaxPage;             // max page number
   DWORD                 nCopies;              // number of copies
   HINSTANCE             hInstance;            // instance handle
   LPCWSTR               lpPrintTemplateName;  // template name for app specific area
   LPUNKNOWN             lpCallback;           // app callback interface
   DWORD                 nPropertyPages;       // number of app property pages in lphPropertyPages
   HPROPSHEETPAGE       *lphPropertyPages;     // array of app property page handles
   DWORD                 nStartPage;           // start page id
   DWORD                 dwResultAction;       // result action if S_OK is returned
} PRINTDLGEXW, *LPPRINTDLGEXW;
#ifdef UNICODE
typedef PRINTDLGEXW PRINTDLGEX;
typedef LPPRINTDLGEXW LPPRINTDLGEX;
#else
typedef PRINTDLGEXA PRINTDLGEX;
typedef LPPRINTDLGEXA LPPRINTDLGEX;
#endif // UNICODE
#endif

class C_PrintDialogEx : public CPrintDialog
{
        DECLARE_DYNAMIC(C_PrintDialogEx)

        BEGIN_INTERFACE_PART(PrintDialogCallback, IPrintDialogCallback)
                INIT_INTERFACE_PART(C_PrintDialogEx, PrintDialogCallback)
                STDMETHOD(InitDone)();
                STDMETHOD(SelectionChange)();
                STDMETHOD(HandleMessage)(HWND, UINT, WPARAM, LPARAM, LRESULT*);
        END_INTERFACE_PART(PrintDialogCallback)

        DECLARE_INTERFACE_MAP()

public:
        C_PrintDialogEx(BOOL bPrintSetupOnly,
                DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES
                        | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,
                        CWnd* pParentWnd = NULL);

        virtual INT_PTR DoModal();

        virtual HRESULT OnInitDone();
        virtual HRESULT OnSelectionChange();
        virtual HRESULT OnHandleMessage(HWND hDlg, UINT uMsg, WPARAM wParam,
                LPARAM lParam, LRESULT* pResult);

        PRINTDLGEX m_pdex;
};

#endif