334 lines
6.5 KiB
C++
334 lines
6.5 KiB
C++
|
#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;
|
||
|
}
|
||
|
|