Subject: kevin corazza
Posted By: kevincorazza Post Date: 10/2/2006 10:05:23 AM
Name: Kevin R. Corazza

Birthdate: March 10, 1983

Education: Graduated from Columbia College [Chicago] in 2005 with a BA in Film/Video.  Currently enrolled in the MS program for Cosmology at UIC campus.  Projected graduation date:  [December, 2010].

Bio: Currently employed by the Rod Blagojevich administration.  Volunteers as a facilitator for the loop chapter of the progressive group, Democracy For America.


Kevin Corazza wrote:
>
> How can I print, on my form, a text with vertical orientation ?
> Thank you.
>
> Kevin Corazza
> Sierra Informatica
> mailto:kcorazza@sierrasoft.com

Here is some code ot get you started....

Rotating fonts is a straigforward process, so long as the Windows font
mapper
can supply a rotated font based on the font you request. Using a
TrueType font
virturally guarentees success.

Here is an example of creating a font that is rotated 45 degrees:

procedure TForm1.Button1Click(Sender: TObject);
var
  lf : TLogFont;
  tf : TFont;
begin
  with Form1.Canvas do begin
    Font.Name := 'Arial';
    Font.Size := 24;
    tf := TFont.Create;
    tf.Assign(Font);
    GetObject(tf.Handle, sizeof(lf), @lf);
    lf.lfEscapement := 450;
    lf.lfOrientation := 450;
    tf.Handle := CreateFontIndirect(lf);
    Font.Assign(tf);
    tf.Free;
    TextOut(20, Height div 2, 'Rotated Text!');
  end;
end;


Q) How can I reliably rotate a font on a printer?

A) Here is some code that will reliably rotate fonts on any printer
providing the
printer supports rotating fonts, and the font is a TrueType or other
rotatable font.

Example:

procedure TForm1.Button1Click(Sender: TObject);
var
  lf : TLogFont;
  OldFont : hFont;
  NewFont : hFont;
begin
  Printer.BeginDoc;
  Printer.Canvas.Font.Name := 'Arial';
  Printer.Canvas.Font.Size := 24;
  Printer.Canvas.Font.PixelsPerInch:=
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY);
  GetObject(Printer.Canvas.Font.Handle, sizeof(lf), @lf);
  lf.lfEscapement := 450;
  lf.lfOrientation := 450;
 {Check here that lf is properly filled out!}
  NewFont := CreateFontIndirect(lf);
  OldFont := SelectObject(Printer.Canvas.Handle, NewFont);
  Windows.TextOut(Printer.Canvas.Handle,
                  200, 200, 'Rotated Text!', 13);
  SelectObject(Printer.Canvas.Handle, OldFont);
  DeleteObject(NewFont);
  Printer.EndDoc;
end;


Q) 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?

A) 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.

Example:

uses Printers;

{$IFDEF WIN32}
function DeviceCapabilitiesA(pDevice : PAnsiChar;
                             pPort : PAnsiChar;
                             fwCapability : Word;
                             pOutput : PAnsiChar;
                             DevMode : PDeviceModeA): Integer; stdcall;
  stdcall; external 'winspool.drv' name 'DeviceCapabilitiesA';

function DeviceCapabilitiesW(pDevice : PWideChar;
                             pPort : PWideChar;
                             fwCapability: Word;
                             pOutput: PWideChar;
                             DevMode: PDeviceModeW): Integer; stdcall;
  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;


Kevin R Corazza

Go to topic 50495

Return to index page 159
Return to index page 158
Return to index page 157
Return to index page 156
Return to index page 155
Return to index page 154
Return to index page 153
Return to index page 152
Return to index page 151
Return to index page 150