Mega Code Archive

 
Categories / Delphi / Printing
 

Detecting what direction a printer will rotate for a portrait

Question: Some printers seems to rotate the portrait orientation to achieve a landscape page differently than others. This seems to affect the direction of a rotated font. How can I tell what direction a printer will rotate output on a landscape page, and if landscape mode is available on a given printer? Answer: The following example demonstrates how to call the Windows API function DeviceCapabilities(), to find out how a portrait page is rotated to achieve a landscape page, enabling you to adjust your output accordingly. Generally, a print driver will rotate a landscape page either 90 degrees, or 270 degrees from its portrait orientation. Example: uses Printers; {$IFDEF WIN32} function DeviceCapabilitiesA(pDevice : PAnsiChar; pPort : PAnsiChar; fwCapability : Word; pOutput : PAnsiChar; DevMode : PDeviceModeA): Integer stdcall; external 'winspool.drv' name 'DeviceCapabilitiesA'; function DeviceCapabilitiesW(pDevice : PWideChar; pPort : PWideChar; fwCapability: Word; pOutput: PWideChar; DevMode: PDeviceModeW): Integer stdcall; external 'winspool.drv' name 'DeviceCapabilitiesW'; function DeviceCapabilities(pDevice : PChar; pPort : PChar; fwCapability : Word; pOutput : PChar; DevMode: PDeviceMode): Integer stdcall external 'winspool.drv' name 'DeviceCapabilitiesA'; {$ENDIF} procedure TForm1.Button1Click(Sender: TObject); var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; Rotation : integer; begin if PrintDialog1.Execute then begin {Reset the printer} Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDMode); Rotation := DeviceCapabilities(Device, Port, DC_ORIENTATION, nil, nil); case Rotation of 0 : ShowMessage('This device does not ' + 'support landscape'); 90 : ShowMessage('This device rotates the portrait ' + 'orientation 90 degrees ' + 'to support landscape'); 270 : ShowMessage('This device rotates the portrait ' + 'orientation 270 degrees ' + 'to support landscape'); end; end; end;