      Delphi 

     23 

      

          TTY ()  
- .   ,       ! 
          
        
    .   Microsoft Windows 
        .  
        
      ,     
 . 
        Microsoft Windows   
      .  
" ' "      
.  -         
    ,        . 
       ,    . 
    	        
    	   
    	 
    	DC ( )  
    	     
    	  
    	  
    	16- 32-   
    	    
    	  
    	  TPrinter 
    	  WriteLn 
    	   
    	     
        :  GetDevCaps  De-viceCapabilities 
         DeviceCapabilities 

      

          ,    . 

        

       ,   ,  
, 16-  32-      . 

     TPrinter,  WriteLn    

       TPrinter,  Delphi    
 Windows,      WriteLn,    
   . 

         

      Get-DevCaps  DeviceCapabilities,   
      
    TPrinter. 

      

          . 

       TPrinter 

      ,     TPrinter. 

537

    	  
    	    TPrinter 
    	    
    	  
    	    TPrinter 

        

    Windows GDI (  )   
       - 
. GDI      (Dc)  
  (1).  DC   GDI  
     (., ,   
..),   ^ peJ^afiIJIpOS;OJO^oJacJ_   
_   (   ,    
..).          DC,   
 1 .      ,   
         
    . 
     Delphi        
       TPrinter. TPrinter   
  Windows GDI. Windows GDI  ,  ,  
    .      
,  GDI   L 
       GDI  ,  ,   
          
,          
.	*_ . _........ 
           .  
     , GDI  
 ,       .     
, GDI   ,    . '^,  GDI 
  ,       
.    ,     
,    GDI,        
.  GDI   ,  ,   
   .  ,      
 ,      
 (     ),   
  GDI. 
     ,       ,  
  ,   . ,   Windows,   
 ,      .    
     ,   
  .     , 
    . 
            
.       ,   
Microsoft Windows,  ,   .    
,     ,   . 

    ,     

       Microsoft Windows    
,     ,  ,     ,  
    . 
    -,    ,      , 
 . ,     10 ,  
 ,         
600 dpi. ,      75  4000 dpi 
(  ).        , 
 ,        . , 
      300 dpi. ,    
     Linotronic Imagesetter,  
,        1/3500 . 
    -,    ,     
        
   .      
  ;     , 
  ! ,        
        , -  1/288 
,       - ,  
    65 dpi. 

    538	 VI.   

       ,      
,     .     , 
        
,  ,   . 
      !     
Windows GetDeviceCaps (). 

    Horizontallnch   := GetDeviceCaps(Printer.Canvas.Handle,   LOGPIXELSX); 
Verticallnch        :=  GetDeviceCaps(Printer.Canvas.Handle,   LOGPIXELSY); 

     ,         
(1/72 ).  ,     
,     : 

    var PointsX : double; var PointsY : double; 
          : 
    PointsX   :=  GetDeviceCaps(Printer.Canvas.Handle,   LOGPIXELSX)/72; 
PointsY   :=  GetDeviceCaps(Printer.Canvas.Handle,   LOGPIXELSX)/72; 

     ,    - ,    
  (        !}., 
    ""          
    ,     
      (   ). 

    with  Printer.Canvas	do 
    Rectangle(Round	(PointsX   *   72), 
    Round	(PointsY   *   72), 
    Round	(PointsX   *   216), 
    Round	(PointsY   *   288)); 

     ,     ,   
  ,        
 ,       .   
,        Fax-. 
    extra fine,      
  .	~ 

       

            , 
  Windows.     , , , 
    ,  .     
  ,   ,  ,    . 
            , 
   ,      .  
    ,      . 
    ,   ,    , 
  .     , 
     ,   . ,  
 ,    (  ),    
,       . 
            RGB. 
    ,      . 
  ,     ,   ,  ,   
,   (     ).    
,   . 
           
-,     (CMY). -     
 ,   ,      
       -.  
         
(CMYK),     .     
  ,   ,     
  .  GDI ,     
  ,   ,    
      CMYK.    
    ,     
  (,  Pantone  FocalTone),    
      . 
        ,      
 .  -    ,   
     .     
 ,    ,  
  ,       
  . 

     23.   Delphi	539 

         RGB  . 

    Red	:=	Round(    (   0.3   *   red   )   +   (   0.59   *   green   )   +  
 (   0.11   *   blue   )    ); 
    Green	:=	Red; 
    Blue	:=	Red; 

         ,     
  ,    .    
 ,     . 
       ,   ,  
    .      . 
      ,         
,   GetDeviceCaps ()  . 

    if   (  GetDeviceCaps(Printer.Canvas.Handle,   BITSPIXEL)   * 
    GetDeviceCaps   (Printer.Canvas.Handle,   BITSPIXEL))   >  1  then 
    ItsAColorPrinter   :=  true; if   (GetDeviceCaps(Printer.Canvas.Handle,   
RASTERCAPS)   and 
    RC_PALETTE  =  RC_PALETTE   then 
    ThePrinterSupportsPalette   :=  true; 

        ,      
  PSINSIDEFRAME   ,    
.     PSINSIDEFRAME  
,  ,   .    
,       .    
  .       , 
    ,   Windows 
GetNearestColor (). 
    , ,  .     
   .  -     
   ,   ,      
     .      
,       ,  . 
     .     
   8x8 .     
  ,        
   .         
  ,      . 

     

        ,    .  
,        ,  
 .  ,        
   . 
             
  TrueType.       ,   
  ,     GDI,      
 .  ,       
Adobe ATM,         ,    
    . 
      FontDialog Delphi      TrueType, 
  f dTrueType-Only.       
        ,  
 .     ,     
  Fonts  TScreen  TPrinter,      
 . 
     ,   ,     
  Delphi,      --,  
      .    
  Delphi 1.0       Delphi 2.O.  Delphi 3.0 
 , ,  .     
,        
   . 

    Jointer.Canvas.Font.PixelsPerlnch   := GetDeviceCaps(Printer.Canvas.Handle, 
    LOGPIXELSY) ; 

    3io        
,     size. ,   size 
     ,   height 
    .   size  height  
 ,   GDI      
 .    ,   
 __ "" (    ),   
        
.        , 
   . 

    540	 VI.   

             20%. 
      6 .     
 ,    10     , 
 12 . 
         ,      
 (   ).  ,    , 
        .  
   .      ,  
,         ,   
    .      
 "",    . 
        .    
   .      
.      ,    
     .    
   .     Windows SetTextAtign'OT"" 
     SetTextAlign ()      
,    .    ,  
 .      
TA_BASELINE, _  __,     TA_CENTER, TA_LEFT  
TA_RIGHT.    (TA_UPDATECP  TA_NOUPDATECP) ,  
   .  TA_NOUPDATECP   
,  _       , ,   
   .      
    ,     
   ,        . 
           
 ,             
   . 

    var  OldTextAlign   :   integer; begin 
    OldTextAlign   :=   SetTextAlign(Printer.Canvas.Handle, 
    TA_LEFT   or  TA_BASELINE   or  TA_NOUPDATECP); 
    { -     } 
    SetTextAlign(Printer.Canvas.Handle,OldTextAlign); end; 


       

     ,  DC ( )   
  DC .      
  DC  ,   ,  
      . -, , ,   
    ,       
.           ( 
 ).       
  BitBlts ()   ROP-. ROP- ( 
 )       
,   .      
SRCCOPY ( ), WHITENESS ( )  BLACKNESS 
( ). :  ,   , 
  .  ,      
   .     
  ,  !  ( , 
bits-block-transfer    .  . .) 
        ,    
Windows     . ,  
     -   
        . 
     .  DC ,   ,   
 DC ,       
 . DC     " (read only) 
         ,   . 
    (    ..)  ,   
 ,    (1),   Windows 
Createlc ().	-...-. ._., 

         

    ,    ,       Windows.  
   "",    
 . 

      

          750   . 
 32- GDI       
,     ,  . :   
  ,   . 

     23.   Delphi	541 


      

     16-  Windows      
  . , -,     
    (heap) GDI.       
         GDI. 
 Windows 95     ,   NT    . 

    16-  32-   

        16-,  32-   ,  
!       ,   : Windows 95 
       "", 
 32-    16-  , 
 .   32-     
 Windows LoadLibrary ()  .    
16-     LoadLibrary ()   
32-  .  ^  Windows   
  (DLL),     , . 
  ,   ,    
16- Windows,       32- Windows. 

        

          ,   .  
       .   
    Microsoft   . 
  ,    ,  
   ,       
 (portrait)   (landscape).     
  ,       
 ?      .    
         
(    ).      
  .     ,    
;,    ,     
]?^    .  ,   
    ,  ,   " 
     ,     
    .     
 . 
           .  
 . 
           .  
    ,  ,     
,              
 . 

        

         ,     
   .      Delphi  
TPrinter      ,    
 ,      . 
      . 
    | I 

     TPrinter 

    Delphi    TPrinter   Windows.  
,   VCL-,    
  . 
    -   Windows      . 
  -  ,      
  WIN.INI         
     .     
    Windows 3.1    
   .  TPrinter  Delphi      
,        ! 

      TPrinter 

         TPrinter,   
 Printers   uses     ,  
   .       
  Tprinter:  TPrinter    
        Wr 
    iteLn (),  TPrinter     VCL-  
   GDI- Windows.

    542	 VI.   


     Writel_n() 

            WriteLn(). 
    DOS,       
,       .  
Delphi   WriteLn (),      Windows  
    , ,    
 . 
      WriteLn ()       
  ,    DOS.  ,    ,    
 ,        
 . 
      WriteLn (}  ,     
  DOS:    ,   , 
 - ,      .   
,   ,     .   ,   
 WriteLn ()   ""  ,  Printers 
  Windows_GDI TextOut ().     ,   
     ,       
    (  .-,, 
Mejjgj  ^  -^?.   ;  ,: 
    WriteLn ()     
    . 
         WriteLn ()    
       . 

    uses Printers; 
    var 
    MyFile:   TextFile; begin 
    AssignPrn(MyFile);	 
    Rewrite(MyFile); 
    WriteLn(MyFile,    'Hello  World!'); 
    System.CloseFile(MyFile); end; 

     ,     ,    
 WriteLn (),     . 

    Printer.Canvas.Font.Name   :=   'Courier  New'; Printer.Canvas.Font.Style  
 :=   [fsBold]; Printer.Canvas.Font.PixelsPerlnch   := 
    GetDeviceCaps(Printer.Canvas.Handle,   LOGPIXELSY); WriteLn(MyFile,    
'Hello  World!'); 

        WriteLn ()    ,  
        .  
    ,     
 .    ,    
 .      ^, 
  Write ()  WriteLn ().  Write ()  
',        ,   
    .    Write () 
    ;  . 
      Write ()  WriteLn ()  TPrTnter  
  ,     . 
      ~       
 NewPage  TPrinter.    
_\}... ,    
TPrinter      ,     
 PrnRec: 

    type 
    PrnRec = record 
    case Integer of 1:   ( 
    Cur : TPoint; Finish : TPoint; Height : Integer); 2:   ( 
    Tmp: array[1..(sizeof(integer)*8)] of Char); end; 


     23.   Delphi	543 

       : 

    PrnRec(TTextRec(MyFile).UserData).Cur.x   :=  SomeXValue; 
PrnRec(TTextRec(MyFile).UserData).Cur.y   :=  SomeYValue; 

          NewPage  TPrinter (  
  Cur.x  Cur.y). 
     , ,  ,  Cur   PrnRec  
      .  Finish   
      ,   Height  
   .  Height ,   
Write ()   Height    . 
    ,     ""    ,  , 
,     Write ()  WriteLn (),   ,  
-, .    TextOut    
       ,     ! 
  ,  ,   ,    
TPrinter,  BeginDoc, NewPage  EndDoc. 

       

           Delphi,    
     ,    
 TPrinter,  BeginDoc, NewPage  EndDoc.     
,    NewPage.  EndDoc   
 . 
       . 

    Printer.BeginDoc; 
    Printer.Canvas.TextOut(20,20, 'A line of text - page 1'); 
    Printer.NewPage; 
    Printer.Canvas.TextOut(20,20, 'A line of text - page 2'); 
    Printer.EndDoc; 


      :     

          (    ). 
      ,    
Printer. Printers,        Printer. 
Printerlndex.         , 
  Printer. Printerlndex,      
    Windows,   Printer.Printerlndex -1. 
         ListBox    
  ListBox  . 

    ListBox.Item	:=  Printer.Printers; ListBox.Itemlndex   :=  Printer.Printerlndex; 

     ,     TPrinterDialog  
TPrinterSetupDialog    ,     : 

    PrintDialogl.Execute; 

     PrinterSetupDialogl.Execute; 

    ,  .      , 
   TPrinterDialog;       
       TPrinterSetupDialog. 
         
   . 
     TPrinter          
GetPrinter  SetPrinter.       ,  
 .        
      ,    
 , 

    544	 VI.   

          Windows     
         .   
         
DevMode     ,    , 
   .        
   ,       

    GetPrinter. 
    var 
    Device   :   array[0...cchDeviceName-1]   of Char; Driver   :   
array[0..(MAX_PATH-1)]   of  Char; Port        :   array[0..32]   of  Char; 
hDMode   :   THandle; begin 
    Printer.GetPrinter(Device, Driver, Port, hDMode); 
    Labell.Caption   :=   Device; Label2.Caption   :=  Driver; Labels.Caption  
 :=   Portend; 

             
, ,       DevMode.  
  GetPrinter ()     ,    
 .         . 
    ,  jibi   ,       
   ,  MeTOO^eTFrinter  . 

    Printer.SetPrinter('HPLJ-IID', 'HPPCL', 'FILE:', 0) ; 

    ,     DevMode   .    
 _   DevMode,      
 .  ,    ,   
   Windows,     TPrinter,  
  ,   . 

    Printer.SetPrinter('SOMEDRV', 
    'C:\SOMEDIR\SOMEDRV, 
    'FILE:', 
    0); 

       ,        
     Windows.      
   .       ,  
  . 
            
  DevMode.  DevMode    
    GetPrinter  TPrinter.    
 DevMode,    Windows Global Lock (),  
    ,      
-  . 
     DevMode     .   
    ,     
 .      DevMode. dmSize, 
       DevMode,    
     DevMode    
DevMode. dmDriverExtra.    "    
 DevMode,     ,  (DevMode . 
dmSize + DevMode.dmDriverExtra). 
      DevMode      . 

    dmDeviceName	{ } 
    dmSpecVersion	{  Windows,  } 
    dmDriverVersion	{  } 
    dmSize	{    DevMode} 
    dmDriverExtra	{    DevMode} 
    dmFields	{    DevMode} 


     23.   Delphi	545 
    18  Delphi 3.   


    dmOrientation	{ } 
    dmPaperSize	{    ,   
 	} 
    dmPaperLenght	{      } 
    dmPaperWidth	{      } 
    dmS   1 	{ } 
    dmCopies	{  } 
    dmDefaultSource	{  } 
    dmPrintQuality	{      } 
    dmColor	{   } 
    dmDuplex	{   } 
    dmYResolution	{     ,  dmPrintQuality>0} 

    16-  32-  Windows     
   DevMode,        
. -,     ,  ,   
  ,       . 
         DevMode,    
 ,        
dmFields,     ,   . 
    . 

    DevMode.dmPaperSize   :=   DMPAPER_LEGAL; 
    DevMode.dmFields	:=  DevMode.dmFields  or  DM_PAPERSIZE; 

           DevMode. 

    var 
    Device   :   array[0...cchDeviceName-1]   of Char; Driver   :   
