home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
- #include <dlgs.h> // for standard control IDs for commdlg
-
- #ifdef AFX_AUX_SEG
- #pragma code_seg(AFX_AUX_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #define new DEBUG_NEW
-
- /////////////////////////////////////////////////////////////////////////////
- // Page Setup dialog
-
- CPageSetupDialog::CPageSetupDialog(DWORD dwFlags, CWnd* pParentWnd) :
- CCommonDialog(pParentWnd)
- {
- memset(&m_psd, 0, sizeof(m_psd));
-
- m_psd.lStructSize = sizeof(m_psd);
- m_psd.Flags = (dwFlags | PSD_ENABLEPAGESETUPHOOK | PSD_ENABLEPAGEPAINTHOOK);
- if (!afxData.bWin4 && AfxHelpEnabled())
- m_psd.Flags |= PSD_SHOWHELP;
- m_psd.lpfnPageSetupHook = (COMMDLGPROC)_AfxCommDlgProc;
- m_psd.lpfnPagePaintHook = (COMMDLGPROC)CPageSetupDialog::PaintHookProc;
- }
-
- int CPageSetupDialog::DoModal()
- {
- ASSERT_VALID(this);
- ASSERT(m_psd.Flags & PSD_ENABLEPAGESETUPHOOK);
- ASSERT(m_psd.Flags & PSD_ENABLEPAGEPAINTHOOK);
- ASSERT(m_psd.lpfnPageSetupHook != NULL); // can still be a user hook
- ASSERT(m_psd.lpfnPagePaintHook != NULL); // can still be a user hook
-
- m_psd.hwndOwner = PreModal();
- int nResult = ::PageSetupDlg(&m_psd);
- PostModal();
- return nResult ? nResult : IDCANCEL;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // CPageSetupDialog attributes
-
- LPDEVMODE CPageSetupDialog::GetDevMode() const
- {
- if (m_psd.hDevMode == NULL)
- return NULL;
-
- return (LPDEVMODE)::GlobalLock(m_psd.hDevMode);
- }
-
- CString CPageSetupDialog::GetDriverName() const
- {
- if (m_psd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_psd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wDriverOffset;
- }
-
- CString CPageSetupDialog::GetDeviceName() const
- {
- if (m_psd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_psd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wDeviceOffset;
- }
-
- CString CPageSetupDialog::GetPortName() const
- {
- if (m_psd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_psd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wOutputOffset;
- }
-
- // Create an HDC from the devnames and devmode.
- HDC CPageSetupDialog::CreatePrinterDC()
- {
- ASSERT_VALID(this);
- return AfxCreateDC(m_psd.hDevNames, m_psd.hDevMode);
- }
-
- void CPageSetupDialog::GetMargins(LPRECT lpRectMargins, LPRECT lpRectMinMargins) const
- {
- if (lpRectMargins != NULL)
- memcpy(lpRectMargins, &m_psd.rtMargin, sizeof(RECT));
- if (lpRectMinMargins != NULL)
- memcpy(lpRectMinMargins, &m_psd.rtMinMargin, sizeof(RECT));
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // CPageSetupDialog diagnostics
-
- #ifdef _DEBUG
- void CPageSetupDialog::Dump(CDumpContext& dc) const
- {
- CDialog::Dump(dc);
-
- dc << "m_psd.hwndOwner = " << (UINT)m_psd.hwndOwner;
- dc << "\nm_psd.Flags = " << (LPVOID)m_psd.Flags;
-
- dc << "\nm_psd.ptPaperSize = " << m_psd.ptPaperSize;
- dc << "\nm_psd.rtMinMargin = " << m_psd.rtMinMargin;
- dc << "\nm_psd.rtMinMargin = " << m_psd.rtMinMargin;
-
- if (m_psd.lpfnPageSetupHook == (COMMDLGPROC)_AfxCommDlgProc)
- dc << "\nsetup hook function set to standard MFC hook function";
- else
- dc << "\nsetup hook function set to non-standard hook function";
-
- if (m_psd.lpfnPagePaintHook == (COMMDLGPROC)_AfxCommDlgProc)
- dc << "\nprint hook function set to standard MFC hook function";
- else
- dc << "\nprint hook function set to non-standard hook function";
-
- dc << "\n";
- }
- #endif //_DEBUG
-
- ////////////////////////////////////////////////////////////////////////////
- // CPageSetupDialog hook
-
- UINT CPageSetupDialog::PreDrawPage(WORD /*wPaperType*/, WORD /*wFlags*/,
- LPPAGESETUPDLG)
- {
- return 0;
- //return 1 to prevent any more drawing
- }
-
- UINT CPageSetupDialog::OnDrawPage(CDC*, UINT /*nMessage*/, LPRECT)
- {
- return 0; // do the default
- }
-
- UINT CALLBACK CPageSetupDialog::PaintHookProc(HWND hWnd, UINT message, WPARAM wParam,
- LPARAM lParam)
- {
- if (hWnd == NULL)
- return 0;
- // Get our Window
- // assume it is already wired up to a permanent one
- // the hWnd is the HWND of a control in the page setup proc
- CPageSetupDialog* pDlg = DYNAMIC_DOWNCAST(CPageSetupDialog,
- CWnd::FromHandlePermanent(::GetParent(hWnd)));
- if (pDlg == NULL)
- return 0;
- switch (message)
- {
- case WM_PSD_PAGESETUPDLG:
- return pDlg->PreDrawPage(LOWORD(wParam), HIWORD(wParam),
- (LPPAGESETUPDLG) lParam);
- break;
- case WM_PSD_FULLPAGERECT:
- case WM_PSD_MINMARGINRECT:
- case WM_PSD_MARGINRECT:
- case WM_PSD_GREEKTEXTRECT:
- case WM_PSD_ENVSTAMPRECT:
- case WM_PSD_YAFULLPAGERECT:
- return pDlg->OnDrawPage(CDC::FromHandle((HDC)wParam), message, (LPRECT)lParam);
- break;
- }
- return 0;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // Print/Print Setup dialog
-
- BEGIN_MESSAGE_MAP(CPrintDialog, CCommonDialog)
- //{{AFX_MSG_MAP(CPrintDialog)
- ON_COMMAND(psh1, OnPrintSetup) // print setup button when print is displayed
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- CPrintDialog::CPrintDialog(BOOL bPrintSetupOnly,
- DWORD dwFlags, CWnd* pParentWnd)
- : m_pd(m_pdActual), CCommonDialog(pParentWnd)
- {
- memset(&m_pdActual, 0, sizeof(m_pdActual));
-
- m_pd.lStructSize = sizeof(m_pdActual);
- m_pd.Flags = dwFlags;
- if (!afxData.bWin4 && AfxHelpEnabled())
- {
- m_pd.Flags |= PD_SHOWHELP | PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK;
- m_pd.lpfnPrintHook = (COMMDLGPROC)_AfxCommDlgProc;
- m_pd.lpfnSetupHook = (COMMDLGPROC)_AfxCommDlgProc;
- }
-
- if (bPrintSetupOnly)
- {
- m_nIDHelp = AFX_IDD_PRINTSETUP;
- m_pd.Flags |= PD_PRINTSETUP;
- }
- else
- {
- m_nIDHelp = AFX_IDD_PRINT;
- m_pd.Flags |= PD_RETURNDC;
- }
-
- m_pd.Flags &= ~PD_RETURNIC; // do not support information context
- }
-
- // Helper ctor for AttachOnSetup
- CPrintDialog::CPrintDialog(PRINTDLG& pdInit)
- : m_pd(pdInit), CCommonDialog(NULL)
- {
- }
-
- // Function to keep m_pd in sync after user invokes Setup from
- // the print dialog (via the Setup button)
- // If you decide to handle any messages/notifications and wish to
- // handle them differently between Print/PrintSetup then override
- // this function and create an object of a derived class
- CPrintDialog* CPrintDialog::AttachOnSetup()
- {
- ASSERT_VALID(this);
-
- CPrintDialog* pDlgSetup;
-
- pDlgSetup = new CPrintDialog(m_pd);
- pDlgSetup->m_hWnd = NULL;
- pDlgSetup->m_pParentWnd = m_pParentWnd;
- pDlgSetup->m_nIDHelp = AFX_IDD_PRINTSETUP;
- return pDlgSetup;
- }
-
- void CPrintDialog::OnPrintSetup()
- {
- ASSERT_VALID(this);
-
- CPrintDialog* pDlgSetup = AttachOnSetup();
- ASSERT(pDlgSetup != NULL);
-
- AfxHookWindowCreate(pDlgSetup);
- Default();
- AfxUnhookWindowCreate();
-
- delete pDlgSetup;
- }
-
- int CPrintDialog::DoModal()
- {
- ASSERT_VALID(this);
-
- m_pd.hwndOwner = PreModal();
- int nResult = ::PrintDlg(&m_pd);
- PostModal();
- return nResult ? nResult : IDCANCEL;
- }
-
- // Create an HDC without calling DoModal.
- HDC CPrintDialog::CreatePrinterDC()
- {
- ASSERT_VALID(this);
- m_pd.hDC = AfxCreateDC(m_pd.hDevNames, m_pd.hDevMode);
- return m_pd.hDC;
- }
-
- int CPrintDialog::GetCopies() const
- {
- ASSERT_VALID(this);
-
- if (m_pd.Flags & PD_USEDEVMODECOPIES)
- return GetDevMode()->dmCopies;
- else
- return m_pd.nCopies;
- }
-
- LPDEVMODE CPrintDialog::GetDevMode() const
- {
- if (m_pd.hDevMode == NULL)
- return NULL;
-
- return (LPDEVMODE)::GlobalLock(m_pd.hDevMode);
- }
-
- CString CPrintDialog::GetDriverName() const
- {
- if (m_pd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_pd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wDriverOffset;
- }
-
- CString CPrintDialog::GetDeviceName() const
- {
- if (m_pd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_pd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wDeviceOffset;
- }
-
- CString CPrintDialog::GetPortName() const
- {
- if (m_pd.hDevNames == NULL)
- return afxEmptyString;
-
- LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(m_pd.hDevNames);
- return (LPCTSTR)lpDev + lpDev->wOutputOffset;
- }
-
- // this function must not be in afxdlgs.inl because of DLL delay loading
- BOOL CPrintDialog::GetDefaults()
- {
- m_pd.Flags |= PD_RETURNDEFAULT;
- return ::PrintDlg(&m_pd);
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // CPrintDialog diagnostics
-
- #ifdef _DEBUG
- void CPrintDialog::Dump(CDumpContext& dc) const
- {
- CDialog::Dump(dc);
-
- dc << "m_pd.hwndOwner = " << (UINT)m_pd.hwndOwner;
-
- if (m_pd.hDC != NULL)
- dc << "\nm_pd.hDC = " << CDC::FromHandle(m_pd.hDC);
-
- dc << "\nm_pd.Flags = " << (LPVOID)m_pd.Flags;
- dc << "\nm_pd.nFromPage = " << m_pd.nFromPage;
- dc << "\nm_pd.nToPage = " << m_pd.nToPage;
- dc << "\nm_pd.nMinPage = " << m_pd.nMinPage;
- dc << "\nm_pd.nMaxPage = " << m_pd.nMaxPage;
- dc << "\nm_pd.nCopies = " << m_pd.nCopies;
-
- if (m_pd.lpfnSetupHook == (COMMDLGPROC)_AfxCommDlgProc)
- dc << "\nsetup hook function set to standard MFC hook function";
- else
- dc << "\nsetup hook function set to non-standard hook function";
-
- if (m_pd.lpfnPrintHook == (COMMDLGPROC)_AfxCommDlgProc)
- dc << "\nprint hook function set to standard MFC hook function";
- else
- dc << "\nprint hook function set to non-standard hook function";
-
- dc << "\n";
- }
- #endif //_DEBUG
-
- ////////////////////////////////////////////////////////////////////////////
- // AfxCreateDC
-
- HDC AFXAPI AfxCreateDC(HGLOBAL hDevNames, HGLOBAL hDevMode)
- {
- if (hDevNames == NULL)
- return NULL;
-
- LPDEVNAMES lpDevNames = (LPDEVNAMES)::GlobalLock(hDevNames);
- LPDEVMODE lpDevMode = (hDevMode != NULL) ?
- (LPDEVMODE)::GlobalLock(hDevMode) : NULL;
-
- if (lpDevNames == NULL)
- return NULL;
-
- HDC hDC = ::CreateDC((LPCTSTR)lpDevNames + lpDevNames->wDriverOffset,
- (LPCTSTR)lpDevNames + lpDevNames->wDeviceOffset,
- (LPCTSTR)lpDevNames + lpDevNames->wOutputOffset,
- lpDevMode);
-
- ::GlobalUnlock(hDevNames);
- if (hDevMode != NULL)
- ::GlobalUnlock(hDevMode);
- return hDC;
- }
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- IMPLEMENT_DYNAMIC(CPrintDialog, CDialog)
- IMPLEMENT_DYNAMIC(CPageSetupDialog, CDialog)
-
- ////////////////////////////////////////////////////////////////////////////
-