| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- // 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)
- ////////////////////////////////////////////////////////////////////////////
|