home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
dlgprnt.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
11KB
|
396 lines
// 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)
////////////////////////////////////////////////////////////////////////////