📄 previewdialog_filemenu.cpp
字号:
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 + -