457 lines
14 KiB
C++
457 lines
14 KiB
C++
/*++
|
|
|
|
Copyright (c) 1990-1998, Microsoft Corporation All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
printnew.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the header information for the Win32
|
|
property sheet print common dialogs.
|
|
|
|
Revision History:
|
|
|
|
11-04-97 JulieB Created.
|
|
Feb-2000 LazarI major redesign (not to use printui anymore)
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef WINNT
|
|
|
|
//
|
|
// Include Files.
|
|
//
|
|
|
|
#include <dlgs.h>
|
|
#include <initguid.h>
|
|
#include <winprtp.h>
|
|
|
|
|
|
|
|
|
|
//
|
|
// Constant Declarations.
|
|
//
|
|
|
|
//
|
|
// Dialog Constants.
|
|
//
|
|
#define IDD_PRINT_GENERAL 100
|
|
#define IDD_PRINT_GENERAL_LARGE 101
|
|
|
|
#define IDI_COLLATE ico1
|
|
|
|
#define IDC_PRINTER_LIST 1000
|
|
#define IDC_PRINTER_LISTVIEW 1001
|
|
#define IDC_PRINT_TO_FILE 1002
|
|
#define IDC_FIND_PRINTER 1003
|
|
#define IDC_STATUS_TEXT 1004
|
|
#define IDC_STATUS 1005
|
|
#define IDC_LOCATION_TEXT 1006
|
|
#define IDC_LOCATION 1007
|
|
#define IDC_COMMENT_TEXT 1008
|
|
#define IDC_COMMENT 1009
|
|
#define IDC_DRIVER 1010
|
|
#define IDC_HIDDEN_TEXT 1011
|
|
|
|
#define IDC_RANGE_ALL rad1
|
|
#define IDC_RANGE_SELECTION rad2
|
|
#define IDC_RANGE_CURRENT rad3
|
|
#define IDC_RANGE_PAGES rad4
|
|
#define IDC_RANGE_EDIT edt1
|
|
#define IDC_RANGE_TEXT1 stc1
|
|
#define IDC_RANGE_TEXT2 stc2
|
|
|
|
#define IDC_COPIES edt2
|
|
#define IDC_COPIES_TEXT stc3
|
|
#define IDC_COLLATE chx1
|
|
|
|
#define IDC_STATIC -1
|
|
|
|
|
|
//
|
|
// Typedef Declarations.
|
|
//
|
|
|
|
typedef struct
|
|
{
|
|
UINT ApiType;
|
|
LPPRINTDLGEX pPD;
|
|
DWORD ProcessVersion;
|
|
DWORD dwFlags;
|
|
UINT FinalResult;
|
|
HRESULT hResult;
|
|
BOOL fApply;
|
|
BOOL fOld;
|
|
DWORD dwExtendedError;
|
|
HRESULT hrOleInit;
|
|
#ifdef UNICODE
|
|
LPPRINTDLGEXA pPDA;
|
|
BOOL fPrintTemplateAlloc;
|
|
#endif
|
|
} PRINTINFOEX, *PPRINTINFOEX;
|
|
|
|
|
|
//
|
|
// Registry keys.
|
|
//
|
|
static const TCHAR c_szSettings[] = TEXT("Printers\\Settings");
|
|
static const TCHAR c_szViewMode[] = TEXT("ViewMode");
|
|
|
|
|
|
|
|
|
|
//
|
|
// CPrintBrowser Class.
|
|
//
|
|
|
|
class CPrintBrowser : public IShellBrowser,
|
|
public ICommDlgBrowser2,
|
|
public IPrintDialogCallback,
|
|
public IPrintDialogServices
|
|
{
|
|
public:
|
|
|
|
// *** IUnknown methods ***
|
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj);
|
|
STDMETHOD_(ULONG, AddRef) (THIS);
|
|
STDMETHOD_(ULONG, Release) (THIS);
|
|
|
|
// *** IOleWindow methods ***
|
|
STDMETHOD(GetWindow) (THIS_ HWND *lphwnd);
|
|
STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode);
|
|
|
|
// *** IShellBrowser methods *** (same as IOleInPlaceFrame)
|
|
STDMETHOD(InsertMenusSB) (THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
|
|
STDMETHOD(SetMenuSB) (THIS_ HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
|
|
STDMETHOD(RemoveMenusSB) (THIS_ HMENU hmenuShared);
|
|
STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR lpszStatusText);
|
|
STDMETHOD(EnableModelessSB) (THIS_ BOOL fEnable);
|
|
STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG lpmsg, WORD wID);
|
|
|
|
// *** IShellBrowser methods ***
|
|
STDMETHOD(BrowseObject) (THIS_ LPCITEMIDLIST pidl, UINT wFlags);
|
|
STDMETHOD(GetViewStateStream) (THIS_ DWORD grfMode, LPSTREAM *pStrm);
|
|
STDMETHOD(GetControlWindow) (THIS_ UINT id, HWND *lphwnd);
|
|
STDMETHOD(SendControlMsg) (THIS_ UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
|
|
STDMETHOD(QueryActiveShellView) (THIS_ struct IShellView **ppshv);
|
|
STDMETHOD(OnViewWindowActive) (THIS_ struct IShellView *pshv);
|
|
STDMETHOD(SetToolbarItems) (THIS_ LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
|
|
|
|
// *** ICommDlgBrowser2 methods ***
|
|
STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView *ppshv);
|
|
STDMETHOD(OnStateChange) (THIS_ struct IShellView *ppshv, ULONG uChange);
|
|
STDMETHOD(IncludeObject) (THIS_ struct IShellView *ppshv, LPCITEMIDLIST lpItem);
|
|
STDMETHOD(Notify) (THIS_ struct IShellView *ppshv, DWORD dwNotifyType);
|
|
STDMETHOD(GetDefaultMenuText) (THIS_ struct IShellView *ppshv, WCHAR *pszText, INT cchMax);
|
|
STDMETHOD(GetViewFlags)(THIS_ DWORD *pdwFlags);
|
|
|
|
// *** IPrintDialogCallback methods ***
|
|
STDMETHOD(InitDone) (THIS);
|
|
STDMETHOD(SelectionChange) (THIS);
|
|
STDMETHOD(HandleMessage) (THIS_ HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult);
|
|
|
|
// *** IPrintDialogServices methods ***
|
|
STDMETHOD(GetCurrentDevMode) (THIS_ LPDEVMODE pDevMode, UINT *pcbSize);
|
|
STDMETHOD(GetCurrentPrinterName) (THIS_ LPTSTR pPrinterName, UINT *pcchSize);
|
|
STDMETHOD(GetCurrentPortName) (THIS_ LPTSTR pPortName, UINT *pcchSize);
|
|
|
|
// *** Our own methods ***
|
|
CPrintBrowser(HWND hDlg);
|
|
~CPrintBrowser();
|
|
|
|
BOOL OnInitDialog(WPARAM wParam, LPARAM lParam);
|
|
BOOL OnChildInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam);
|
|
VOID OnDestroyMessage();
|
|
BOOL OnCommandMessage(WPARAM wParam, LPARAM lParam);
|
|
BOOL OnChildCommandMessage(WPARAM wParam, LPARAM lParam);
|
|
BOOL OnNotifyMessage(WPARAM wParam, LPNMHDR lpnmhdr);
|
|
BOOL OnSelChange();
|
|
BOOL OnChangeNotify(LONG lNotification, LPCITEMIDLIST *ppidl);
|
|
BOOL OnAccelerator(HWND hwndActivePrint, HWND hwndFocus, HACCEL haccPrint, PMSG pMsg);
|
|
VOID OnNoPrinters(HWND hDlg, UINT uID);
|
|
VOID OnInitDone();
|
|
|
|
private:
|
|
|
|
HRESULT CreatePrintShellView();
|
|
UINT GetViewMode();
|
|
VOID SetViewMode();
|
|
HRESULT CreateHookDialog();
|
|
BOOL UpdateStatus(LPCITEMIDLIST pidl);
|
|
BOOL SelectSVItem();
|
|
BOOL GetCurrentPrinter();
|
|
VOID InitPrintToFile();
|
|
VOID InitPageRangeGroup();
|
|
VOID InitCopiesAndCollate();
|
|
BOOL SaveCopiesAndCollateInDevMode(LPDEVMODE pDM, LPTSTR pszPrinter);
|
|
BOOL SetCopiesOnApply();
|
|
VOID SaveDevMode();
|
|
BOOL MergeDevMode(LPTSTR pszPrinterName);
|
|
BOOL IsValidPageRange(LPTSTR pszString, UINT *pErrorId);
|
|
BOOL ConvertPageRangesToString(LPTSTR pszString, UINT cchLen);
|
|
UINT IntegerToString(DWORD Value, LPTSTR pszString, UINT cchLen);
|
|
VOID ShowError(HWND hDlg, UINT uCtrlID, UINT uMsgID, ...);
|
|
int ShowMessage(HWND hDlg, UINT uCtrlID, UINT uMsgID, UINT uType, BOOL bBeep, ...);
|
|
int InternalShowMessage(HWND hDlg, UINT uCtrlID, UINT uMsgID, UINT uType, BOOL bBeep, va_list args);
|
|
UINT InsertDevicePage(LPCWSTR pszName, PDEVMODE pDevMode);
|
|
UINT RemoveDevicePage();
|
|
UINT RemoveAndInsertDevicePage(LPCWSTR pszName, PDEVMODE pDevMode);
|
|
BOOL FitViewModeBest(HWND hwndListView);
|
|
VOID SelectPrinterItem(LPITEMIDLIST pidlItem);
|
|
BOOL IsCurrentPrinter(LPCITEMIDLIST pidl);
|
|
BOOL OnRename(LPCITEMIDLIST *ppidl);
|
|
|
|
//
|
|
// The error codes returned by InstallDevMode/UninstallDevMode functions below.
|
|
//
|
|
enum
|
|
{
|
|
kSuccess, // Success no error
|
|
kError, // General error
|
|
kInvalidDevMode, // Invalid devmode specified
|
|
kInvalidPrinterName, // Invalid printer name specified
|
|
kAccessDenied, // User does not have access to printer
|
|
};
|
|
|
|
//
|
|
// These functions maintain the internal devmode, driver UI stuff and
|
|
// implement the printui.dll functionality - bPrinterSetup(...).
|
|
//
|
|
BOOL FindPrinter(HWND hwnd, LPTSTR pszBuffer, UINT cchSize);
|
|
BOOL GetInternalPrinterName(LPTSTR pszBuffer, DWORD *pdwSize);
|
|
LPDEVMODE GetCurrentDevMode();
|
|
BOOL GetDefaultDevMode(HANDLE hPrinter, LPCTSTR pszPrinterName, PDEVMODE *ppDevMode, BOOL bFillWithDefault);
|
|
BOOL WrapEnumPrinters(DWORD dwFlags, LPCTSTR pszServer, DWORD dwLevel, PVOID* ppvBuffer, PDWORD pcbBuffer, PDWORD pcPrinters);
|
|
BOOL GetUsablePrinter(LPTSTR szPrinterNameBuf, DWORD *pcchBuf);
|
|
BOOL GetInternalDevMode(PDEVMODE *ppOutDevMode, LPCTSTR pszPrinter, HANDLE hPrinter, PDEVMODE pInDevMode);
|
|
UINT InstallDevMode(LPCTSTR pszPrinterName, PDEVMODE pDevModeToMerge);
|
|
UINT UninstallDevMode();
|
|
|
|
//
|
|
// Members start here.
|
|
//
|
|
UINT cRef; // compobj refcount
|
|
HWND hwndDlg; // handle of this dialog
|
|
HWND hSubDlg; // handle of the hook dialog
|
|
HWND hwndView; // current view window
|
|
HWND hwndUpDown; // UpDown Control Window handle;
|
|
IShellView *psv; // shell view object
|
|
IShellFolderView *psfv; // shell folder view object
|
|
IShellFolder2 *psfRoot; // print folder shell folder
|
|
LPITEMIDLIST pidlRoot; // pidl for print folder
|
|
IPrinterFolder *ppf; // printer folder private interface
|
|
|
|
HIMAGELIST himl; // system imagelist (small images)
|
|
|
|
PPRINTINFOEX pPI; // ptr to PRINTINFOEX struct
|
|
LPPRINTDLGEX pPD; // caller's PRINTDLGEX struct
|
|
|
|
IPrintDialogCallback *pCallback; // ptr to app's callback interface
|
|
IObjectWithSite *pSite; // ptr to app's SetSite interface
|
|
|
|
LPDEVMODE pDMInit; // ptr to the initial DEVMODE struct
|
|
LPDEVMODE pDMCur; // ptr to the current DEVMODE struct
|
|
LPDEVMODE pDMSave; // ptr to the last good DEVMODE struct
|
|
|
|
UINT cchCurPrinter; // size, in chars, of pszCurPrinter
|
|
LPTSTR pszCurPrinter; // ptr to name of current printer
|
|
|
|
DWORD nCopies; // number of copies
|
|
DWORD nMaxCopies; // max number for the "number of copies"
|
|
DWORD nPageRanges; // number of page ranges in pPageRange
|
|
DWORD nMaxPageRanges; // max number of page ranges allowed
|
|
LPPRINTPAGERANGE pPageRanges; // ptr to an array of page range structs
|
|
|
|
BOOL fCollateRequested; // collate is requested
|
|
BOOL fSelChangePending; // we have a selchange message pending
|
|
BOOL fFirstSel; // still need to set first selection
|
|
BOOL fAPWSelected; // add printer wizard is selected
|
|
BOOL fNoAccessPrinterSelected; // a printer we do not have access to is selected
|
|
BOOL fDirtyDevmode; // Set if we change the devmode while editing.
|
|
BOOL fDevmodeEdit; // devmode editor is open
|
|
BOOL fAllowCollate; // whether collation is allowed by the device
|
|
|
|
UINT nInitDone; // number of CDM_INITDONE messages
|
|
|
|
UINT nListSep; // number of characters in szListSep
|
|
TCHAR szListSep[20]; // list separator
|
|
|
|
UINT uRegister; // change notify register
|
|
|
|
TCHAR szScratch[kPrinterBufMax]; // scratch buffer
|
|
UINT uDefViewMode; // How the default view mode is mapped
|
|
|
|
LPDEVMODE pInternalDevMode; // ptr to the internal DEVMODE
|
|
TCHAR szPrinter[kPrinterBufMax]; // The internal printer name
|
|
HANDLE hPrinter; // The internal printer
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
// Context Help IDs.
|
|
//
|
|
|
|
DWORD aPrintExHelpIDs[] =
|
|
{
|
|
grp1, NO_HELP,
|
|
IDC_PRINTER_LISTVIEW, IDH_PRINT_PRINTER_FOLDER,
|
|
|
|
IDC_STATUS_TEXT, IDH_PRINT_SETUP_DETAILS,
|
|
IDC_STATUS, IDH_PRINT_SETUP_DETAILS,
|
|
IDC_LOCATION_TEXT, IDH_PRINT_SETUP_DETAILS,
|
|
IDC_LOCATION, IDH_PRINT_SETUP_DETAILS,
|
|
IDC_COMMENT_TEXT, IDH_PRINT_SETUP_DETAILS,
|
|
IDC_COMMENT, IDH_PRINT_SETUP_DETAILS,
|
|
|
|
IDC_PRINT_TO_FILE, IDH_PRINT_TO_FILE,
|
|
IDC_FIND_PRINTER, IDH_PRINT_FIND_PRINTER,
|
|
IDC_DRIVER, IDH_PRINT_PREFERENCES,
|
|
|
|
grp2, NO_HELP,
|
|
IDOK, IDH_PRINT_BTN,
|
|
|
|
0, 0
|
|
};
|
|
|
|
|
|
DWORD aPrintExChildHelpIDs[] =
|
|
{
|
|
grp1, NO_HELP,
|
|
IDC_RANGE_ALL, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_SELECTION, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_CURRENT, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_PAGES, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_EDIT, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_TEXT1, IDH_PRINT32_RANGE,
|
|
IDC_RANGE_TEXT2, IDH_PRINT32_RANGE,
|
|
|
|
grp2, NO_HELP,
|
|
IDC_COPIES, IDH_PRINT_COPIES,
|
|
IDC_COPIES_TEXT, IDH_PRINT_COPIES,
|
|
IDC_COLLATE, IDH_PRINT_COLLATE,
|
|
IDI_COLLATE, IDH_PRINT_COLLATE,
|
|
|
|
0, 0
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
// Function Prototypes.
|
|
//
|
|
|
|
HRESULT
|
|
PrintDlgExX(
|
|
PPRINTINFOEX pPI);
|
|
|
|
HRESULT
|
|
Print_ReturnDefault(
|
|
PPRINTINFOEX pPI);
|
|
|
|
BOOL
|
|
Print_LoadLibraries();
|
|
|
|
VOID
|
|
Print_UnloadLibraries();
|
|
|
|
BOOL
|
|
Print_LoadIcons();
|
|
|
|
BOOL
|
|
Print_InvokePropertySheets(
|
|
PPRINTINFOEX pPI,
|
|
LPPRINTDLGEX pPD);
|
|
|
|
BOOL_PTR
|
|
Print_GeneralDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
BOOL_PTR
|
|
Print_GeneralChildDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
LRESULT
|
|
Print_MessageHookProc(
|
|
int nCode,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
BOOL
|
|
Print_InitDialog(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
HRESULT
|
|
Print_ICoCreateInstance(
|
|
REFCLSID rclsid,
|
|
REFIID riid,
|
|
LPVOID *ppv);
|
|
|
|
BOOL
|
|
Print_SaveDevNames(
|
|
LPTSTR pCurPrinter,
|
|
LPPRINTDLGEX pPD);
|
|
|
|
VOID
|
|
Print_GetPortName(
|
|
LPTSTR pCurPrinter,
|
|
LPTSTR pBuffer,
|
|
int cchBuffer);
|
|
|
|
HANDLE
|
|
Print_GetDevModeWrapper(
|
|
LPTSTR pszDeviceName,
|
|
HANDLE hDevMode);
|
|
|
|
BOOL
|
|
Print_NewPrintDlg(
|
|
PPRINTINFO pPI);
|
|
|
|
|
|
#ifdef UNICODE
|
|
HRESULT
|
|
ThunkPrintDlgEx(
|
|
PPRINTINFOEX pPI,
|
|
LPPRINTDLGEXA pPDA);
|
|
|
|
VOID
|
|
FreeThunkPrintDlgEx(
|
|
PPRINTINFOEX pPI);
|
|
|
|
VOID
|
|
ThunkPrintDlgExA2W(
|
|
PPRINTINFOEX pPI);
|
|
|
|
VOID
|
|
ThunkPrintDlgExW2A(
|
|
PPRINTINFOEX pPI);
|
|
#endif
|
|
|
|
#endif // WINNT
|
|
|
|
#ifdef __cplusplus
|
|
}; // extern "C"
|
|
#endif
|
|
|