📄 打印.txt
字号:
新建一个 Form 作为预览窗口,上面放一个 Image1,两个 TButton 名为 ButtonPreview 和 ButtonPrint,在 ButtonPreview 的 OnClick 事件中写:
int index = 1;//要预览的页码,总页数为xPage*yPage(请参考PreviewImagePage函数)
TPoint p = PrinterSize(Printer());
Image1->Width = p.x;
Image1->Height = p.y;
PreviewImagePage(index, Printer(), FormOther->PaintBox1->Canvas, Image1->Canvas);//FormOther为你要预览的PaintBox所在的Form名,当然,要include它的头文件
在 ButtonPrint 的 OnClick 事件中写:
PrintAsScreen(
Image1->Canvas,
Printer(),
Image1->Canvas->ClipRect,
Image1->Canvas->ClipRect);
所用到的函数如下:
#include <printers.hpp>
#include <Math.hpp>
//---------------------------------------------------------------------------
void PrintAsScreen( TCanvas *canvas, TPrinter *printer, TRect rectSource, TRect rectTarget)
/*
功能:所见即所得打印方式
参数:
canvas - 待打印的画布
printer - 打印机
rectSource - 源打印区域
rectTarget - 目标打印区域(若与rectSource不同则为缩放打印)
返回值:
无
*/
{
if( !printer ) {
return;
}
printer->BeginDoc();
int OriginalMapMode = GetMapMode(printer->Handle);//当前影射模式
SetMapMode(printer->Handle, MM_ISOTROPIC);//设置图形影射模式
SIZE ss;
ss.cx = Screen->Width;
ss.cy = Screen->Height;
SetWindowExtEx( printer->Handle, ss.cx, ss.cy, &ss);//设置窗口
//获取打印机x方向每英寸象素点数
float xLogPixelsPerInch = GetDeviceCaps(printer->Handle, LOGPIXELSX);
//获取打印机y方向每英寸象素点数
float yLogPixelsPerInch = GetDeviceCaps(printer->Handle, LOGPIXELSY);
ss.cx = xLogPixelsPerInch;
ss.cy = yLogPixelsPerInch;
SetViewportExtEx(//设置视口
printer->Handle,
Screen->Width * xLogPixelsPerInch / Screen->PixelsPerInch,
Screen->Height * yLogPixelsPerInch / Screen->PixelsPerInch,
&ss);
printer->Canvas->CopyRect(
rectTarget, //Target Rect
canvas, //Source Canvas
rectSource ); //Source Rect
printer->EndDoc();
SetMapMode(printer->Handle, OriginalMapMode);//复原影射模式
}
//---------------------------------------------------------------------------
TPoint PrinterSize( TPrinter *printer )
/*
功能:获得所见即所得打印方式下的可打印区域大小(像素值)
参数:
printer - 打印机
返回值:
可打印区域大小(像素值)
*/
{
TPoint p = Point(0,0);
if( !printer ) {
return(p);
}
//获取打印机x方向每英寸象素点数
float xLogPixelsPerInch = GetDeviceCaps(printer->Handle, LOGPIXELSX);
//获取打印机y方向每英寸象素点数
float yLogPixelsPerInch = GetDeviceCaps(printer->Handle, LOGPIXELSY);
p.x = (int)((float)printer->PageWidth * Screen->PixelsPerInch / xLogPixelsPerInch);
p.y = (int)((float)printer->PageHeight* Screen->PixelsPerInch / yLogPixelsPerInch);
return(p);
}
//---------------------------------------------------------------------------
//预览第 index 页,canvaSource 是你要预览的 PaintBox->Canvas, canvasTarget 是预览窗口的 Image1->Canvas
void PreviewImagePage(int index, TPrinter *printer, TCanvas *canvasSource, TCanvas *canvasTarget)
/*
功能:预览第 index 页图像
参数:
index - 要预览的页码
canvasSource - 源图像画布
canvasTarget - 目标图像画布
返回值:
无
*/
{
TPoint p1 = Point(canvasSource->ClipRect.Width(), canvasSource->ClipRect.Height());//源图像大小
TPoint p2 = PrinterSize(printer);//可打印区域大小
int xPage = Ceil((float)p1.x/p2.x); //x方向分页数
int yPage = Ceil((float)p1.y/p2.y); //y方向分页数
unsigned short x, y;
canvasTarget->FillRect(canvasTarget->ClipRect);//用当前画刷清空画布
if( index >= 1 && index <= xPage * yPage ) {
DivMod(index-1, xPage, y, x);//先水平后垂直分页
canvasTarget->CopyRect(
Rect(0,0,p2.x,p2.y), //目标区域
canvasSource, //源图像
Rect(x*p2.x,y*p2.y,(x+1)*p2.x,(y+1)*p2.y)); //源图像区域
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -