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

📄 previewdialog_filemenu.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return puiRetValue;}// ****************************************************************************************// **  class SavePosterFileDlgHookParams  *************************************************// ****************************************************************************************UINT_PTR CALLBACK SavePosterFileDlgHookParams::TheirSavePosterFileCommDlgHook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {	UINT_PTR puiRetValue = FileNameCommDlgHookParams::TheirGetFileNameCommDlgHook(hDlg, msg, wParam, lParam);	switch(msg) {	case WM_INITDIALOG: {		::SavePosterFileDlgHookParams& params = 			(::SavePosterFileDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		BOOL b = params.m_bOriginalSelectionEnabled;		::EnableWindow( ::GetDlgItem(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL), b );		::EnableWindow( ::GetDlgItem(hDlg, IDC_RADIO_ORIGINALPAGE_SAVESELECTION), b );		::CheckDlgButton(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL, params.m_bSaveAllOriginal);		::CheckDlgButton(hDlg, IDC_RADIO_ORIGINALPAGE_SAVESELECTION, ! params.m_bSaveAllOriginal);		puiRetValue = TRUE;	} break;	case WM_COMMAND: {		break;	}	case WM_NOTIFY: 		if (puiRetValue == NULL) {			LPOFNOTIFY lpofn = (LPOFNOTIFY) lParam;			::SavePosterFileDlgHookParams& params = 				(::SavePosterFileDlgHookParams&)				::FileNameCommDlgHookParams::TheirGetParams(hDlg);			switch(lpofn->hdr.code) {			case CDN_FILEOK: 				params.m_bSaveAllOriginal = ::IsDlgButtonChecked(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL);				break;			default:				break;			}		}		break;	default:		break;	}	return puiRetValue;}// ****************************************************************************************// **  class SaveOriginalAsBitmapDlgHookParams  *******************************************// ****************************************************************************************UINT_PTR CALLBACK SaveOriginalAsBitmapDlgHookParams::TheirSaveOriginalAsBitmapFileCommDlgHook(	HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {	enum {		eEditID = 0,		WM_CALCULATE_OUTPUT = WM_USER + 1,		WM_EDITNOTIFY = WM_USER + 2	};	BOOL bDPIChanged = FALSE;	double dNewDPI = 0;	UINT_PTR puiRetValue = FileNameCommDlgHookParams::TheirGetFileNameCommDlgHook(hDlg, msg, wParam, lParam);	switch(msg) {	case WM_INITDIALOG: {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		BOOL b = params.m_bOriginalSelectionEnabled;		::EnableWindow( ::GetDlgItem(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL), b );		::EnableWindow( ::GetDlgItem(hDlg, IDC_RADIO_ORIGINALPAGE_SAVESELECTION), b );		::CheckDlgButton(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL, params.m_bSaveAllOriginal);		::CheckDlgButton(hDlg, IDC_RADIO_ORIGINALPAGE_SAVESELECTION, ! params.m_bSaveAllOriginal);		TCHAR atstrBuff[32];		::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_RESETCONTENT, 0, 0);		::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_LIMITTEXT, (WPARAM) 9, 0);		for(uint k = 0; k < params.m_vuiDPI.size(); ++k) {			::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4ld DPI"), params.m_vuiDPI[k]);			::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_ADDSTRING, 0, (LPARAM) atstrBuff);		}		::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_SETCURSEL, (WPARAM) params.m_uiDefaultDPIIndex, 0);		params.m_dDPI = params.m_vuiDPI[params.m_uiDefaultDPIIndex];		HWND hwndCombo = ::GetDlgItem(hDlg, IDC_COMBO_DPI);		class FindEditWnd : public EnumWindows {		public:			FindEditWnd(void) { hwndEdit = NULL; }			virtual BOOL EnumProc(HWND hwndEnum) {				BOOL bRetValue = TRUE;				TCHAR atstrBuff[32];				if ( ::GetClassName(hwndEnum, atstrBuff, ARRCOUNT(atstrBuff)) != 0 ) {					if ( ::lstrcmpi(atstrBuff, TEXT("EDIT")) == 0 ) {						hwndEdit = hwndEnum;						bRetValue = FALSE;					}				}				return bRetValue;			}			HWND hwndEdit;		};		FindEditWnd few;		few.EnumChildWindows(hwndCombo);		if (few.hwndEdit != NULL) {			// THIS WILL AUTO-DELETE ITSELF WHEN THE EDIT CONTROL IS DELETED 			MyEditSubClassWindow *psub = new MyEditSubClassWindow(params.m_hinst, few.hwndEdit, hDlg, WM_EDITNOTIFY, eEditID);		}		::SendMessage(hDlg, WM_CALCULATE_OUTPUT, 0, lParam);		puiRetValue = TRUE;	} break;	case WM_CALCULATE_OUTPUT: {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		BOOL bAllOriginal = ::IsDlgButtonChecked(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL);		SIZED szdImage_Inches = (bAllOriginal ? params.m_szdOriginal_Inches : params.m_szdOriginalSelection_Inches);		POINTD ptdLogPix = { params.m_dDPI, params.m_dDPI };		SIZE szImage_Pixels;		DWORD dwFileSize ;		if (::My24BPPDIBSection::TheirCalculateFileSize(dwFileSize, szImage_Pixels, szdImage_Inches, ptdLogPix)) {			TCHAR atstrBuff[32];			StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4.lf DPI"), params.m_dDPI);			::SetDlgItemText(hDlg, IDC_COMBO_DPI, atstrBuff);			::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%3.2lf Inches"), szdImage_Inches.cx);			::SetDlgItemText(hDlg, IDC_STATIC_SOURCE_WIDTH, atstrBuff);			::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%3.2lf Inches"), szdImage_Inches.cy);			::SetDlgItemText(hDlg, IDC_STATIC_SOURCE_HEIGHT, atstrBuff);			::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4ld Pixels"), szImage_Pixels.cx);			::SetDlgItemText(hDlg, IDC_STATIC_OUTPUT_WIDTH, atstrBuff);			::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4ld Pixels"), szImage_Pixels.cy);			::SetDlgItemText(hDlg, IDC_STATIC_OUTPUT_HEIGHT, atstrBuff);			if (dwFileSize < 10000) {				::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%6ld Bytes"), dwFileSize);			} else if (dwFileSize < 1000000) {				::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4.2lf KB"), (double) dwFileSize / 1024);			} else {				::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%4.2lf MB"), (double) dwFileSize / 1024 / 1024);			}			::SetDlgItemText(hDlg, IDC_STATIC_OUTPUT_DISK, atstrBuff);		} else {			params.ErrorMessage(TEXT("There is an unexpected inconsistency in image size data"), hDlg);			::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_SETCURSEL, (WPARAM) 0, 0);			params.m_dDPI = params.m_vuiDPI[0];			// IF THIS RESULTS IN AN INFINITE RECURSIVE LOOP THAT IS GOOD, USER WILL KEEP GETTING AN ERROR MESSAGE BOX			// AND WE WILL PREVENT THE USER FROM ATTEMPTING AN UNSAFE SAVE			::SendMessage(hDlg, WM_CALCULATE_OUTPUT, 0, 0);		}	} break;	case WM_COMMAND: {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		WORD wID = LOWORD(wParam);		switch(wID) {		case IDC_COMBO_DPI: {			WORD wCode = HIWORD(wParam);			switch(wCode) {			//case CBN_EDITCHANGE: {			case CBN_SELCHANGE: {				LRESULT lres = ::SendDlgItemMessage(hDlg, IDC_COMBO_DPI, CB_GETCURSEL, 0, 0);				if (lres != CB_ERR) {					uint uiIndex = (uint) lres;					if (uiIndex < params.m_vuiDPI.size()) {						dNewDPI = params.m_vuiDPI[uiIndex];						bDPIChanged = TRUE;					}				}			} break;			default:				break;			}		} break;		case IDC_RADIO_ORIGINALPAGE_SAVEALL:			// FALL THRU		case IDC_RADIO_ORIGINALPAGE_SAVESELECTION:			::SendMessage(hDlg, WM_CALCULATE_OUTPUT, 0, 0);			break;		default:			break;		}	} break;	case WM_EDITNOTIFY: {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		NMHDR nmh = * (NMHDR *) lParam;		switch(nmh.idFrom) {		case eEditID: 			switch(nmh.code) {			case ::MyEditSubClassWindow::eKDEnter: {				TCHAR atstrBuff[32];				::ZeroMemory(atstrBuff, sizeof(atstrBuff));				::SendMessage(nmh.hwndFrom, WM_GETTEXT, ARRCOUNT(atstrBuff), (LPARAM) atstrBuff);				if (::swscanf(atstrBuff, TEXT("%lf"), &dNewDPI) == 1) {					bDPIChanged = TRUE;				} else {					params.ErrorMessage(TEXT("Invalid DPI entry."), hDlg);					// PERHAPS NEED TO BE POST, NOT SEND, SEE BELOW					::PostMessage(hDlg, WM_CALCULATE_OUTPUT, 0, 0);				}				//7/14				::PostMessage(nmh.hwndFrom, EM_SETSEL, 0, (LPARAM) -1);			} break;			default:				break;			}			break;		default:			break;		}	} break;	case WM_NOTIFY: {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		if (puiRetValue == NULL) {			LPOFNOTIFY lpofn = (LPOFNOTIFY) lParam;			switch(lpofn->hdr.code) {				case CDN_FILEOK:  {					BOOL bSaveAllOriginal = ::IsDlgButtonChecked(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL);					SIZED szdImage_Inches = (bSaveAllOriginal ? params.m_szdOriginal_Inches : params.m_szdOriginalSelection_Inches);					POINTD ptdLogPix = { params.m_dDPI, params.m_dDPI };					SIZE szImage_Pixels;					DWORD dwFileSize;					if (::My24BPPDIBSection::TheirCalculateFileSize(dwFileSize, szImage_Pixels, szdImage_Inches, ptdLogPix)) {						if (dwFileSize > (DWORD) 10 * 1024 * 1024) {							TCHAR atstrBuff[32];							::StringCchPrintf(atstrBuff, ARRCOUNT(atstrBuff), TEXT("%0.2lf MB"), (double) dwFileSize / 1024 / 1024);							tstring tstr = TEXT("The bitmap saved will be ");							tstr += atstrBuff;							tstr += TEXT(" on disk.\nAre you sure you want to save a bitmap this large?");							BOOL bConfirm = params.ConfirmationMessage(tstr.c_str(), hDlg);							if (bConfirm) {								params.m_bSaveAllOriginal = bSaveAllOriginal;							} else {								puiRetValue = TRUE;								::SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);							}						} else {							params.m_bSaveAllOriginal = bSaveAllOriginal;						}					} else {						params.ErrorMessage(TEXT("Unexpected error - output image size is too large"), hDlg);						puiRetValue = TRUE;						::SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);					}				} break;			default:				break;			}		}	} break;	default:		break;	}	if (bDPIChanged) {		::SaveOriginalAsBitmapDlgHookParams& params = 			(::SaveOriginalAsBitmapDlgHookParams&)			::FileNameCommDlgHookParams::TheirGetParams(hDlg);		BOOL bEntryValid = FALSE;		if (dNewDPI >= 1) {			BOOL bAllOriginal = ::IsDlgButtonChecked(hDlg, IDC_RADIO_ORIGINALPAGE_SAVEALL);			SIZED szdImage_Inches = (bAllOriginal ? params.m_szdOriginal_Inches : params.m_szdOriginalSelection_Inches);			POINTD ptdLogPix = { dNewDPI, dNewDPI };			SIZE szImage_Pixels;			DWORD dwFileSize ;			if (::My24BPPDIBSection::TheirCalculateFileSize(dwFileSize, szImage_Pixels, szdImage_Inches, ptdLogPix)) {				bEntryValid = TRUE;			} else {				params.ErrorMessage(TEXT("The DPI entry was too large"), hDlg);			}		} else {			params.ErrorMessage(TEXT("DPI entry must be at least 1"), hDlg);		}		if (bEntryValid) {			params.m_dDPI = dNewDPI;			::SendMessage(hDlg, WM_CALCULATE_OUTPUT, 0, 0);		} else {			// THIS HAS TO BE A POSTMESSAGE, OTHERWISE IF THE USER MADE A DROP-DOWN LISTBOX SELECTION			// THAT (INVALID) CHANGE TO THE EDIT BOX IS STILL PENDING ... BY USING A POST, OUR CALCULATION			// HAPPENS AFTER THE CHANGE TO THE EDIT, SO THE COMBO EDIT IS FINALLY CORRECTLY UPDATED			::PostMessage(hDlg, WM_CALCULATE_OUTPUT, 0, 0);		} 	}	return puiRetValue;}// ******************************************************************************************************// **  class MyEditSubClassWindow  **********************************************************************// ******************************************************************************************************MyEditSubClassWindow::MyEditSubClassWindow(	HINSTANCE hinst, 	HWND hwndEdit, 	HWND hwndNeedsNotification,	UINT msgNotification,	UINT idNotification) :	SubClassWindow(hinst, hwndEdit){	m_hwndEdit = hwndEdit;	m_hwndNeedsNotification = hwndNeedsNotification;	m_msgNotification = msgNotification;	m_idNotification = idNotification;}	MyEditSubClassWindow::~MyEditSubClassWindow() {	// NOTHING TO DELETE}void MyEditSubClassWindow::KeyboardMsg(OUT MSGRESULT& mr, UINT msg, WPARAM wParam, LPARAM lParam) {	switch(msg) {	case WM_KEYUP: {		MyEditSubClassWindow::NotificationCode code = MyEditSubClassWindow::eNone;        switch (wParam)  { 		case VK_TAB:	code = MyEditSubClassWindow::eKDTab;		break;		case VK_ESCAPE: code = MyEditSubClassWindow::eKDEsc;		break;		case VK_RETURN: code = MyEditSubClassWindow::eKDEnter;		break;		default:			break;        } 		if (code != MyEditSubClassWindow::eNone) {			NMHDR nmh;			nmh.code = code;			nmh.hwndFrom = m_hwndEdit;			nmh.idFrom = m_idNotification;			::SendMessage(m_hwndNeedsNotification, m_msgNotification, m_idNotification, (LPARAM) &nmh);		}		// ALLOW THE ORIGINAL WINDOW PROC TO PROCESS THE MESSAGE AS NORMAL	} break; 	default:		break;	}}

⌨️ 快捷键说明

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