⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 打印.txt

📁 打印页面上的图形
💻 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 + -