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 application-generated output.
The source code is located at C:\Program Files (x86)\Softelvdm\SftPrintPreview DLL 2.0\Samples\C\PreviewPages\PreviewPages.c or C:\Program Files\Softelvdm\SftPrintPreview DLL 2.0\Samples\C\PreviewPages\PreviewPages.c (on 32-bit Windows versions).
#include <windows.h> #include <stdlib.h> #include <crtdbg.h> #include "SftPrintPreview.h" /* SftPrintPreview/DLL Header File */ #include "resource.h" #define IDC_PREVIEW 100 // ID for preview control #define LINETEXT TEXT("Softel vdm, Inc. - www.softelvdm.com") /**********************************************************************/ /* Globals */ /**********************************************************************/ #define MAINWINDOWCLASS "SampleMainFrame" HINSTANCE m_hInstance; // App Instance Handle HWND m_hwndPreview; // Preview window HFONT m_hPrintFont; // printer font /**********************************************************************/ /* Page Printing */ /**********************************************************************/ static void PrintOnePage(LPSFTPRINTPREVIEW_DRAWINFO lpInfo) { // Print one page (can occur multiple times) // lpInfo->absPage has the absolute page # to print (0..n) // lpInfo->previousVisitedPageInfo contains the value you returned in // lpInfo->visitedPageInfo when you finished printing the previous page // This allows you to simply restart where you left off. // The information you return in lpInfo->visitedPageInfo is of type // SFTPRINTPREVIEW_DWORD_PTR, so it can be a simple counter or // even a pointer to stored, cached information. // In this example we print 1 bitmap, then 50 lines of text, // 20 times // We use lpInfo->previousVisitedPageInfo to resume printing. // We simply start at 0 and add 1 for each bitmap or line we // printed. Using a simple formula, we can determine where we // left off. In an application, the concept remains the same, but // instead of a simple counter, you could use lpInfo->visitedPageInfo // to store a pointer to cached information. int counter = (int) lpInfo->previousVisitedPageInfo;// we left off here on the previos page int xPrinter, yPrinter; HBITMAP hBitmap = NULL; // starting output position on this page xPrinter = lpInfo->OutputRectDisplayPix.left; yPrinter = lpInfo->OutputRectDisplayPix.top; // load bitmap hBitmap = LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_WEBPAGE)); _ASSERT(hBitmap); for ( ; ; ) { int wPrinter, hPrinter, w, h; if (counter >= (1+50)*20) { // we have printed 1 bitmap and 50 lines 20 times, we're done lpInfo->lastPage = lpInfo->absPage; // return that this is the last page break; } if ((counter % (50+1)) == 0) { // Print a bitmap // get bitmap size SftPrintPreview_GetBitmapSize(hBitmap, lpInfo->hDCPrinter, &wPrinter, &hPrinter, &w, &h); // make sure entire image fits on remaining page if (yPrinter != lpInfo->OutputRectDisplayPix.top && yPrinter + hPrinter > lpInfo->OutputRectDisplayPix.bottom) break; // print bitmap, horizontally centered // this code does not handle if the bitmap is too large for the remaining space SftPrintPreview_PrintBitmap(hBitmap, lpInfo->hDC, xPrinter +(lpInfo->OutputRectDisplayPix.right-lpInfo->OutputRectDisplayPix.left-wPrinter)/2, yPrinter, wPrinter, hPrinter, w, h); yPrinter += hPrinter; // next available space } else { // Print line RECT rect, OutRect; HFONT hOldFont = SelectObject(lpInfo->hDC, m_hPrintFont); SetTextColor(lpInfo->hDC, RGB(0,0,0)); // get text size SetRectEmpty(&rect); DrawText(lpInfo->hDC, LINETEXT, -1, &rect, DT_LEFT| DT_TOP | DT_SINGLELINE | DT_CALCRECT); // make sure text fits on remaining page if (yPrinter + (rect.bottom-rect.top) > lpInfo->OutputRectDisplayPix.bottom) break; OutRect = lpInfo->OutputRectDisplayPix; OutRect.top = yPrinter; DrawText(lpInfo->hDC, LINETEXT, -1, &OutRect, DT_CENTER| DT_TOP | DT_SINGLELINE); yPrinter += rect.bottom-rect.top; // next available space hOldFont = SelectObject(lpInfo->hDC, hOldFont); } ++counter; // one more item done } if (hBitmap) DeleteObject(hBitmap); lpInfo->visitedPageInfo = counter; // we left off here } BOOL CALLBACK RenderPages_Callback(LPSFTPRINTPREVIEW_DRAWINFO lpInfo) { switch (lpInfo->function) { case SFTPRINTPREVIEW_PRINT_INIT: { // printing/preview is about to begin // initialize any "expensive" resources you may need int height = MulDiv(10, GetDeviceCaps(lpInfo->hDCPrinter, LOGPIXELSY), 72);// 10 point font m_hPrintFont = CreateFont(- height, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE|DEFAULT_PITCH, TEXT("Arial")); _ASSERT(m_hPrintFont); return TRUE; } case SFTPRINTPREVIEW_PRINT_TERM: // printing/preview is ending // free resources no longer needed if (m_hPrintFont) DeleteObject(m_hPrintFont); m_hPrintFont = NULL; return TRUE; case SFTPRINTPREVIEW_PRINT_ONEPAGE: // print one page (can occur multiple times) PrintOnePage(lpInfo); return TRUE; case SFTPRINTPREVIEW_PRINT_CLEARCACHE: // the output needs to be reformatted - clear any cached information return TRUE; case SFTPRINTPREVIEW_PRINT_DIMENSIONS: // determine best output width for current data // iContentSizing and contentWidth have suggested width and display style // If you want to manage the entire printable area (inside the margins), // no action is required return TRUE; default: return FALSE; } } /**********************************************************************/ /* 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.numPageRows = 1; // default to 1x2 pages Ctl.numPageGroups = 2; Ctl.zoom = 0; // start out with multiple pages lstrcpy(Ctl.szOutputName, TEXT("SftPrintPreview PreviewPages Sample Output")); // job name when printing lstrcpy(Ctl.szHeaderRight, TEXT("SftPrintPreview/DLL PreviewPages Sample")); lstrcpy(Ctl.szFooterLeft, TEXT("www.softelvdm.com")); Ctl.fCenterOnClick = FALSE; Ctl.fDragPage = TRUE; Ctl.iZoomStyle = SFTPRINTPREVIEW_ZOOMSTYLE_BOTHBUTTONS_EXACT; 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 = RenderPages_Callback;// callback for our pages Ctl.hwndContent = NULL; // no 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; } } /**********************************************************************/ /* Main Window Proc */ /**********************************************************************/ LRESULT CALLBACK MainWindowProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: // create a preview window m_hwndPreview = CreateWindow(TEXT(SFTPRINTPREVIEW_CLASS), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, 0, hwndMain, (HMENU) IDC_PREVIEW, m_hInstance, NULL); _ASSERT(m_hwndPreview); if (!m_hwndPreview) return -1; InitPreviewWindow(m_hwndPreview); DefineContents(m_hwndPreview); SetFocus(m_hwndPreview); ShowWindow(hwndMain, SW_SHOW); break; case WM_DESTROY: if (m_hwndPreview) DestroyWindow(m_hwndPreview); m_hwndPreview = NULL; break; case WM_SIZE: { RECT rect; GetClientRect(hwndMain, &rect); MoveWindow(m_hwndPreview, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE); break; } case WM_SETFOCUS: SetFocus(m_hwndPreview); break; case WM_COMMAND: { HWND hwndCtl = (HWND) lParam; int id = LOWORD(wParam); int code = HIWORD(wParam); if (hwndCtl) { switch (id) { case IDC_PREVIEW: switch (code) { case SFTPRINTPREVIEWN_STARTPRINTING: SftPrintPreview_Print(hwndCtl, hwndMain); break; } 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(hwndMain, WM_CLOSE, 0, 0); break; } case NM_SFTPRINTPREVIEW_HELP_CODE: { // help requested NM_SFTPRINTPREVIEW_HELP* pNtfy = (NM_SFTPRINTPREVIEW_HELP*) lParam; MessageBox(hwndMain, TEXT("Sorry, this sample application doesn't include online help."), TEXT("SftPrintPreview/DLL"), MB_OK); break; } case NM_SFTPRINTPREVIEW_PAGESETUP_CODE: { // Page setup requested SftPrintPreview_PageSetup(m_hwndPreview, hwndMain); break; } } break; } break; } case WM_CLOSE: PostQuitMessage(1); break; } return DefWindowProc(hwndMain, uMsg, wParam, lParam); } /**********************************************************************/ /* WinMain */ /**********************************************************************/ int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int cmdShow) { WNDCLASS wndClass; HWND hwndMain; MSG msg; m_hInstance = hinst; msg.wParam = 0; // Register with SftPrintPreview/DLL SftPrintPreview_RegisterApp(m_hInstance); // Register main frame window memset(&wndClass, 0, sizeof(wndClass)); wndClass.lpfnWndProc = MainWindowProc; wndClass.hInstance = m_hInstance; wndClass.hIcon = LoadIcon(m_hInstance, MAKEINTRESOURCE(IDI_ICON1)); wndClass.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndClass.lpszClassName = TEXT(MAINWINDOWCLASS); if (!RegisterClass(&wndClass)) { _ASSERT(0); return -1; } // Create main frame window hwndMain = CreateWindowEx(0, TEXT(MAINWINDOWCLASS), TEXT("SftPrintPreview/DLL PreviewPages Sample"), WS_OVERLAPPEDWINDOW|WS_SIZEBOX|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, //no menu for this sample m_hInstance, NULL); _ASSERT(hwndMain); if (hwndMain) { MessageBox(hwndMain, TEXT("This example demonstrates application-generated output.\r\n\r\nIt prints one bitmap and 50 lines of text a total of 20 times. ") TEXT("The included source code illustrates how an application can print one page at a time, with an easy ") TEXT("mechanism to keep track of restart positions."), TEXT("SftPrintPreview/DLL"), MB_OK | MB_ICONINFORMATION); for ( ; ; ) { if (GetMessage(&msg, NULL, 0, 0) == 0) break; TranslateMessage(&msg); DispatchMessage(&msg); } } if (!UnregisterClass(TEXT(MAINWINDOWCLASS), m_hInstance)) _ASSERT(0); SftPrintPreview_UnregisterApp(m_hInstance); /* Unregister from SftPrintPreview/DLL */ return (int) msg.wParam; }