📄 uidocpropsheets.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 + -