⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uidocpropsheets.cpp

📁 虚拟打印机
💻 CPP
字号:
/* * UIDocPropSheets.cpp *   Copyright (C) 2006 Michael H. Overlin   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      Contact at poster_printer@yahoo.com */#include "UIDocPropSheets.h"#include "UIDriverEntryPoints.h"#include "resource.h"#include "..\lib\buffer.h"#include "..\lib\debug.h"#include "..\lib\devmode.h"#include "..\lib\extDevMode.h"#include "..\lib\printResizerCommon.h"#include "..\lib\prutils.h"#include "..\lib\spoolutils.h"#include "..\lib\utils.h"#include <windows.h>#include <winddi.h>#include <winddiui.h>#include <winspool.h>#include <malloc.h>// PRIVATE TYPEDEFS struct DialogData {	DialogData(void) { 		pextdmIn = ::EXTDM_New(); 		pextdmTemp = ::EXTDM_New();		lptstrPrinterName = NULL;	}	~DialogData() { 		::EXTDM_Delete(pextdmIn); 		::EXTDM_Delete(pextdmTemp);		if (lptstrPrinterName != NULL) {			free(lptstrPrinterName);		}	}	BOOL bAllowUserUpdate;	PEXTDEVMODE pextdmIn;	PEXTDEVMODE pextdmOut;	PEXTDEVMODE pextdmTemp;	PFNCOMPROPSHEET  pfnComPropSheet;	HANDLE hPropSheetAdded;	HANDLE hComPropSheet;	LPTSTR lptstrPrinterName;} ;// PRIVATE PROTOTYPESstatic BOOL CALLBACK DocPropDlgProc(	HWND hDlg,	UINT message,	WPARAM wParam,	LPARAM lParam	) ;// PUBLIC ROUTINESLONG DrvDocumentPropertySheets(	PPROPSHEETUI_INFO  pPSUIInfo,	LPARAM  lParam	) {	LONG lRetValue = -1;	static BOOL bBreak = STATICBOOLBREAK;	ASSERT(!bBreak);	if (pPSUIInfo == NULL) {		// CALLED DIRECTLY BY SPOOLER, RATHER THAN INDIRECTLY THRU CPSUI		// EITHER GETTING OR SETTING THE DEVMODE				PDOCUMENTPROPERTYHEADER pdph =			(PDOCUMENTPROPERTYHEADER) lParam;		if (pdph != NULL) {			if (pdph->fMode == 0 || pdph->pdmOut == NULL) {				lRetValue = (LONG) EXTDM_Sizeof();				pdph->cbOut = lRetValue;			} else if (				(pdph->fMode & (DM_COPY | DM_UPDATE))  &&                ( (pdph->fMode & DM_NOPERMISSION) == 0)     &&                pdph->pdmOut != NULL			) {				PDEVMODE pdmIn = pdph->pdmIn;				PDEVMODE pdmOut = pdph->pdmOut;				PEXTDEVMODE pextdm = ::EXTDM_New();				EXTDM_SetAppDevMode(pextdm, pdmIn, pdph->pszPrinterName);				PDEVMODE pdm  = (PDEVMODE) pextdm;				if (pdmIn != NULL) { 					if (pdmIn->dmDriverExtra < pdm->dmDriverExtra) {						pdmOut->dmDriverExtra = pdmIn->dmDriverExtra;						pdmOut->dmDriverVersion = pdmIn->dmDriverVersion;					} else {						pdmOut->dmDriverExtra = pdm->dmDriverExtra;						pdmOut->dmDriverVersion = pdm->dmDriverVersion;					}					if (pdmIn->dmSize < pdm->dmSize) {						pdmOut->dmSize = pdmIn->dmSize;						pdmOut->dmSpecVersion = pdmIn->dmSpecVersion;					} else {						pdmOut->dmSize = pdm->dmSize;						pdmOut->dmSpecVersion = pdm->dmSpecVersion;					}					ConvertDevMode(pdmOut, (PDEVMODE) pextdm, FALSE);				} else { // pdph->pdmIn != NULL					DM_Copy( (PDEVMODE) pextdm, (LPBYTE) pdmOut);				}				free(pextdm);				lRetValue = 1;			//(pdph->fMode & (DM_COPY | DM_UPDATE))  &&			//( (pdph->fMode & DM_NOPERMISSION) == 0)     &&			//pdph->pdmOut != NULL			} else {				lRetValue = 1;			}		} else { // pdph != NULL			ASSERTFAIL();		}	} else if (pPSUIInfo->lParamInit != 0) { // pPSUIInfo == NULL		// WE ARE BEING CALLED BY CPSUI, USER INTEFACE STUFF		// AS PER MSPLOT, GET DOCUMENTPROPERTYHEADER FROM lParamInit INSTEAD OF lParam		PDOCUMENTPROPERTYHEADER pdph = (PDOCUMENTPROPERTYHEADER) pPSUIInfo->lParamInit;        switch (pPSUIInfo->Reason) {		// pdmIn AND pdmOut IN pdph CAN BE SAME HERE		case PROPSHEETUI_REASON_INIT: { 			BOOL bError = TRUE;			::LPPROPSHEETPAGE lppsp = NULL;			DialogData *pdd = new DialogData();			if (pdd != NULL) {				lppsp = (LPPROPSHEETPAGE) malloc(sizeof(PROPSHEETPAGE));				if (lppsp != NULL) {					ZeroMemory(lppsp, sizeof(*lppsp));					lppsp->dwSize = sizeof(*lppsp);					lppsp->hInstance = ghinstDLL;					lppsp->pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_DOCUMENTPROPERTIES);					lppsp->lParam = (LPARAM) pdd;					lppsp->pfnDlgProc = (DLGPROC) DocPropDlgProc;					pPSUIInfo->UserData = (ULONG_PTR) lppsp;					pPSUIInfo->Result   = CPSUI_CANCEL;					// AS PER MSPLOT, THIS IS THE REQUIREMENT TO ACTUALLY ENACT USER CHANGES						// DEBUG / FIX TESTING MUST DETERMINE WHETHER WE SHOULD MAKE CONTROLS DISABLED								pdd->bAllowUserUpdate = 								pdd->bAllowUserUpdate  = (						(pdph->fMode & (DM_COPY | DM_UPDATE))  &&						(!(pdph->fMode & DM_NOPERMISSION))     &&						pdph->pdmOut != NULL					);					pdd->lptstrPrinterName = ::StringDuplicate(pdph->pszPrinterName);					EXTDM_SetAppDevMode( pdd->pextdmIn, pdph->pdmIn, pdd->lptstrPrinterName);					// AS PER MSPLOT (APPARENTLY), DON'T TOUCH THE OUTPUT BUFFER IF USER MODIFICATION NOT ALLOWED					pdd->pextdmOut = pdd->bAllowUserUpdate ? (PEXTDEVMODE) pdph->pdmOut : (PEXTDEVMODE) NULL;					pdd->pfnComPropSheet = pPSUIInfo->pfnComPropSheet;					pdd->hComPropSheet = pPSUIInfo->hComPropSheet;					pdd->hPropSheetAdded = (HANDLE) pPSUIInfo->pfnComPropSheet(						pPSUIInfo->hComPropSheet,						CPSFUNC_ADD_PROPSHEETPAGE,						(LPARAM)lppsp, 						0						);					if (pdd->hPropSheetAdded != NULL) {						bError = FALSE;					}				} // if (lppsp != NULL)			} // if (pdd != NULL)			if (bError) {				DEBUGMESSAGE( ("Unexpected error.") );				delete pdd;				if (lppsp != NULL) {					free(lppsp);				}			} else {				lRetValue = 1;			}		} break;		case PROPSHEETUI_REASON_SET_RESULT: {			LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE) pPSUIInfo->UserData;			PSETRESULT_INFO psri = (PSETRESULT_INFO) lParam;			if (psri->Result == CPSUI_OK) {				if (lppsp != NULL) {					DialogData* pdd = (DialogData *) lppsp->lParam;					if (pdd->bAllowUserUpdate) {						ASSERT(pdd->pextdmOut != NULL);						// 6/10 pdph->pszPrinterName IS INVALID HERE FOR SOME REASON 						//::EXTDM_SetAppDevMode(pdd->pextdmOut, (PDEVMODE) pdd->pextdmIn, pdph->pszPrinterName);						// FIX - DEBUG :  NOT REALLY A "TARGET" PRINTER NAME HERE						//TCHAR atstrPrinterName[TARGETPRINTERNAME_MAX];						LPTSTR lptstrPrinterName = GetPrinterName(pdph->hPrinter);						if (lptstrPrinterName != NULL) {							::EXTDM_SetAppDevMode(pdd->pextdmOut, (PDEVMODE) pdd->pextdmIn, lptstrPrinterName);							free(lptstrPrinterName);							lRetValue = 1;						}					}				} else {					DEBUGMESSAGE( ("Unexpected NULL ptr") );				}			}		} break;		case PROPSHEETUI_REASON_DESTROY: {			LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE) pPSUIInfo->UserData;			if (lppsp != NULL) {				DialogData *pdd = (DialogData *) lppsp->lParam;				if (pdd != NULL) {					delete pdd;				} else {					DEBUGMESSAGE( ("Unexpected NULL ptr") );				}				free(lppsp);				pPSUIInfo->UserData = 0;			} else {				DEBUGMESSAGE( ("Unexpected NULL ptr") );			}			lRetValue = 1;		} break;		default:			break;		} // switch(pPSUIInfo->Reason)		} else { // else if (pPSUIInfo->lParamInit != 0)		DEBUGMESSAGE( ("Received a NULL PDOCUMENTPROPERTYHEADER") );	}	return lRetValue;} // DrvDocumentPropertySheets// *******************************************************************************// **  PRIVATE ROUTINES  *********************************************************// *******************************************************************************static BOOL CALLBACK DocPropDlgProc(	HWND hDlg,	UINT message,	WPARAM wParam,	LPARAM lParam	) {	BOOL bRetValue = TRUE;	switch(message) {	case WM_INITDIALOG: {		LPPROPSHEETPAGE lppsp = (LPPROPSHEETPAGE ) lParam;		DialogData *pdd = (DialogData *) lppsp->lParam;		::SetWindowLongPtr(hDlg, DWL_USER, (LONG) pdd);		::SetDlgItemText(hDlg, IDC_STATIC_VERSION, PRINTRESIZER_VERSION_USER_SEES);		HWND hwndPrinterCombo = ::GetDlgItem(hDlg, IDC_COMBO_PRINTERS);		::FillComboWithInstalledPrinters(hwndPrinterCombo, TRUE);		LPCTSTR lptstrTargetPrinterName = ::EXTDM_GetTargetPrinterName(pdd->pextdmIn);		DWORD dwIndex;		if (::FindStringInCombo(&dwIndex, lptstrTargetPrinterName, hwndPrinterCombo)) {			::SendMessage(hwndPrinterCombo, CB_SETCURSEL, dwIndex, 0);		} else {			::SendMessage(hwndPrinterCombo, CB_SETCURSEL, (WPARAM) -1, 0);		}		::SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_COMBO_PRINTERS, CBN_SELCHANGE), 0);	} break; // case WM_INITDIALOG	case WM_COMMAND: {		WORD wID = LOWORD(wParam);		switch(wID) {		case IDC_BUTTON_CONFIGURE: {			DialogData *pdd = (DialogData *) GetWindowLongPtr(hDlg, DWL_USER);			ASSERT(pdd != NULL);			::EXTDM_DoTargetPrinterDocumentProperties(pdd->pextdmTemp, hDlg);	   } break;		case IDC_COMBO_PRINTERS: {			WORD code = HIWORD(wParam);			switch(code) {			case CBN_SELCHANGE: {				DialogData *pdd = (DialogData *) GetWindowLongPtr(hDlg, DWL_USER);				ASSERT(pdd != NULL);				BOOL bCanConfigure = FALSE;				HWND hwndPrinterCombo = ::GetDlgItem(hDlg, IDC_COMBO_PRINTERS);				::ItemBuffer buff(TARGETPRINTERNAME_MAX, sizeof(TCHAR));				if (::GetComboCurSelLBText(buff, hwndPrinterCombo)) {					::EXTDM_SetAppDevMode(pdd->pextdmTemp, (PCDEVMODE) pdd->pextdmIn, pdd->lptstrPrinterName);					::EXTDM_SetTargetPrinterName(pdd->pextdmTemp, (LPTSTR) buff.GetPtr());					bCanConfigure = ::EXTDM_CanConfigureTargetPrinterDevMode(pdd->pextdmTemp);				} else {					::EXTDM_SetTargetPrinterName(pdd->pextdmTemp, TEXT("") );				}				HWND hwndConfigButton = ::GetDlgItem(hDlg, IDC_BUTTON_CONFIGURE);				::EnableWindow(hwndConfigButton, bCanConfigure);				HWND hwndExplain = ::GetDlgItem(hDlg, IDC_STATIC_EXPLANATION);				::ShowWindow(hwndExplain, bCanConfigure ? SW_HIDE : SW_SHOW);			} break;			default:				break;			}		} break;		default:			break;		}	} break;	case WM_NOTIFY: {		LPNMHDR lpNMHdr = (LPNMHDR) lParam;		UINT uiCode = lpNMHdr->code;		switch(uiCode) {		case PSN_APPLY: {			DialogData *pdd = (DialogData *) GetWindowLongPtr(hDlg, DWL_USER);			ASSERT(pdd != NULL);			//HWND hwndPrinterCombo = ::GetDlgItem(hDlg, IDC_COMBO_PRINTERS);			//::ItemBuffer buff(TARGETPRINTERNAME_MAX, sizeof(TCHAR));			//if (::GetComboCurSelLBText(buff, hwndPrinterCombo)) {			//	::EXTDM_SetTargetPrinterName(pdd->pextdmIn, (LPTSTR) buff.GetPtr());			//} else {			//	::EXTDM_SetTargetPrinterName(pdd->pextdmIn, TEXT("") );			//}			::EXTDM_SetAppDevMode(pdd->pextdmIn, (PCDEVMODE) pdd->pextdmTemp, pdd->lptstrPrinterName);						PFNCOMPROPSHEET pfnComPropSheet = pdd->pfnComPropSheet;			LONG lTemp = pfnComPropSheet(				pdd->hComPropSheet, 				CPSFUNC_SET_RESULT,				(LPARAM) pdd->hPropSheetAdded,				CPSUI_OK				);		} break;		case PSN_RESET:             break;         case PSN_SETACTIVE:             break;         default:             bRetValue = FALSE;			 break;		} // switch(uiCde)	} break; // case WM_NOTIFY	default:		bRetValue = FALSE;		break;	}	return bRetValue;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -