如何实现windows里画图的打印预览程序
(delphi里的打印预览空间好像不能实现的)~~~~~??
如何控制图画的打印也显示:也就是,不会使得图画被从中间分两为张打印,
望高手赐教啦(有源码更感激不尽呀)~~~~~~~

解决方案 »

  1.   

    从<<delphi5编程实例>>上摘的,慢慢看吧,@_@
    6) 在F o r m 1的i n t e r f a c e部分的u s e s语句中将P r i n t e r s包含进去:
    i n t e r f a c e
    u s e s
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls,Printers;
    . . .
    7) 在U n i t 1 . p a s文件的T F o r m 1类型定义处,添加下面的变量:
    t y p e
    TForm1 = class(TForm)
    . . .
    p u b l i c
    { Public declarations }
    ZoomScale: Integer; // 打印时放大的比例
    PreviewScale:Integer; // 预览时缩小的比例
    L e f t M a r g i n , TopMargin: Integer; // 左边距和上边距
    e n d ;
    8) 在U n i t 2 . p a s文件的T F o r m 2类型定义处,添加下面的变量:
    t y p e
    TForm2 = class(TForm)
    . . .
    p u b l i c
    { Public declarations }
    P a g e Width,PageHeight:Integer; // 预览区域页面的宽度和高度
    e n d ;
    9) 在F o r m 1中添加F o r m 1窗体的O n C r e a t e事件、B u t t o n 1组件(打印预览)的O n C l i c k事件和
    B u t t o n 2组件(打印)的O n C l i c k事件的处理过程如下:
    procedure TForm1.Form1Create(Sender: TO b j e c t ) ;
    b e g i n
    I m a g e 1 . P i c t u r e . L o a d F r o m F i l e ( ' Tr e e . b m p ' ) ; // 装入位图文件
    e n d ;
    procedure TForm1.Button1Click(Sender: TO b j e c t ) ;
    下载
    v a r
    P P I X , P P I Y:Integer; // X方向和Y方向打印机每英寸的点数
    b e g i n
    PreviewScale := StrTo I n t ( E d i t 3 . Te x t ) ; // 预览显示比例
    Z o o m S c a l e : = S t r To I n t ( E d i t 4 . Te x t ) ;
    // 获取打印机每英寸的点数
    P P I X : = G e t D e v i c e C a p s ( P r i n t e r. H a n d l e , L O G P I X E L S X ) ;
    P P I Y: = G e t D e v i c e C a p s ( P r i n t e r. H a n d l e , L O G P I X E L S Y ) ;
    // 1英寸= 2 . 5 4厘米
    // 计算左边距和上边距
    L e f t M a r g i n : = Tr u n c ( S t r To F l o a t ( E d i t 1 . Te x t ) / 2 . 5 4*PPIX) div PreviewScale;
    To p M a r g i n : = Tr u n c ( S t r To F l o a t ( E d i t 2 . Te x t ) / 2 . 5 4*PPIY) div PreviewScale;
    // 计算页面大小
    if RadioGroup1.ItemIndex = 0 then
    b e g i n
    F o r m 2 . P a g e Wi d t h : = Tr u n c ( 2 1 . 0 / 2 . 5 4*PPIX) div PreviewScale;
    F o r m 2 . P a g e H e i g h t : = Tr u n c ( 2 9 . 7 / 2 . 5 4*PPIY) div PreviewScale;
    e n d
    e l s e
    b e g i n
    F o r m 2 . P a g e Wi d t h : = Tr u n c ( 1 8 . 4 / 2 . 5 4*PPIX) div PreviewScale;
    F o r m 2 . P a g e H e i g h t : = Tr u n c ( 2 6 . 0 / 2 . 5 4*PPIY) div PreviewScale;
    e n d ;
    // 显示预览窗口
    F o r m 2 . S h o w ;
    e n d ;
    procedure TForm1.Button2Click(Sender: TO b j e c t ) ;
    v a r
    P P I X , P P I Y: Integer; // X方向和Y方向打印机每英寸的点数
    Rect: TRect; // 按比例放大后图片区域的大小
    b e g i n
    Z o o m S c a l e : = S t r To I n t ( E d i t 4 . Te x t ) ;
    // 获取打印机每英寸的点数
    P P I X : = G e t D e v i c e C a p s ( P r i n t e r. H a n d l e , L O G P I X E L S X ) ;
    P P I Y: = G e t D e v i c e C a p s ( P r i n t e r. H a n d l e , L O G P I X E L S Y ) ;
    // 计算左边距和上边距
    L e f t M a r g i n : = Tr u n c ( S t r To F l o a t ( E d i t 1 . Te x t ) / 2 . 5 4*P P I X ) ;
    To p M a r g i n : = Tr u n c ( S t r To F l o a t ( E d i t 2 . Te x t ) / 2 . 5 4*P P I Y ) ;
    // 设置打印画幅的大小
    R e c t . L e f t : = L e f t M a r g i n ;
    R e c t . To p : = To p M a r g i n ;
    R e c t . R i g h t : = I m a g e 1 . P i c t u r e . Wi d t h*Z o o m S c a l e + R e c t . L e f t ;
    R e c t . B o t t o m : = I m a g e 1 . P i c t u r e . H e i g h t*Z o o m S c a l e + R e c t . To p ;
    第7章章打印章名161
    下载
    t r y
    P r i n t e r.BeginDoc; // 创建打印作业
    P r i n t e r. C a n v a s . S t r e t c h D r a w ( R e c t , I m a g e 1 . p i c t u r e . G r a p h i c ) ;
    P r i n t e r.EndDoc; // 送往打印机
    e x c e p t
    P r i n t e r.Abort; // 出错情况下中止打印
    r a i s e ;
    e n d ;
    e n d ;
    10) 在F o r m 2中添加F o r m 2窗体的O n C r e a t e事件的处理过程如下:
    procedure TForm2.Form2Paint(Sender: TO b j e c t ) ;
    v a r
    Rect: TRect; // 按比例放大后图片区域的大小
    b e g i n
    // 设置预览区I m a g e 1组件的位置和大小
    I m a g e 1 . Top :=0;
    I m a g e 1 . L e f t : = 0 ;
    I m a g e 1 . Wi d t h : = P a g e Wi d t h + 3 0 ;
    I m a g e 1 . H e i g h t : = P a g e H e i g h t + 3 0 ;
    // 在I m a g e 1组件中间画一个页面的示意图
    Image1.Canvas.Pen.Mode := pmWhite;
    I m a g e 1 . C a n v a s . R e c t a n g l e ( 0 , 0 , P a g e Wi d t h + 3 0 , P a g e H e i g h t + 3 0 ) ;
    Image1.Canvas.Pen.Mode := pmBlack;
    I m a g e 1 . C a n v a s . F i l l R e c t ( R e c t ) ;
    I m a g e 1 . C a n v a s . R e c t a n g l e ( 2 0 , 2 0 , P a g e Wi d t h + 2 0 , P a g e H e i g h t + 2 0 ) ;
    Image1.Canvas.Pen.Color := clGray;
    Image1.Canvas.Pen.Mode := pmCopy;
    Image1.Canvas.Pen.Style :=psSolid;
    I m a g e 1 . C a n v a s . R e c t a n g l e ( 1 5 , 1 5 , P a g e Wi d t h + 1 5 , P a g e H e i g h t + 1 5 ) ;
    // 显示图形
    R e c t . L e f t : = 1 5 + F o r m 1 . L e f t M a r g i n ;
    R e c t . To p : = 1 5 + F o r m 1 . To p M a r g i n ;
    R e c t . R i g h t : = ( F o r m 1 . I m a g e 1 . P i c t u r e . Wi d t h*Form1.ZoomScale) div Form1.PreviewScale
    + R e c t . L e f t ;
    R e c t . B o t t o m : = ( F o r m 1 . I m a g e 1 . P i c t u r e . H e i g h t*Form1.ZoomScale) div Form1.PreviewScale
    + R e c t . To p ;
    I m a g e 1 . C a n v a s . S t r e t c h D r a w ( R e c t , F o r m 1 . I m a g e 1 . P i c t u r e . G r a p h i c ) ;
    e n d ;