array[0..(MAX_PATH-1)]   of  Char; Port   :   array[0..32]   of  Char; hDMode  
 :   THandle; pDMode   :   PDevMode; begin 
    Printer.Printerlndex^x:=  Printer.PrinterIndex; Printer.GetPrinter(Device, 
  Driver,    Port,   hDMode); if hDMode  <>  0  then begin 
    pDMode   :=  GlobalLock(hDMode); if pDMode  <>  nil  then begin 
pDModeA.dmCopies   :=  5; 
    pDMode'4 .dmFields   :=  pDMode'4. dmFields   or   DM_COPIES; 
Globa_lUnloc_k (hDMode} ; 
    "PrTnter.PrinterIndex:=  Printer.PrinterIndex; end; end; 
    Printer.BeginDoc ; 
    Printer.Canvas.TextOut(100,   100,    'Test   1'); Printer.EndDoc; end; 

          , , 
        DevMode.    
  .    GetPrinter , 
      DevMode, ,  
,      .    
     . ,    
      .  ,    
     . 
     , , ,       
, ~ .        
        TPrinter.  
 ,       
        Print Manager  
   .   
   ,    Windows 3.1  .   
    ,    , 
        Windows GDI   
,       DevMode   
. "" ( ,   ,  
)  ,    , ,  ,  
      ,    . 

    546	 VI.   

         TPrinter, , -,   
    VCL Delphi.      
16-  32- , 16-    VCL 
  RAD-  Borland.  Delphi 2.0   VCL 
   Delphi 2.0 Developer   Delphi 2.0 Client/Server Suite. 
       .    ,   
  ,        
,        Windows GDI ResetDc 
(). O^HKima_ResetDc ()     , a Delphi  
 ,   .        
  ",  1-Ÿ""  . 
-,       ,    
   Delphi        
TPrinter.    : TPrinter     
     ,    ,    
   .        
  .      
     VCL     
  TPrinter. 
        TPrinter,     
,    , ! 
             , 
      .     
,       (nil),  
 uses   implementation  TPrinter     
,         Tprinter,  
  uses     ,   
   . 
     , -,      Delphi \SOURCE\  
  PATCHED , -,  PRINTERS . PAS   
Delphi SOURCEWCL   SOURCE\PATCHED. 
         Delphi SOURCE\PATCHED,   
PRNPAGE.PAS.        . 

    unit PrnPage; interface 
    {$IFDEF Win32} 
    uses Windows; 
    {$ELSE} 
    uses WinTypes; 
    const MAX_PATH = 144; 
    {$EDNIF} 
    procedure JobStart; 
    var PageProc : procedure(DC : HOC; DeviceMode : THandle); 
    implementation 
    uses Printers; 
    procedure JobStart; var 
    Device : array[0..cchDeviceName-1] of Char; 
    Driver : array[0..(MAX_PATH-1)] of Char; 
    Port : array[0..32] of Char; 
    hDMode : THandle; begin 
    if SPageProc = nil then exit; 
    Printer.Printerlndex := Printer.Printerlndex; 
    Printer.GetPrinter(Device, Driver, Port, hDMode); 
    if hDMode <> 0 then begin PageProc(0, hDMode); Printer.Printerlndex := Printer.Printerlndex; 
    end; end; 
    begin 
    @PageProc := nil; end. 


     23.   Delphi	547 

         ,   
    " "   TPrinter. 
  PageProc   nil,   
 ,  ,       ,  
   . 
         JobStart ().     
   ,        
 DevMode     . JobStart ()  
   ,      
DevMode  . 
          PrnPage,  
   TPrinter.   PRINTERS. PAS   Delphi 
SOURCE\PATCHED   PrnPage   uses     
PRINTERS . PAS  . 

    implementation 
    uses  Consts,   PrnPage; 

        PRINTERS. PAS,    : 

    StartPage(DC); 

          ,  
  StartPage (Dc)   PRINTERS.PAS. 

    if  @PrnPage.PageProc  <>  nil   then 
    PrnPage.PageProc(DC,   DeviceMode); 

      ,     ,    
BeginDoc  NewPage. ,   ,   TPrinter 
""         , 
      DevMode. 
     ,     Delphi SOURCE\PATCHED _ 
 ,     Delphi Tools^Options.   
 Library         
Library Path (       Delphi): 

    :\Borland\Delphi2.0\Source\Patched; 

           Delphi. 
    ,       build all,   
   . ,      
