SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftMask/OCX 7.0 - Masked Edit Control
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftPrintPreview/DLL 2.0 - Print Preview Control (discontinued)
SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftDirectory 3.5 - File/Folder Control (discontinued)
SftMask/OCX 7.0 - Masked Edit Control
SftOptions 1.0 - Registry/INI Control (discontinued)
SftPrintPreview/OCX 1.0 - Print Preview Control (discontinued)
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftTabs/NET 6.0 - Tab Control (discontinued)
SftTree/NET 2.0 - Tree Control
This sample illustrates RichEdit control output.
The source code is located at C:\Program Files (x86)\Softelvdm\SftPrintPreview DLL 2.0\Samples\C\PreviewRichEdit\PreviewRichEdit.c or C:\Program Files\Softelvdm\SftPrintPreview DLL 2.0\Samples\C\PreviewRichEdit\PreviewRichEdit.c (on 32-bit Windows versions).
#include <windows.h> #include <stdlib.h> #include <Richedit.h> #include <crtdbg.h> #include "SftPrintPreview.h" /* SftPrintPreview/DLL Header File */ #include "resource.h" /**********************************************************************/ /* Globals */ /**********************************************************************/ HINSTANCE g_hInst; // App Instance Handle HWND m_hwndRichEdit; // Richedit Window /**********************************************************************/ /* Center the main dialog */ /**********************************************************************/ static void CenterWindow(HWND hwnd) { RECT rc; RECT rcOwner; int x, y; GetWindowRect(hwnd, &rc); GetWindowRect(GetDesktopWindow(), &rcOwner); // Calculate the starting x,y for the new window so that it would be centered. x = rcOwner.left + (((rcOwner.right - rcOwner.left) - (rc.right - rc.left)) / 2); y = rcOwner.top + (((rcOwner.bottom - rcOwner.top) - (rc.bottom - rc.top)) / 2); SetWindowPos(hwnd, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER); } /**********************************************************************/ /* Load RichEdit Window */ /**********************************************************************/ DWORD CALLBACK EditStreamCallback(SFTPRINTPREVIEW_DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { HANDLE hFile = (HANDLE) dwCookie; DWORD dwdRead = 0; if (ReadFile(hFile, pbBuff, cb, &dwdRead, NULL)) { //_ASSERT(cb == dwdRead); *pcb = dwdRead; return 0; } return -1; } void LoadEditControlWithFile(HWND hwndDlg, LPCTSTR lpszFileName) { HANDLE hFile = CreateFile(lpszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { EDITSTREAM es; HWND hwndRichEdit = GetDlgItem(hwndDlg, IDC_RICHEDIT); HCURSOR oldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); SetWindowText(hwndRichEdit, TEXT("Loading ...")); ShowWindow(GetParent(hwndRichEdit), SW_SHOW); UpdateWindow(GetParent(hwndRichEdit)); es.dwCookie = (SFTPRINTPREVIEW_DWORD_PTR) hFile; // use our file handle as cookie es.dwError = 0; es.pfnCallback = EditStreamCallback; SendMessage(hwndRichEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es); // load file CloseHandle(hFile); SetCursor(oldCursor); } } void LoadEditControl(HWND hwndDlg) { TCHAR szFile[_MAX_PATH] = TEXT(""); OPENFILENAME ofn; memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = TEXT("RTF Files (*.rtf)\0*.rtf\0\0"); ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR); ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; if (GetOpenFileName(&ofn)) LoadEditControlWithFile(hwndDlg, szFile); else { DWORD dwd = CommDlgExtendedError(); if (dwd != 0) _ASSERT(0); } } /**********************************************************************/ /* Initialize Preview Window */ /**********************************************************************/ void InitPreviewWindow(HWND hwndCtl) { // retrieve current control settings SFTPRINTPREVIEW_CONTROL Ctl; Ctl.cbSize = sizeof(SFTPRINTPREVIEW_CONTROL); if (!SftPrintPreview_GetControlInfo(hwndCtl, &Ctl)) { _ASSERT(0); // the SFTPRINTPREVIEW_CONTROL structure's cbSize member wasn't initialized properly return; } // set all desired options Ctl.fCenterOnClick = FALSE; Ctl.fDragPage = TRUE; Ctl.iZoomStyle = SFTPRINTPREVIEW_ZOOMSTYLE_BOTHBUTTONS_EXACT; Ctl.numPageRows = 1; // default to 1x2 pages Ctl.numPageGroups = 2; Ctl.zoom = 0; // start out with multiple pages lstrcpy(Ctl.szOutputName, TEXT("SftPrintPreview RichEdit Output")); // job name when printing lstrcpy(Ctl.szHeaderRight, TEXT("SftPrintPreview/DLL RichEdit Preview Sample")); lstrcpy(Ctl.szFooterLeft, TEXT("www.softelvdm.com")); if (!SftPrintPreview_SetControlInfo(hwndCtl, &Ctl)) { int errorValue = Ctl.errorValue; _ASSERT(0); // an error occurred, check errorValue for error code return; } } void DefineContents(HWND hwndCtl) { SFTPRINTPREVIEW_CONTROL Ctl; Ctl.cbSize = sizeof(SFTPRINTPREVIEW_CONTROL); if (!SftPrintPreview_GetControlInfo(hwndCtl, &Ctl)) { _ASSERT(0); // the SFTPRINTPREVIEW_CONTROL structure's cbSize member wasn't initialized properly return; } // define desired contents to preview/print Ctl.lpDrawPageWorkArea = (SFTPRINTPREVIEW_DWORD_PTR) NULL;// no workarea needed Ctl.lpDrawInfoProc = SftPrintPreview_RenderRicheditWindow_Callback;// callback needed for RichEdit control Ctl.hwndContent = m_hwndRichEdit; // We'll use this window Ctl.hwndData = NULL; // no data window (content window is data window) Ctl.iContentSizing = SFTPRINTPREVIEW_CONTENTSIZING_SHRINKTOFIT;// shrink to fit on page if (!SftPrintPreview_SetControlInfo(hwndCtl, &Ctl)) { int errorValue = Ctl.errorValue; _ASSERT(0); // an error occurred, check errorValue for error codes return; } } /**********************************************************************/ /* Preview Dialog Proc */ /**********************************************************************/ BOOL CALLBACK PreviewDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { // Center this dialog CenterWindow(hwndDlg); // make sure main dialog has a sizing box SetWindowLong(hwndDlg, GWL_STYLE, GetWindowLong(hwndDlg, GWL_STYLE) | WS_SIZEBOX); ShowWindow(hwndDlg, SW_SHOWMAXIMIZED); // Initialize Preview Window InitPreviewWindow(GetDlgItem(hwndDlg, IDC_PREVIEW)); DefineContents(GetDlgItem(hwndDlg, IDC_PREVIEW)); // changing window styles above has suppressed setfocus call SetFocus(GetDlgItem(hwndDlg, IDC_PREVIEW)); return FALSE; } case WM_DESTROY: break; case WM_COMMAND: { HWND hwndCtl = (HWND) lParam; int id = LOWORD(wParam); int code = HIWORD(wParam); if (hwndCtl) { switch (id) { case IDOK: case IDCANCEL: if (code == BN_CLICKED) SendMessage(hwndDlg, WM_COMMAND, id, 0); break; case IDC_PREVIEW: switch (code) { case SFTPRINTPREVIEWN_STARTPRINTING: SftPrintPreview_Print(hwndCtl, hwndDlg); break; } break; } } else { switch (id) { case IDOK: EndDialog(hwndDlg, TRUE); break; case IDCANCEL: EndDialog(hwndDlg, FALSE); break; } } break; } case WM_NOTIFY: { int id = (int) wParam; LPNMHDR pnmh = (LPNMHDR) lParam; switch (id) { case IDC_PREVIEW: switch (pnmh->code) { case NM_SFTPRINTPREVIEW_CLOSE_CODE: { // user wants to close NM_SFTPRINTPREVIEW_CLOSE* pNtfy = (NM_SFTPRINTPREVIEW_CLOSE*) lParam; SendMessage(hwndDlg, WM_COMMAND, IDCANCEL, 0); break; } case NM_SFTPRINTPREVIEW_HELP_CODE: { // Help requested NM_SFTPRINTPREVIEW_HELP* pNtfy = (NM_SFTPRINTPREVIEW_HELP*) lParam; MessageBox(hwndDlg, TEXT("Sorry, this sample application doesn't include online help."), TEXT("SftPrintPreview/DLL"), MB_OK); break; } case NM_SFTPRINTPREVIEW_PAGESETUP_CODE: { // Page setup requested HWND hwndCtl = GetDlgItem(hwndDlg, IDC_PREVIEW); SftPrintPreview_PageSetup(hwndCtl, hwndDlg); break; } } break; } break; } case WM_SIZE: { HWND hwndCtl = GetDlgItem(hwndDlg, IDC_PREVIEW); RECT rect; GetClientRect(hwndDlg, &rect); MoveWindow(hwndCtl, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE); break; } } return FALSE; } /**********************************************************************/ /* Main Dialog Proc */ /**********************************************************************/ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { HWND hwndRichEdit = GetDlgItem(hwndDlg, IDC_RICHEDIT); CHARRANGE cr; // Center this dialog CenterWindow(hwndDlg); // load Loading... text into edit control SendMessage(hwndRichEdit, EM_EXLIMITTEXT, 0, 0x7fffffff);//need all the space we can get // Load contents LoadEditControlWithFile(hwndDlg, TEXT("SftPrintPreview.rtf")); SetFocus(hwndRichEdit); cr.cpMin = 0; cr.cpMax = 0; SendMessage(hwndRichEdit, EM_EXSETSEL, 0, (LPARAM) &cr); return FALSE; } case WM_DESTROY: break; case WM_COMMAND: { HWND hwndCtl = (HWND) lParam; int id = LOWORD(wParam); int code = HIWORD(wParam); if (hwndCtl) { switch (id) { case IDCANCEL: case IDOK: case IDC_PREVIEW: case IDC_LOADFILE: if (code == BN_CLICKED) SendMessage(hwndDlg, WM_COMMAND, id, 0); break; } } else { switch (id) { case IDOK: EndDialog(hwndDlg, TRUE); break; case IDCANCEL: EndDialog(hwndDlg, FALSE); break; case IDC_PREVIEW: { m_hwndRichEdit = GetDlgItem(hwndDlg, IDC_RICHEDIT);// save edit window for preview window DialogBox(g_hInst, MAKEINTRESOURCE(IDD_PREVIEW_DIALOG), hwndDlg, (DLGPROC)PreviewDialogProc); break; } case IDC_LOADFILE: LoadEditControl(hwndDlg); break; } } break; } } return FALSE; } /**********************************************************************/ /* WinMain */ /**********************************************************************/ int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int cmdShow) { HMODULE hRichEditDLL; g_hInst = hinst; SftPrintPreview_RegisterApp(hinst); /* Register with SftPrintPreview/DLL */ hRichEditDLL = LoadLibrary(TEXT("riched20.dll")); // load richedit dll so we have richedit support */ _ASSERT(hRichEditDLL); // Initialize, run, and terminate the application DialogBox(g_hInst, MAKEINTRESOURCE(IDD_RICHEDIT_DIALOG), NULL, (DLGPROC)MainDialogProc); FreeLibrary(hRichEditDLL); SftPrintPreview_UnregisterApp(hinst); /* Unregister from SftPrintPreview/DLL */ return 0; }