/************************************************************************\ * * FUNCTION: SepDlgProc(); * * PURPOSE: Handle the Separator Page dialog box messages, and record * settings into Registry * * Created: 7-27-1995 * \************************************************************************/ #include #include #include #include "sepdlg.h" #include "textbox.h" #include "tables.h" LRESULT APIENTRY SepDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT APIENTRY SepPreviewDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT SepDlgInitialize(HWND hDlg); void SepEnableExtraControls(HWND hDlg); void SepEnableAttachControls(HWND hDlg); BOOL SepIsValidSepFile(PTCHAR szFileName); void SepSelectAttachSepFile(HWND hDlg); void SepSelectExtraSepFile(HWND hDlg); BOOL SepSelectFileDlg(HWND hDlg, PTCHAR szFileName); void SepSetExtraPageProperties(HWND hDlg); HANDLE SepGetDefaultPrinterHandle(); void SepInitializePrinterInfo(); void SepCustomLayout(HWND hDlg); void SepSetDlgBoldFont(HWND hDlg); void SepSetDefaultSettings(HWND hDlg); void SepSetDefaultDevMode(); BOOL SepSaveSettings(HWND hDlg); BOOL SepValidateSettings(HWND hDlg); BOOL SepLoadSettings(HWND hDlg); void SepTestExtraPage(HWND hDlg); void SepTestAttachPage(HWND hDlg); void SepPreviewExtraPage(HWND hDlg); void SepPreviewAttachPage(HWND hDlg); void SepPrintSepFile(PTCHAR szFileName, DEVMODE* pDevMode); void SepPreviewSepFile(HWND hDlg, PTCHAR szFileName, DEVMODE* pDevMode); void SepPreviewInit(HWND hDlg); void SepPreviewPaint(HWND hDlg); void SepDrawSepPage(HDC hDC, RECT* pBound, PTCHAR szFileName); static HANDLE hSepPrinter; static PRINTER_INFO_2 * pSepPrinter; static DEVMODE* pSepDevMode; static HDC hSepPrtDC; static RECT rcSepView; static TCHAR szSepViewFile[MAX_PATH+1]; static const PTCHAR szSepRegistryRoot = L"System\\CurrentControlSet\\Control\\Print\\Printers\\"; static const PTCHAR szSepKey = L"Separator Page"; LRESULT APIENTRY SepDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: return SepDlgInitialize(hDlg); case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { EndDialog (hDlg, TRUE); return TRUE; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (!SepValidateSettings(hDlg)) { MessageBox(hDlg, L"Invalid Separator Page Settings", L"Separator Page Settings", MB_OK | MB_ICONEXCLAMATION); break; } if (!SepSaveSettings(hDlg)) { MessageBox(hDlg, L"Can't Save Current Settings\nCheck Registry Permissions", L"Separator Page Settings", MB_OK | MB_ICONEXCLAMATION); break; } EndDialog(hDlg, IDOK); case IDCANCEL: EndDialog(hDlg, IDCANCEL); case IDC_EXTRACHECK: if (HIWORD(wParam) == BN_CLICKED) SepEnableExtraControls(hDlg); break; case IDC_ATTACHCHECK: if (HIWORD(wParam) == BN_CLICKED) SepEnableAttachControls(hDlg); break; case IDC_EXTRAFILEEDIT: if (HIWORD(wParam) == EN_CHANGE) SepEnableExtraControls(hDlg); break; case IDC_ATTACHFILEEDIT: if (HIWORD(wParam) == EN_CHANGE) SepEnableAttachControls(hDlg); break; case IDC_EXTRAFILEBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepSelectExtraSepFile(hDlg); break; case IDC_ATTACHFILEBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepSelectAttachSepFile(hDlg); break; case IDC_BEGINRADIO: case IDC_ENDRADIO: if (HIWORD(wParam) == BN_CLICKED) SepEnableExtraControls(hDlg); break; case IDC_EXTRATESTBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepTestExtraPage(hDlg); break; case IDC_ATTACHTESTBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepTestAttachPage(hDlg); break; case IDC_EXTRAPREVIEWBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepPreviewExtraPage(hDlg); break; case IDC_ATTACHPREVIEWBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepPreviewAttachPage(hDlg); break; case IDC_EXTRAPAGEBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepSetExtraPageProperties(hDlg); break; case IDC_EXTRACUSTOMBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepCustomLayout(hDlg); break; case IDC_ATTACHCUSTOMBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepCustomLayout(hDlg); break; case IDC_DEFAULTBUTTON: if (HIWORD(wParam) == BN_CLICKED) SepSetDefaultSettings(hDlg); break; default: return FALSE; } return TRUE; } return FALSE; } LRESULT SepDlgInitialize(HWND hDlg) { // to be replaced by appropriate resource definition SepSetDlgBoldFont(hDlg); // to be replaced by handle of the printer undergoing configuration // in printer manager hSepPrinter = SepGetDefaultPrinterHandle(); // may also need minor change to incorporate into printman SepInitializePrinterInfo(); // load current settings if (!SepLoadSettings(hDlg)) SepSetDefaultSettings(hDlg); // disable sub-controls when main control not checked SepEnableExtraControls(hDlg); SepEnableAttachControls(hDlg); // set initial focus to OK button SetFocus(GetDlgItem(hDlg, IDOK)); return FALSE; } void SepSetDlgBoldFont(HWND hDlg) { HFONT hFont; LOGFONT lfFont; HWND hWnd; hFont = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0); if (hFont) { if (GetObject(hFont, sizeof(LOGFONT), &lfFont)) { lfFont.lfWeight = FW_BOLD; if (hFont = CreateFontIndirect(&lfFont)) for (hWnd=GetDlgItem(hDlg, IDC_EXTRACHECK); hWnd; hWnd = GetNextWindow(hWnd, GW_HWNDNEXT)) SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE,0)); } } } void SepEnableExtraControls(HWND hDlg) { int iId; BOOL bChecked; BOOL bFileExist = FALSE; TCHAR szFileName[MAX_PATH+1]; // get the extra check button state bChecked = IsDlgButtonChecked(hDlg, IDC_EXTRACHECK); // check if sep file is valid if (bChecked && GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName, MAX_PATH)) bFileExist = SepIsValidSepFile(szFileName); // enable/disable controls for (iId=IDC_EXTRAFILELABEL; iId <= IDC_EXTRAPAGEBUTTON; iId++) { switch (iId) { case IDC_EXTRATESTBUTTON: case IDC_EXTRAPREVIEWBUTTON: EnableWindow(GetDlgItem(hDlg, iId), bChecked && bFileExist); break; case IDC_EXTRABETWEEN: case IDC_ADJRADIO: case IDC_DIFFRADIO: EnableWindow(GetDlgItem(hDlg, iId), bChecked && IsDlgButtonChecked(hDlg, IDC_BEGINRADIO)); break; default: EnableWindow(GetDlgItem(hDlg, iId), bChecked); break; } } } void SepEnableAttachControls(HWND hDlg) { int iId; BOOL bChecked; BOOL bFileExist = FALSE; TCHAR szFileName[MAX_PATH+1]; // get the attach check button state bChecked = IsDlgButtonChecked(hDlg, IDC_ATTACHCHECK); // check if sep file is valid if (bChecked && GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName, MAX_PATH)) bFileExist = SepIsValidSepFile(szFileName); // enable/disable controls for (iId=IDC_ATTACHFILELABEL; iId <= IDC_ATTACHCUSTOMBUTTON; iId++) { switch (iId) { case IDC_ATTACHTESTBUTTON: case IDC_ATTACHPREVIEWBUTTON: EnableWindow(GetDlgItem(hDlg, iId), bChecked && bFileExist); break; default: EnableWindow(GetDlgItem(hDlg, iId), bChecked); break; } } } BOOL SepIsValidSepFile(PTCHAR szFileName) { DWORD dwAttr; dwAttr = GetFileAttributes(szFileName); if (dwAttr == 0xFFFFFFFF) return FALSE; return !(dwAttr & FILE_ATTRIBUTE_DIRECTORY) && !(dwAttr & FILE_ATTRIBUTE_SYSTEM); } void SepSelectExtraSepFile(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; if (!GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName, MAX_PATH)) szFileName[0] = 0; if (SepSelectFileDlg(hDlg, szFileName)) { SetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName); SepEnableExtraControls(hDlg); } } void SepSelectAttachSepFile(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; if (!GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName, MAX_PATH)) szFileName[0] = 0; if (SepSelectFileDlg(hDlg, szFileName)) { SetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName); SepEnableAttachControls(hDlg); } } BOOL SepSelectFileDlg(HWND hDlg, PTCHAR szFileName) { OPENFILENAME ofn; memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFilter = L"Separator Files (*.SEP)\0*.SEP\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrTitle = L"Select Separator File"; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; return GetOpenFileName(&ofn); } void SepSetExtraPageProperties(HWND hDlg) { LONG lSize; DEVMODE* pOutDevMode; if (!pSepDevMode) return; lSize = DocumentProperties(NULL, hSepPrinter, pSepPrinter->pPrinterName, NULL, NULL, 0); if (!(pOutDevMode = (DEVMODE*)HeapAlloc(GetProcessHeap(), 0, lSize))) return; if (DocumentProperties(hDlg, hSepPrinter, pSepPrinter->pPrinterName, pOutDevMode, pSepDevMode, DM_IN_BUFFER |DM_IN_PROMPT | DM_OUT_BUFFER) == IDOK) { HeapFree(GetProcessHeap(), 0, pSepDevMode); pSepDevMode = pOutDevMode; } else HeapFree(GetProcessHeap(), 0, pOutDevMode); } HANDLE SepGetDefaultPrinterHandle() { PRINTDLG pd; HANDLE hPrinter; DEVMODE* pDevMode; memset(&pd,0,sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.Flags = PD_RETURNDEFAULT; if (!PrintDlg(&pd)) return NULL; if (!(pDevMode = (DEVMODE*)GlobalLock(pd.hDevMode))) return NULL; if (!OpenPrinter(pDevMode->dmDeviceName, &hPrinter, NULL)) hPrinter = NULL; GlobalUnlock(pd.hDevMode); return hPrinter; } void SepInitializePrinterInfo() { DWORD cbSize; pSepPrinter = NULL; if (!hSepPrinter) return; if (!GetPrinter(hSepPrinter, 2, NULL, 0, &cbSize)) // get required size if (pSepPrinter = (PRINTER_INFO_2*)HeapAlloc(GetProcessHeap(), 0, cbSize)) GetPrinter(hSepPrinter, 2, (LPBYTE)pSepPrinter, cbSize, &cbSize); } void SepCustomLayout(HWND hDlg) { HKEY hKey; DWORD dwType, cbSize = MAX_PATH; TCHAR szPath[MAX_PATH+1]; LONG lQuery; STARTUPINFO start; PROCESS_INFORMATION process; PTCHAR pImage; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Classes\\SepEdt\\Shell\\Open\\Command", 0, KEY_READ, &hKey) != ERROR_SUCCESS) return; lQuery = RegQueryValueEx(hKey, NULL, NULL, &dwType, (LPBYTE)szPath, &cbSize); RegCloseKey(hKey); if (lQuery != ERROR_SUCCESS) return; while (wcsrchr(szPath, L' ')) *wcsrchr(szPath, L' ') = 0; while (wcsrchr(szPath, L'\"')) *wcsrchr(szPath, L'\"') = 0; for (pImage = szPath; !*pImage;) pImage++; memset(&start, 0, sizeof(STARTUPINFO)); start.cb = sizeof(STARTUPINFO); CreateProcess(pImage/*L"d:\\author\\windebug\\sepedt.exe"*/, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &start, &process); } void SepSetDefaultSettings(HWND hDlg) { TCHAR szDir[MAX_PATH+1]; if (!GetSystemDirectory(szDir, MAX_PATH)) szDir[0] = 0; if (szDir[wcslen(szDir)-1] != L'\\') wcscat(szDir, L"\\"); CheckDlgButton(hDlg, IDC_EXTRACHECK, TRUE); SetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, wcscat(szDir, L"DEFAULT.SEP")); CheckDlgButton(hDlg, IDC_BEGINRADIO, TRUE); CheckDlgButton(hDlg, IDC_ENDRADIO, FALSE); CheckDlgButton(hDlg, IDC_ADJRADIO, TRUE); CheckDlgButton(hDlg, IDC_DIFFRADIO, FALSE); SepEnableExtraControls(hDlg); CheckDlgButton(hDlg, IDC_ATTACHCHECK, FALSE); SetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, L""); CheckDlgButton(hDlg, IDC_FIRSTRADIO, FALSE); CheckDlgButton(hDlg, IDC_EVERYRADIO, TRUE); CheckDlgButton(hDlg, IDC_LASTRADIO, FALSE); SepEnableAttachControls(hDlg); SepSetDefaultDevMode(); } BOOL SepValidateSettings(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; if (IsDlgButtonChecked(hDlg, IDC_EXTRACHECK)) { if (!GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName, MAX_PATH)) return FALSE; if (!SepIsValidSepFile(szFileName)) return FALSE; } if (IsDlgButtonChecked(hDlg, IDC_ATTACHCHECK)) { if (!GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName, MAX_PATH)) return FALSE; if (!SepIsValidSepFile(szFileName)) return FALSE; } return TRUE; } BOOL SepSaveSettings(HWND hDlg) { TCHAR szRegParent[MAX_PATH+1]; TCHAR szAttachFile[MAX_PATH+1], szExtraFile[MAX_PATH+1]; HKEY hKey, hParentKey; DWORD dwOptions = 0; BOOL bResult; GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szExtraFile, MAX_PATH); GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szAttachFile, MAX_PATH); if (IsDlgButtonChecked(hDlg, IDC_EXTRACHECK)) dwOptions |= 0x20; if (IsDlgButtonChecked(hDlg, IDC_BEGINRADIO)) dwOptions |= 0x10; if (IsDlgButtonChecked(hDlg, IDC_ADJRADIO)) dwOptions |= 0x08; if (IsDlgButtonChecked(hDlg, IDC_ATTACHCHECK)) dwOptions |= 0x04; if (IsDlgButtonChecked(hDlg, IDC_FIRSTRADIO)) dwOptions |= 0x02; if (IsDlgButtonChecked(hDlg, IDC_EVERYRADIO)) dwOptions |= 0x01; if (!pSepPrinter) return FALSE; wcscat(wcscpy(szRegParent, szSepRegistryRoot), pSepPrinter->pPrinterName); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegParent, 0, KEY_WRITE, &hParentKey) != ERROR_SUCCESS) return FALSE; bResult = RegCreateKeyEx(hParentKey, szSepKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL); RegCloseKey(hParentKey); if (bResult != ERROR_SUCCESS) return FALSE; bResult = (RegSetValueEx(hKey, L"Options", 0, REG_DWORD, (LPBYTE)&dwOptions, sizeof(DWORD)) == ERROR_SUCCESS) && (RegSetValueEx(hKey, L"Extra File", 0, REG_SZ, (LPBYTE)szExtraFile, (wcslen(szExtraFile)+1)*sizeof(TCHAR)) == ERROR_SUCCESS) && (RegSetValueEx(hKey, L"Attach File", 0, REG_SZ, (LPBYTE)szAttachFile, (wcslen(szAttachFile)+1)*sizeof(TCHAR)) == ERROR_SUCCESS) && (RegSetValueEx(hKey, L"Extra Dev Mode", 0, REG_BINARY, (LPBYTE)pSepDevMode, pSepDevMode ? HeapSize(GetProcessHeap(), 0, pSepDevMode) : 0) == ERROR_SUCCESS); RegCloseKey(hKey); return bResult; } BOOL SepLoadSettings(HWND hDlg) { TCHAR szRegPath[MAX_PATH+1]; TCHAR szAttachFile[MAX_PATH+1], szExtraFile[MAX_PATH+1]; HKEY hKey; DWORD dwOptions = 0; BOOL bResult; DWORD cbSize, dwType; if (!pSepPrinter) return FALSE; wcscat(wcscpy(szRegPath, szSepRegistryRoot), pSepPrinter->pPrinterName); wcscat(wcscat(szRegPath, L"\\"), szSepKey); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) return FALSE; cbSize = sizeof(DWORD); bResult = RegQueryValueEx(hKey, L"Options", 0, &dwType, (LPBYTE)&dwOptions, &cbSize) == ERROR_SUCCESS && dwType == REG_DWORD; cbSize = MAX_PATH*sizeof(TCHAR); bResult = bResult && RegQueryValueEx(hKey, L"Extra File", 0, &dwType, (LPBYTE)szExtraFile, &cbSize) == ERROR_SUCCESS && (dwType & REG_SZ); cbSize = MAX_PATH*sizeof(TCHAR); bResult = bResult && RegQueryValueEx(hKey, L"Attach File", 0, &dwType, (LPBYTE)szAttachFile, &cbSize) == ERROR_SUCCESS && (dwType & REG_SZ); cbSize=0; bResult = bResult && RegQueryValueEx(hKey, L"Extra Dev Mode", 0, NULL, NULL, &cbSize) == ERROR_SUCCESS; if (bResult && cbSize) { bResult = bResult && (pSepDevMode = (DEVMODE*)HeapAlloc(GetProcessHeap(), 0, cbSize)); if (bResult) bResult = bResult && RegQueryValueEx(hKey, L"Extra Dev Mode", 0, &dwType, (LPBYTE)pSepDevMode, &cbSize) == ERROR_SUCCESS && (dwType & REG_BINARY); } RegCloseKey(hKey); if (!bResult) {if (pSepDevMode) HeapFree(GetProcessHeap(), 0, pSepDevMode); return FALSE;} // successfully got settings from registry if (!cbSize) SepSetDefaultDevMode(); // empty devmode SetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szExtraFile); SetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szAttachFile); CheckDlgButton(hDlg, IDC_EXTRACHECK, dwOptions & 0x20); CheckDlgButton(hDlg, IDC_BEGINRADIO, dwOptions & 0x10); CheckDlgButton(hDlg, IDC_ENDRADIO, !(dwOptions & 0x10)); CheckDlgButton(hDlg, IDC_ADJRADIO, dwOptions & 0x08); CheckDlgButton(hDlg, IDC_DIFFRADIO, !(dwOptions & 0x08)); CheckDlgButton(hDlg, IDC_ATTACHCHECK, dwOptions & 0x04); CheckDlgButton(hDlg, IDC_FIRSTRADIO, dwOptions & 0x02); CheckDlgButton(hDlg, IDC_EVERYRADIO, dwOptions & 0x01); CheckDlgButton(hDlg, IDC_LASTRADIO, !(dwOptions & 0x03)); return TRUE; } void SepSetDefaultDevMode() { LONG lSize; pSepDevMode = NULL; if (!pSepPrinter) return; lSize = DocumentProperties(NULL, hSepPrinter, pSepPrinter->pPrinterName, NULL, NULL, 0); if (!(pSepDevMode = (PDEVMODE)HeapAlloc(GetProcessHeap(), 0, lSize))) return; // get default devmode if (DocumentProperties(NULL, hSepPrinter, pSepPrinter->pPrinterName, pSepDevMode, NULL, DM_OUT_BUFFER) != IDOK) { HeapFree(GetProcessHeap(), 0, pSepDevMode); pSepDevMode = NULL; } } void SepTestExtraPage(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName, MAX_PATH); SepPrintSepFile(szFileName, pSepDevMode); } void SepTestAttachPage(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName, MAX_PATH); SepPrintSepFile(szFileName, NULL); } void SepPrintSepFile(PTCHAR szFileName, DEVMODE* pDevMode) { HDC hDC; DOCINFO DocInfo; RECT rectPaper; if (!pSepPrinter) return; // start separator page document hDC = CreateDC(pSepPrinter->pDriverName, pSepPrinter->pPrinterName, L"", pDevMode); if (!hDC) return; DocInfo.lpszDocName = L"Separator Page Test"; DocInfo.lpszOutput = 0; DocInfo.lpszDatatype = NULL; DocInfo.fwType = 0; DocInfo.cbSize = sizeof(DOCINFO); StartDoc(hDC, (LPDOCINFO)&DocInfo); StartPage(hDC); rectPaper.left = rectPaper.top = 0; rectPaper.right = GetDeviceCaps(hDC, HORZRES); rectPaper.bottom = GetDeviceCaps(hDC, VERTRES); // draw sep page on this DC SepDrawSepPage(hDC, &rectPaper, szFileName); // end page EndPage(hDC); EndDoc(hDC); DeleteDC(hDC); } void SepPreviewExtraPage(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; GetDlgItemText(hDlg, IDC_EXTRAFILEEDIT, szFileName, MAX_PATH); SepPreviewSepFile(hDlg, szFileName, pSepDevMode); } void SepPreviewAttachPage(HWND hDlg) { TCHAR szFileName[MAX_PATH+1]; GetDlgItemText(hDlg, IDC_ATTACHFILEEDIT, szFileName, MAX_PATH); SepPreviewSepFile(hDlg, szFileName, NULL); } void SepPreviewSepFile(HWND hDlg, PTCHAR szFileName, DEVMODE* pDevMode) { if (!pSepPrinter) return; // Start separator page document hSepPrtDC = CreateDC(pSepPrinter->pDriverName, pSepPrinter->pPrinterName, L"", pDevMode); if (!hSepPrtDC) return; wcscpy(szSepViewFile, szFileName); DialogBox((HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE), L"SepPreViewDlg", hDlg, SepPreviewDlgProc); DeleteDC(hSepPrtDC); } LRESULT APIENTRY SepPreviewDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: SepPreviewInit(hDlg); return TRUE; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { EndDialog (hDlg, TRUE); return TRUE; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: EndDialog(hDlg, IDOK); default: return FALSE; } return TRUE; case WM_PAINT: SepPreviewPaint(hDlg); return FALSE; } return FALSE; } void SepPreviewInit(HWND hDlg) { int hPrtSize, vPrtSize; int hScrSize, vScrSize; int hViewSize, vViewSize; int hScrPixel, vScrPixel; int hViewPixel, vViewPixel; int hDlgPixel, vDlgPixel; RECT rectButton; RECT rectClient; HDC hScrDC; hScrDC = GetDC(hDlg); hPrtSize = GetDeviceCaps(hSepPrtDC, HORZSIZE); vPrtSize = GetDeviceCaps(hSepPrtDC, VERTSIZE); hScrSize = GetDeviceCaps(hScrDC, HORZSIZE); vScrSize = GetDeviceCaps(hScrDC, VERTSIZE); hScrPixel = GetDeviceCaps(hScrDC, HORZRES); vScrPixel = GetDeviceCaps(hScrDC, VERTRES); vViewPixel = vScrPixel - 100; vViewSize = MulDiv(vViewPixel, vScrSize, vScrPixel); hViewSize = MulDiv(vViewSize, hPrtSize, vPrtSize); hViewPixel = MulDiv(hViewSize, hScrPixel, hScrSize); if (hViewPixel > hScrPixel - 20) { hViewPixel = hScrPixel - 20; hViewSize = MulDiv(hViewPixel, hScrSize, hScrPixel); vViewSize = MulDiv(hViewSize, vPrtSize, hPrtSize); vViewPixel = MulDiv(vViewSize, vScrPixel, vScrSize); } hDlgPixel = min(hViewPixel + 50, hScrPixel); vDlgPixel = min(vViewPixel + 80, vScrPixel); MoveWindow(hDlg, (hScrPixel - hDlgPixel)/2, (vScrPixel - vDlgPixel)/2, hDlgPixel, vDlgPixel, FALSE); GetWindowRect(GetDlgItem(hDlg, IDOK), &rectButton); GetClientRect(hDlg, &rectClient); MoveWindow(GetDlgItem(hDlg, IDOK), (rectClient.right - (rectButton.right - rectButton.left))/2, rectClient.bottom - (rectButton.bottom - rectButton.top) - 5, rectButton.right - rectButton.left, rectButton.bottom - rectButton.top, TRUE); rcSepView.left = (rectClient.right - hViewPixel)/2; rcSepView.top = (rectClient.bottom - vViewPixel -(rectButton.bottom - rectButton.top) - 5)/2; rcSepView.right = rcSepView.left + hViewPixel; rcSepView.bottom = rcSepView.top + vViewPixel; ReleaseDC(hDlg, hScrDC); } void SepPreviewPaint(HWND hDlg) { HDC hDC; hDC = GetDC(hDlg); Rectangle(hDC, rcSepView.left, rcSepView.top, rcSepView.right, rcSepView.bottom); SepDrawSepPage(hDC, &rcSepView, szSepViewFile); ReleaseDC(hDlg, hDC); } void SepDrawSepPage(HDC hDC, RECT* pBound, PTCHAR szFileName) { HENHMETAFILE hEmf; HANDLE hFile; HANDLE hFileMapping; DWORD dwFileSizeLo; PCHAR pFileStart; DWORD cbRead; DWORD dwEmfLen, dwTextRecords; SIZE sizePage; TEXTBOX* pTextRec; RECT rect, trect; HFONT hFont, hOldFont; TCHAR text[2000]; // open separator file hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hFile==INVALID_HANDLE_VALUE) return; // get EMF and text size ReadFile(hFile, &dwEmfLen, sizeof(DWORD), &cbRead, NULL); if (cbRead != sizeof(DWORD)) { CloseHandle(hFile); return;} ReadFile(hFile, &dwTextRecords, sizeof(DWORD), &cbRead, NULL); if (cbRead != sizeof(DWORD)) { CloseHandle(hFile); return;} ReadFile(hFile, &sizePage, sizeof(SIZE), &cbRead, NULL); if (cbRead != sizeof(SIZE)) { CloseHandle(hFile); return;} // create mapping dwFileSizeLo = GetFileSize(hFile, NULL); hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (!hFileMapping || dwFileSizeLo==-1) { CloseHandle(hFile); return;} // map view of file pFileStart = (char *)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 2 * sizeof(DWORD) + sizeof(SIZE) + dwEmfLen + dwTextRecords * sizeof(TEXTBOX)); if (!pFileStart) { CloseHandle(hFileMapping); CloseHandle(hFile); return;} // create EMF hEmf = SetEnhMetaFileBits(dwEmfLen, pFileStart + 2 * sizeof(DWORD) + sizeof(SIZE)); if (hEmf) { // play EMF PlayEnhMetaFile(hDC, hEmf, pBound); // delete EMF DeleteEnhMetaFile(hEmf); } // Set Map Mode SetMapMode(hDC, MM_ANISOTROPIC); SetViewportExtEx(hDC, pBound->right - pBound->left, pBound->bottom - pBound->top, NULL); SetWindowExtEx(hDC, sizePage.cx, -sizePage.cy, NULL); SetViewportOrgEx(hDC, pBound->left, pBound->top, NULL); SetWindowOrgEx(hDC, -sizePage.cx/2, sizePage.cy/2, NULL); // Process Text Objects pTextRec = (TEXTBOX*) (pFileStart + 2 * sizeof(DWORD) + sizeof(SIZE) + dwEmfLen); while (dwTextRecords--) { // get draw rectangle rect = pTextRec -> position; // normalize rectangle trect.left = min(rect.left, rect.right); trect.top = max(rect.top, rect.bottom); trect.right = max(rect.left, rect.right); trect.bottom = min(rect.top, rect.bottom); // leave margins to border, as in editor trect.left = min(trect.left + 2, trect.right); trect.top = max(trect.top - 2, trect.bottom); trect.right = max(trect.left, trect.right - 2); trect.bottom = min(trect.top, trect.bottom + 2); // create font hFont = CreateFontIndirectA(&(pTextRec->lf)); if (hFont) hOldFont = SelectObject(hDC, hFont); // set text color SetTextColor(hDC, pTextRec->color); // convert text to UNICODE if defined wsprintf(text, L"%hs", pTextRec->text); // draw text DrawText(hDC, text,-1,&trect,DT_WORDBREAK|AlignTable[pTextRec->align].drawstyle); // restore and delete font if (hFont) { SelectObject(hDC, hOldFont); DeleteObject(hFont); } pTextRec++; } // close file UnmapViewOfFile(pFileStart); CloseHandle(hFileMapping); CloseHandle(hFile); }