,   PrnPage    Printers   uses 
  ,       . 

    implementation 
    {$IFDEF Win32} 
    uses  Printers,   PrnPage; {$ELSE} 
    uses  Print,   Printers,   PrnPage; {$ENDIF} 

         ,  , 
    . 

    procedure ThePageProc(DC : HOC; 
    hDMode : THandle) ; var 
    pDMode : pDevMode; begin 
    if hDMode = 0 then exit; 
    pDMode := GlobalLock(hDMode); 
    if pDMode = nil then exit; 
    pDMode'^ . dmCopies    := 3; 
    pDMode^dmPaperSize := DMPAPER_LEGAL; 
    pDModeA.dmFields    := pDModeA . dmFields or DM__COPIES; 
    pDMode".drnFields    := pDModeA.dmFields or DM_PAPERSIZE; 
    if DC <> 0 then 
    {$IFDEF Win32} 
    ResetDc(DC, pDMode"); 
    {$ELSE} 


    548	 VI.   


    ResetDc(DC,   pDMode); {$ENDIF} 
    GlobalUnlock(hDMode) ; end; 

            ,  
  PageProc   PrnPage     
,     .      
 . 

    @PrnPage.PageProc   :=  @ThePageProc; 
    , ,   TPrinter     
PageProc  ,       . 
       . 
    @PrnPage.PageProc   :=  @ThePageProc; 
    JobStart; 
    Printer.BeginDoc; 
    Windows.TextOut(Printer.Canvas.Handle, 
    100, 100, 
    'Test1, 
    4); 
    Printer.EndDoc; @PrnPage.PageProc := nil; 

     ,       
 PageProc  PrnPage  nil. 
     ,       ?   ,  
          
        ,  
      ! 

    implementation 
    {$IFDEF Win32} 
    uses Printers, PrnPage; 
    {$ELSE} 
    uses Print, Printers, PrnPage; 
    type ShortString = string; 
    {$ENDIF} 
    var 
    PrintSeparatePages : bool; CurrentPage : integer; LastPage : integer; 
    procedure ThePageProc(DC : HOC; 
    hDMode : THandle); {$IFDEF Win32} 
    far; 
    {$ENDIF} var 
    pDMode : PDevMode; begin 
    if hDMode = 0 then exit; pDMode := GlobalLock(hDMode); if pDMode = nil 
then exit; 
    if odd(CurrentPage) then begin 
    pDMode.dmCopies    := 3; 
    pDMode^.dmPaperSize := DMPAPER_LEGAL; end else begin 
    pDMode^.dmCopies    := 2; 
    pDMode^.dmPaperSize := DMPAPER_LETTER; end; 
    pDMode.dmFields := pDMode".dmFields or DM_COPIES; pDMode".dmFields := 
pDMode.dmFieIds or DM_PAPERSIZE; 


     23.   Delphi	549 


    if DC <> 0 then 
    {$IFDEF Win32} 
    if ResetDcfDC, pDMode'4)  0 then 
    {$ELSE} 
    if ResetDc(DC, pDMode) <> 0 then 
    {$ENDIF} 
    PrintSeparatePages := false; GlobalUnlock(hDMode); end; 
    procedure TForml.ButtonlClick(Sender : TObject); var 
    s : ShortString; begin 
    PrinterSeparatePages := True; CurrentPage := 1; LastPage := 3; 
    SPrnPage.PageProc := @ThePageProc; while CurrentPage <= LastPage do begin 
if PrintSeparatePages then begin JobStart; Printer.BeginDoc; end; 
    Str(CurrentPage, s); s := 'Printing Page ' + s; s[Length(s) + I] := #0; 
TextOut(Printer.Canvas.Handle, 100, 100, @s[l], Length (s)); Inc(CurrentPage}; 
    if CurrentPage <= LastPage then begin if PrintSeparatePages then 
    Printer.EndDoc; else 
    Printer.NewPage; end; end; 
    Printer.EndDoc; SPrnPage.PageProc := nil; end ; 

              
            
 Letter. ,   ,     
     ,    
 ,       
 .   ,    VCL    
   " ".     
   Windows GDI,   .  , 
,     (,   ..)   
,      (   ). 

     :  GetDevCaps()  DeviceCapabilitiesO 

        Windows GetDeviceCaps ()   
  .   ,   
GetDeviceCaps ()   ,    Win32  
 Delphi.      16-  32-  
Windows,   ,    32-    
16-  Windows.  , ,     
   .  ,    
   ,  ,     
;   ,   ,     
   -1,  ,      .  
   :      
RASTERPRINTER,       ,   
RasterCaps  , , ,    
StretchBlt  StretchDib  

    550	 VI.   

     ,       .   
  ,         
,    , ..,     
  ,  - 
     (GDH iy^ieT   
 ^_). 
        ,      
 .        (, 
,    TTY),     
.        
RC_BITBLT    . ,    
  , ,     
RASTERCAPS RC_NONE(0x0000). 

    if   (GetDeviceCaps(Printer.Canvas.Handle,   RASTERCAPS)   and RC_NONE)    
=   RC_NONE   then This_Is_A_Text_Only_Printer   :=  true; 

            
    De-viceCapabilities.   Delphi 1.0  3 
  ,  Delphi 2.0    - 
   Microsoft MSDN Knowledgebase    
Microsoft Win32.    ,    Microsoft  , 
     . 
    -,   ,     
DeviceCapabilitiesEx ().  .   DeviceCapabilities  . 
      Delphi 2.0,     
   DeviceCapabilities ().       
VCL,         WINDOWS. PAS.  
 , ,    ,    
  TPrinter.   WINDOWS. PAS   Delphi 
\50trkCETRTTL\WIN\   SOURCE\PATCHED\    .	,
    Ƹ^^!    implementation  WINDOWS . 
PAS,    SOURCE\PATCHED\. 

    function  DeviceCapabilitiesA;	external  gdi32  name	'DeviceCapabilitiesA'; 
    function  DeviceCapabilitiesW;	external   gdi32  name	'DeviceCapabilitiesW'; 
    function  DeviceCapabilities;	external   gdi32   name	'DeviceCapabilitiesA'; 
      ,     . 
    function	DeviceCapabilitiesA;   external   'winspool.drv'   name 
    4>	'DeviceCapabilitiesA'; 
    function	DeviceCapabilitiesW;   external   'winspool.drv'   name 
    4>	'DeviceCapabilitiesW'; 
    function	DeviceCapabilities;   external   'winspool.drv'   name 
    "	'DeviceCapabilitiesA'; 


     DeviceCapabilities() 

         ,    
     ,   
DeviceCapabilities (). 

    var 
    Device : array! 0..cchDeviceName  1 ] of Char; Driver : array[ 
0..(MAX_PATH - 1) ] of Char; Port : array[ 0..32 ] of Char; hDMode : THandle; 
pDMode : PDevMode; NumOfCopiesPossible : integer; begin 
    Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 then begin 
    pDMode := GlobalLock(hDMode); if pDMode <> nil then begin 
