#include "devmgr.h" /*++ Copyright (C) 1997-1999 Microsoft Corporation Module Name: prndlg.cpp Abstract: This module implements CPrintDialog, the class that processes printer dialog Author: William Hsieh (williamh) created Revision History: --*/ // // CPrintDialog implementation // // // help topic ids // const DWORD g_a207HelpIDs[]= { IDC_PRINT_SYSTEM_SUMMARY, idh_devmgr_print_system, IDC_PRINT_SELECT_CLASSDEVICE, idh_devmgr_print_device, IDC_PRINT_ALL, idh_devmgr_print_both, IDC_PRINT_REPORT_TYPE_TEXT, idh_devmgr_print_report, 0, 0 }; HRESULT CDevMgrPrintDialogCallback::QueryInterface( REFIID riid, void** ppv ) { if (!ppv) { return E_INVALIDARG; } HRESULT hr = S_OK; if (IsEqualIID(riid, IID_IUnknown)) { *ppv = (IUnknown*)this; } else if (IsEqualIID(riid, IID_IPrintDialogCallback)) { *ppv = (ISnapinAbout*)this; } else { *ppv = NULL; hr = E_NOINTERFACE; } if (SUCCEEDED(hr)) { AddRef(); } return hr; } ULONG CDevMgrPrintDialogCallback::AddRef() { ::InterlockedIncrement((LONG*)&m_Ref); return m_Ref; } ULONG CDevMgrPrintDialogCallback::Release() { ::InterlockedDecrement((LONG*)&m_Ref); if (!m_Ref) { delete this; return 0; } return m_Ref; } HRESULT CDevMgrPrintDialogCallback::InitDone() { return S_OK; } HRESULT CDevMgrPrintDialogCallback::SelectionChange() { return S_OK; } HRESULT CDevMgrPrintDialogCallback::HandleMessage( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult ) { *pResult = FALSE; switch (uMsg) { case WM_INITDIALOG: *pResult = OnInitDialog(hDlg); break; case WM_COMMAND: *pResult = OnCommand(hDlg, wParam, lParam); break; case WM_HELP: *pResult = OnHelp((LPHELPINFO)lParam); break; case WM_CONTEXTMENU: *pResult = OnContextMenu(hDlg, LOWORD(lParam), HIWORD(lParam), wParam); break; default: break; } return S_OK; } BOOL CDevMgrPrintDialogCallback::OnInitDialog( HWND hWnd ) { int DefaultId = IDC_PRINT_SELECT_CLASSDEVICE; m_pPrintDialog->SetReportType(REPORT_TYPE_CLASSDEVICE); if (!(m_pPrintDialog->GetTypeEnableMask() & REPORT_TYPE_MASK_CLASSDEVICE)) { EnableWindow(GetDlgItem(hWnd, IDC_PRINT_SELECT_CLASSDEVICE), FALSE); DefaultId = IDC_PRINT_SYSTEM_SUMMARY; m_pPrintDialog->SetReportType(REPORT_TYPE_SUMMARY); } if (!(m_pPrintDialog->GetTypeEnableMask() & REPORT_TYPE_MASK_SUMMARY)) { EnableWindow(GetDlgItem(hWnd, IDC_PRINT_SYSTEM_SUMMARY), FALSE); if (IDC_PRINT_SYSTEM_SUMMARY == DefaultId) { DefaultId = IDC_PRINT_ALL; m_pPrintDialog->SetReportType(REPORT_TYPE_SUMMARY_CLASSDEVICE); } } if (!(m_pPrintDialog->GetTypeEnableMask() & REPORT_TYPE_MASK_SUMMARY_CLASSDEVICE)) { EnableWindow(GetDlgItem(hWnd, IDC_PRINT_ALL), FALSE); } CheckDlgButton(hWnd, DefaultId, BST_CHECKED); return TRUE; } UINT_PTR CDevMgrPrintDialogCallback::OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam ) { if (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_PRINT_SELECT_CLASSDEVICE)) { m_pPrintDialog->SetReportType(REPORT_TYPE_CLASSDEVICE); } else if (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_PRINT_SYSTEM_SUMMARY)) { m_pPrintDialog->SetReportType(REPORT_TYPE_SUMMARY); } else if (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_PRINT_ALL)) { m_pPrintDialog->SetReportType(REPORT_TYPE_SUMMARY_CLASSDEVICE); } return FALSE; } BOOL CDevMgrPrintDialogCallback::OnHelp( LPHELPINFO pHelpInfo ) { int id = GetDlgCtrlID((HWND)pHelpInfo->hItemHandle); // // We only want to intercept help messages for controls that we are // responsible for. // if ((IDC_PRINT_SYSTEM_SUMMARY == id) || (IDC_PRINT_SELECT_CLASSDEVICE == id) || (IDC_PRINT_ALL == id) || (IDC_PRINT_REPORT_TYPE_TEXT == id)) { WinHelp((HWND)pHelpInfo->hItemHandle, DEVMGR_HELP_FILE_NAME, HELP_WM_HELP, (ULONG_PTR)g_a207HelpIDs); return TRUE; } // // If it is not one of the above controls then just let the normal help handle // the message. We do this by returning FALSE // return FALSE; } BOOL CDevMgrPrintDialogCallback::OnContextMenu( HWND hWnd, WORD xPos, WORD yPos, WPARAM wParam ) { POINT pt; if (hWnd == (HWND)wParam) { GetCursorPos(&pt); ScreenToClient(hWnd, &pt); wParam = (WPARAM)ChildWindowFromPoint(hWnd, pt); } int id = GetDlgCtrlID((HWND)wParam); // // We only want to intercept help messages for controls that we are // responsible for. // if ((IDC_PRINT_SYSTEM_SUMMARY == id) || (IDC_PRINT_SELECT_CLASSDEVICE == id) || (IDC_PRINT_ALL == id) || (IDC_PRINT_REPORT_TYPE_TEXT == id)) { WinHelp((HWND)wParam, DEVMGR_HELP_FILE_NAME, HELP_CONTEXTMENU, (ULONG_PTR)g_a207HelpIDs); return TRUE; } return FALSE; } BOOL CPrintDialog::PrintDlg( HWND hwndOwner, DWORD TypeEnableMask ) { HRESULT hr; ASSERT(REPORT_TYPE_MASK_NONE != TypeEnableMask); memset(&m_PrintDlg, 0, sizeof(m_PrintDlg)); CDevMgrPrintDialogCallback* pPrintDialogCallback = new CDevMgrPrintDialogCallback; if (!pPrintDialogCallback) { return FALSE; } pPrintDialogCallback->m_pPrintDialog = this; m_TypeEnableMask = TypeEnableMask; m_PrintDlg.lStructSize = sizeof(m_PrintDlg); m_PrintDlg.hwndOwner = hwndOwner; m_PrintDlg.hDC = NULL; m_PrintDlg.Flags = PD_ENABLEPRINTTEMPLATE | PD_RETURNDC | PD_NOPAGENUMS; m_PrintDlg.Flags2 = 0; m_PrintDlg.ExclusionFlags = 0; m_PrintDlg.hInstance = g_hInstance; m_PrintDlg.nCopies = 1; m_PrintDlg.nStartPage = START_PAGE_GENERAL; m_PrintDlg.lpCallback = (IUnknown*)pPrintDialogCallback; m_PrintDlg.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINT); if (FAILED(hr = PrintDlgEx(&m_PrintDlg))) { return FALSE; } // // If the user did not want to print then return FALSE. // This can happen if the user hits Cancel on the print dialog. // if (m_PrintDlg.dwResultAction != PD_RESULT_PRINT) { return FALSE; } return TRUE; }