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 OCX 1.0\Samples\VC++\PreviewPages\PreviewPagesDlg.cpp or C:\Program Files\Softelvdm\SftPrintPreview OCX 1.0\Samples\VC++\PreviewPages\PreviewPagesDlg.cpp (on 32-bit Windows versions).
BOOL CSftPrintPreviewDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect rect;
GetClientRect(&rect);
m_Preview1.MoveWindow(0, 0, rect.Width(), rect.Height());
m_vPrintPreview1 = m_Preview1.GetControlUnknown();
ASSERT(m_vPrintPreview1 != NULL);
// Use the RenderContent event to render pages
m_vPrintPreview1->ContentProviderCallback(0, NULL, NULL);
ShowWindow(SW_MAXIMIZE);
UpdateWindow();
MessageBox(_T("This example demonstrates application-generated output.\r\n\r\nIt prints one bitmap and 50 lines of text a total of 20 times. "
"The included source code illustrates how an application can print one page at a time, with an easy "
"mechanism to keep track of restart positions."), _T("SftPrintPreview/OCX"));
return TRUE; // return TRUE unless you set the focus to a control
}
void CSftPrintPreviewDlg::OnPageSetupWantedSftPrintPreview1()
{
m_vPrintPreview1->PageSetup((long) m_hWnd);
}
void CSftPrintPreviewDlg::OnCloseWantedSftPrintPreview1()
{
OnOK();
}
void CSftPrintPreviewDlg::OnHelpWantedSftPrintPreview1(LPCTSTR HelpName)
{
MessageBox(_T("Sorry, this sample doesn't offer a help file"));
}
void CSftPrintPreviewDlg::OnRenderContentSftPrintPreview1(long Function, long FAR* LastPage, VARIANT FAR* VisitedPageInfo)
{
// This function is called by SftPrintPreview to print pages, to initialize and
// terminate printing (to prepare and free resources) and for page positioning
if (Function == renderSftPrintPreview_Init) {
SftPrintPreviewRenderingInfo I = m_vPrintPreview1->GetRenderingInfo();
int height = MulDiv(10, GetDeviceCaps((HDC)I.hDCPrinter, LOGPIXELSY), 72);// 10 point font
m_PrintFont.CreateFont(- height, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE|DEFAULT_PITCH,
_T("Arial"));
_ASSERT(m_PrintFont.m_hObject);
} else if (Function == renderSftPrintPreview_Term)
m_PrintFont.DeleteObject();
else if (Function == renderSftPrintPreview_1Page)
PrintOnePage(VisitedPageInfo, LastPage);
}
#define LINETEXT TEXT("Softel vdm, Inc. - www.WindowsControls.com")
void CSftPrintPreviewDlg::PrintOnePage(VARIANT FAR* VisitedPageInfo, long FAR* LastPage)
{
// Print one page (can occur multiple times)
// RenderingInfo.CurrentPage has the absolute page # to print (0..n)
// RenderingInfo.PreviousVisitedPageInfo contains the value you returned in
// RenderingInfo.VisitedPageInfo when you finished printing the previous page
// This allows you to simply restart where you left off.
// The information you return in RenderingInfo.VisitedPageInfo is of type
// object, so it can be a simple counter or even a complex object, with cached
// information.
// In this example we print 1 bitmap, then 50 lines of text,
// 20 times
// We use RenderingInfo.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 RenderingInfo.VisitedPageInfo
// to store more complex information.
long counter = 0;
RECT outRect;
COleVariant varVisitedPageInfo(*VisitedPageInfo);
SftPrintPreviewRenderingInfo RenderInfo = m_vPrintPreview1->GetRenderingInfo();
outRect = RenderInfo.OutputRectDisplayPix;
CDC* pDC = CDC::FromHandle((HDC)RenderInfo.hDC);
if (RenderInfo.PreviousVisitedPageInfo.vt == VT_I4)
counter = RenderInfo.PreviousVisitedPageInfo.lVal;// we left off here on the previous page
// starting output position on this page
int xPrinter, yPrinter;
xPrinter = outRect.left;
yPrinter = outRect.top;
for ( ; ; )
{
if (counter >= (1+50)*20) // 1 bitmap, 50 lines of text, 20 times
{
// we have printed 1 bitmap and 50 lines 20 times, we're done
*LastPage = RenderInfo.CurrentPage; // return that this is the last page
break;
}
if ((counter % (50+1)) == 0)
{
// Print a bitmap
// get bitmap size
long wPrinterPix, hPrinterPix, wDispPix, hDispPix;
m_vPrintPreview1->GetDDBSize((long)(HBITMAP)m_BitmapPage, RenderInfo.hDCPrinter, &wPrinterPix, &hPrinterPix, &wDispPix, &hDispPix);
// make sure entire image fits on remaining page
if (yPrinter + hPrinterPix > outRect.bottom)
break;
// print bitmap, horizontally centered
m_vPrintPreview1->PrintDDB((long)(HBITMAP)m_BitmapPage, (long) pDC->m_hDC, xPrinter +((outRect.right-outRect.left)-wPrinterPix)/2,
yPrinter, wPrinterPix, hPrinterPix, wDispPix, hDispPix);
yPrinter += hPrinterPix; // next available space
}
else
{
// Print line
// get text size
RECT rect;
pDC->SelectObject(m_PrintFont);
pDC->SetTextColor(RGB(0,0,0));
// get text size
SetRectEmpty(&rect);
pDC->DrawText(LINETEXT, &rect, DT_LEFT| DT_TOP | DT_SINGLELINE | DT_CALCRECT);
// make sure text fits on remaining page
if (yPrinter + (rect.bottom-rect.top) > outRect.bottom)
break;
RECT r = outRect;
r.top = yPrinter;
pDC->DrawText(LINETEXT, &r, DT_CENTER| DT_TOP | DT_SINGLELINE);
yPrinter += rect.bottom-rect.top; // next available space
}
++counter; // one more item done
}
varVisitedPageInfo = counter;// we left off here
VariantCopy(VisitedPageInfo, varVisitedPageInfo);
}
BEGIN_EVENTSINK_MAP(CSftPrintPreviewDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSftPrintPreviewDlg)
ON_EVENT(CSftPrintPreviewDlg, IDC_SFTPRINTPREVIEW1, 8 /* CloseWanted */, OnCloseWantedSftPrintPreview1, VTS_NONE)
ON_EVENT(CSftPrintPreviewDlg, IDC_SFTPRINTPREVIEW1, 6 /* HelpWanted */, OnHelpWantedSftPrintPreview1, VTS_BSTR)
ON_EVENT(CSftPrintPreviewDlg, IDC_SFTPRINTPREVIEW1, 7 /* PageSetupWanted */, OnPageSetupWantedSftPrintPreview1, VTS_NONE)
ON_EVENT(CSftPrintPreviewDlg, IDC_SFTPRINTPREVIEW1, 14 /* RenderContent */, OnRenderContentSftPrintPreview1, VTS_I4 VTS_PI4 VTS_PVARIANT)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