NumOfCopiesPossible := 
    DeviceCapabilities(Device, Port, DC_COPIES, nil, pDMode); 
GlobalUnlock(hDMode); end; end; end; 

     23.   Delphi	551 

       ,       
,   DeviceCapa-bilities().    
   ,      
.      ,  
 Win32   Delphi.      : 
         , 
  .     
DeviceCapabilities ()    .      
 ,   ,      
 .      DC_PAPERNAMES.  
  DeviceCapabilities ()       
,  DeviceCapabilities ()     
 ,  .     
          
 DeviceCapabilities (),         
       . 

    type TPaperName  =  array[0..63]   of  char; 
    type  TPaperNames  = array[0..0]   of TPaperName; 
    type   PPaperName  =   TPaperNames; 
    procedure TForml .ButtonlClick (Sender : Tobject) ; 
    var 
    Device	array [0 .. cchDeviceName -1] of Char; 
    Driver	array[0. . (MAX PATH-1}] of Char; 
    Port	array[0..32] of Char; 
    hDMode	THandle; 
    pDMode	PDevMode; 
    pPapers	PPaperName; 
    NumPapers : integer; 
    i   :   integer; begin 
    Printer.GetPrinter(Device,   Driver,   Port,   hDMode); if  hDMode  <>   0 
  then begin 
    pDMode   :=  GlobalLock(hDMode); if pDMode  <>  nil  then begin NumPapers  
 := 
    DeviceCapabilities(Device,   Port,   DC_PAPERNAMES, 
    nil,   pDMode); if NumPapers  >  0  then begin 
    GetMem(pPapers,   NumPapers   *   sizeof (TPaperName}); 
DeviceCapabilities(Device,   Port,   DC_PAPERNAMES, 
    PCHAR(pPapers),   pDMode); for   i   :=   0   to   (NumPapers    1}   do Memol.Lines.Add([i]); 
    FreeMem(pPapers,   NumPapers   *   sizeof(TPaperName)); end; 
    GlobalUnlock(hDMode); end; end; end; 

          TPaperName,    
 ,   ,  63     
 .     TPaperNames,  
     TPaperName.   TPaperNames 
       PaperName.   
        
    .  ,    
   Paper-Name   PPaperNames. 
         DeviceCapabilities  ,   
    (nil),      
  .   ,    . 
            
  DeviceCapabilities ,     
           
,    PChar (  ). 
          ,   
         memo 
  .        
,   ,    ,   
 .         
,      ,   

    552	 VI.   

       . ^        
 ,        
        ,     
      ,    . 
        . 
        :      
16-  Windows    LoadLibrary,   
   ,  ,      32- 
 Windows.      ,  
-   .       
LoadLibrary,   Windows 95  32-   
   16-  ,      
 16- DLL  32- .  Windows  
 . 

       

        Windows   (escapes)  
      ,     
   .        
,   ,     . 
   ^^     GDI, 
     .     
  ,    ;    
-'      ,    . 
         ,   
   (SETABORTPROC, ̨7  
ABORTDOC),        
.           
 ,       . 
      QUERYESCSUPPORT,  
,  ,     . 
        Windows GDI Escape (), GDI    
      Control (),  
   .    GDI   
"" ,     .  GDI  
 ,   .     
     NEWFRAME.  32- -auTWindows 
GDI  "    ",     
  . 
     ,   GDI,      
.  ,          
.      Escape  ,  
      ( ).   ,  
     ,     . 

    var 
    Testlnt    : integer; PageMargin : TPOINT; begin	"""  '  """ PageMargin.x 
,:= 0; PageMargin. := 0; Testlnt := GETPRINTINGOFFSET; if 
Escape(Printer.Canvas.Handle, QUERYESCSUPPORT, sizeof(testin), OTestlnt, nil) 
= 0 then 
    ShowMessage('Escape is not implemented') else begin 
    if Escape(Printer.Canvas.Handle, GETPRINTINGOFFSET, 0, 
    nil, 
    @PageMargin) <= 0 then begin PageMargin.x := 0; PageMargin. : = 0; end; 
end; end; 


     23.   Delphi	553 

     : 32-  Windows    
ExtEscape (),      GDI,  
 Escape. Windows GDI      "", 
   ,   GDI   Escape,   
""     ,      
 ( ).    Escape   GDI,  
  ,     . 
 , ,   16-   32- 
      ,    16  
 .   ,       , 
    ,   !  GDI  
  ""     ,     
    .      Escape, 
   ,    (16-  32-), 
    .   ExtEscape ()    
,     .    
  Escape,   ,      . 

      :     TPrinter 

          Canvas    
    ,    
,      Windows GDI     
   .     Canvas . 
Handle  TPrinter.     Windows  
 ,       ,  
._ DC.   ,     BeginDoc 
 TPrinter (  AssignPrn  Rewrite ),   
  . 

        

          TPrinter    
    Windows.   ,    
   ,   ,     
  . 
      .     ,  
     .   
  ,         .  
        ,  
   Windows.       Aborted, 
     .  ,    
    . 
     ,      ,   
 ,     .     
   TImage,       
 .          
,   ,     Printing,  
,     . 
         .    
   DC   ,   DC 
. ,      -  
 (DIB),     DIB  .     
  ,    .  ,   
     VCL.    
 memo  grid,    -    
   ,     . 

      

      ,       ,   
   . 
            
   ,     ,   
     Windows.       
  ,          
     .    , 
   MANUALS. TXT (  Delphi), .   
.    ,     , 
 "    ,     
        DIB 
(-  ). 

    554	 VI.   

     ,   ,     
.    ,  ,  
          
,      .    
   256 ,  24- DIB,  
   256- DIB.   ,   
 ,       
   .     , 
    (    )  
    . :      
 ,  ,       .  
       ,    
   .          
     ,     
Application. ProcessMessages,     ,   
  .	-  

    uses Printers; 
    procedure TForml.ButtonlClick( Sender : Tobject); var 
    dc : HOC; 
    isSrcDcPalDevice : BOOL; 
    isPrnDcPalDevice : BOOL; 
    MemDc : hdc; 
    MemBitmap : hBitmap; 
    OldMemBitmap : hBitmap; 
    hDibHeader : Thandle; 
    pDibHeader : pointer; 
    hBits : Thandle; 
    pBits : pointer; 
    Testlnt : integer; 
    PageWidth : integer; 
    PageHeight : integer; 
    PageMargin : TPoint; 
    ImagablePageWidth : integer; 
    ImagablePageHeight : integer; 
    OffsetX : integer; 
    OffsetY : integer; 
    ScaleX : integer; 
    ScaleY : integer; 
    ppal : PLOGPALETTE; 
    pal : hPalette; 
    OldPal : hPalette; 
    i : integer; begin 
    {   . } Application.ProcessMessages; 
    {     } {     
. } dc := GetDc(0); 
    {    . } MemDc := CreateCompatibleDc(dc,); 
    {    . } MemBitmap := CreateCompatibleBitmap(Dc, 
    forml.width, 
    frml.height); 
    {       . } 
OldMemBitmap := SelectObject(MemDc, MemBitmap); 
    {   ,   . } pPal := nil; Pal := 
0; OldPal := 0; 


     23.   Delphi	555 


    IsSrcDcPalDevice := false; if GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE 
= RC_PALETTE then begin GetMemtpPal, sizeof(TLOGPALETTE) + (255 * 
sizeof(TPALETTEENTRY))); FillChar(!, sizeof(TLOGPALETTE) + 
    (255 * sizeof(TPALETTEENTRY)), #0); 1.11 := $300; 
!.palNumEntries := 
    GetSystemPaletteEntries(dc, 0, 
    256, 
    !.palPalEntry); 
    if !.PalNumEntries <> 0 then begin pal := CreatePalette(pPalA); 
    OldPal := SelectPalette(MemDc, Pal, false); isSrcDcPalDevice := true; end else 
    FreeMem(pPal, sizeof(TLOGPALETTE) + 
    (255 * sizeof(TPALETTEENTRY))); end; 
    {    . } BitBlt(MemDc, 
    , , 
    forml.width, forml.height, 
    Dc, 
    forml.left, forml.top, 
    SrcCopy); if isSrcDcPalDevice = true then 
    SelectPalette(MemDc, OldPal, false); 
    {      . } SelectObject(MemDc, OldMemBitmap); 
    {    . } DeleteDc(MemDc); 
    {     DIB. } hDibHeader := GlobalAlloc(GHND, 
    sizeof(TBITMAPINFO) + 
    (sizeof(TRGBQUAD) * 256)); 
    {     . } pDibHeader := GlobalLock(hDibHeader); 
    {   DIB ,    . } FillChar(pDibHeader^, 
    sizeof(TBITMAPINFO) + (sizeof(TRGBQUAD) * 256)), 
    #0); PBITMAPINFOHEADER(pDibHeader)^.biSize := 
    sizeof(TBITMAPINFOHEADER); 
    PBITMAPINFOHEADER(pDibHeader).biPlanes := 1; if isSrcDcPalDevice then 
    PBITMAPINFOHEADER(pDibHeader)^biBitCount := 8 else 
    PBITMAPINFOHEADER(pDibHeader)A.biBitCount := 24; 
PBITMAPINFOHEADER(pDibHeader)".biWidth := forml.width; 
PBITMAPINFOHEADER(pDibHeader)-^.biHeight := forml.height; 
PBITMAPINFOHEADER(pDibHeader).biCompression := BI_RGB; 
    { ,      . } GetDIBits(dc, 
    MemBitmap, 
    , 
    forml.height, 


    556	 VI.   


    nil, 
    TBitmapInfotpDitoHeader^), 
    DIB__RGB_COLORS) ; 
    {    . } hBits := GlobalAlloc(GHND, 
    PBitmapInfoHeader(pDibHeader).BiSizelmage); 
    (     . } pBits := GlobalLock(hBits); 
    {  . } GetDIBits(dc, 
    MemBitmap, 
    0, 
    forml.height, 
    pBits, 
    PBitmapInf(pDibHeader), 
    DIB_RGB_COLORS); 
    {    ,    DIB. } if 
isSrcDcPalDevice = true then begin 
    for i := 0 to (!.PalNumEntries  1) do begin 
    PBitmapInfo(pDibHeader).bmiColors[i].rgbRed := 
    pPal^.palPalEntry[i].peRed; PBitmapInfo(pDibHeader).bmiColors[i].rgbGreen := 
    pPalA.palPalEntry[i].peGreen; 
PBitmapInfo(pDibHeader).bmiColors[i].rgbBlue := 
    !.palPalEntry[i].peBlue; end; FreeMemfpPal, sizeof(TLOGPALETTE) + 
    (255 * sizeof(TPALETTEENTRY))); end; 
    {    . } ReleaseDc(0, dc); 
    (     . } DeleteObject(MemBitmap); 
    {  . } Printer.BeginDoc; 
    {    ,  . } 
    isPrnDcPalDevice := false; 
    if ( (isSrcDcPalDevice = true) and 
    (GetDeviceCaps(Printer.Canvas.Handle, RASTERCAPS) and RC_PALETTE = 
RC_PALETTE)) then begin 
    OldPal := SelectPalette(Printer.Canvas.Handle, Pal, false); 
isPrnDcPalDevice := true; end; 
    {      . } PageWidth  := 
GetDeviceCaps(Printer.Canvas.Handle, HORZRES); PageHeight := 
GetDeviceCaps(Printer.Canvas.Handle, VERTRES); 
    {   . } PageMargin.x := 0; PageMargin.y := 0; 
Testlnt := GETPRINTINGOFFSET; if Escape(Printer.Canvas.Handle, 
    QUERYESCSUPPORT, 
    sizeof(testint), 
    STestlnt, 
    nil) <> 0 then begin 


     23.   Delphi 557 


    if Escape(Printer.Canvas.Handle, GETPRINTINGOFFSET, 0, 
    nil, 
    @PageMargin) <= 0 then begin PageMargin.x := 0; PageMargin.y := 0; end; end; 
    {     . } ImagablePageWidth  := 
PageWidth   (2 * PageMargin.x)); ImagablePageHeight := PageHeight  (2 * PageMargin.y); 
    {   . } if (((ImagablePageWidth <= 
ImagablePageHeight) and (Forml.Width >= Forml.Height)) or ((ImagablePageWidth 
> ImagablePageHeight) and (Forml.Height < Forml.Width))) then begin ScaleX := ImagablePageWidth; 
    ScaleY := Trunc(Forml.Height * (ImagablePageWidth/Forml.Width)); OffsetX 
:= PageMargin.x; 
    OffsetY := (PageHeight div 2) - (ScaleY div 2); end else begin 
    ScaleX := Trunc(Forml.Width * (ImagablePageHeight/Forml.Height)) ScaleY := ImagablePageHeight; 
    OffsetX := (PageWidth div 2) - (ScaleX div 2); OffsetY := PageMargin.y; end; 
    {     . } 
StretchDiBits(Printer.Canvas.Handle, ~~- offsetx, 
    OffsetY, 
    ScaleX, 
    ScaleY, 
    0, 0, 
    Forml.Width, 
    Forml.Height, 
    pBits, 
    pBitmapInfo(pDibHeader)A, 
    DIB_RGB_COLORS, 
    SRCCOPY) ; 
    {    ,  . } if isPrnDcPalDevice = 
true then 
    SelectPalette(Printer.Canvas.Handle, OldPal, false); 
    if isSrcDcPalDevice = true then DeleteObject(Pal); 
    {   . } GlobalUnlock(hBits); GlobalFree(hBits); 
GlobalUnlock(hDibHeader); GlobalFree(hDibHeader); 
    {  . } 
    Printer. EndDoc;	>. 
    end; 

     ,      ,  , 
      .  ,  
          
           
 ,     DC . 

    558	 VI.   


       TPrinter 

      ,   ,      
   .      
         
   (Print Manager).    ,  
  .      ,    
       .   
   ,     ( 
  )  . 
              
      ,     
.     ,    . 
       ,    . 
       TextBand ,   
  ,  GraphicsBand     . 
      ,    
      ,      (i 
..  ,     ). 
       DC    GDI   
 . ,       
  . ,       
TPrinter,  ,      ,   
        . 

     

    ,       ,    
 .         
   , ,       ,   
,    ,   .    .   
      ,  -  
 ,   ,    ,  
,      . 
               
   .     
 (  ).  99% ,    ,  
 ,    ,       
    . 

     23.   Delphi	559 

