Tips その6


印刷するには

Printer グローバル変数を利用すると、簡単に印刷処理が行えます。

次の例では、img に渡されたビットマップをプリンタに出力しています。

procedure PrintOut(img: TBitmap);
var
  Device : Array [0..255] of Char; //プリンタデバイス
  Driver : Array [0..255] of Char; //プリンタドライバ
  Port : Array [0..255] of Char;   //プリンタポート
  DeviceMode: THandle;              //デバイスモード
  pDevMode : ^TDevMode;             //デバイスモードポインタ型

  drWidth, drHeight: Integer;       //描画サイズ
  x_page, y_page : Integer;         //ページ数
  x_cnt, y_cnt: Integer;             //カウンタ変数

  i : Integer;

begin

  { 変数初期化 }
  FillMemory(@Device, 256, 0);
  FillMemory(@Driver, 256, 0);
  FillMemory(@Port, 256, 0);
 
  with Printer do begin

    // OSにプリンタが設定されているかチェックする
    // プリンタが一つも設定されていない場合、処理を中止する

    if Printers.Count = 0 then Exit;

    PrinterIndex:= -1;                              // デフォルトプリンタ(-1)をセット
    GetPrinter(Device, Driver, Port, DeviceMode);   // 現在の動作モード取得
    pDevMode:= GlobalLock(DeviceMode);              // ドライバ領域をロック
    pDevMode^.dmPaperSize:= DMPAPER_A4;             // 用紙をA4サイズにセット
    pDevMode^.dmOrientation := DMORIENT_LANDSCAPE; // 用紙の向きを横にセット
    GlobalUnlock(DeviceMode);                       // ドライバ領域を開放
    SetPrinter(Device, Driver, Port, DeviceMode);   // 動作モードを設定
    Application.ProcessMessages;                    // 処理を完了する

    BeginDoc;// 印刷開始

    { 描画サイズ設定 }
    // ここでは縦横に10ずつマージンを取るために20減じている
    drWidth:= PageWidth - 20;
    drHeight:= PageHeight - 20;

    { ページ数を求める }
    x_page:= Integer(Ceil(img.Width / drWidth));
    y_page:= Integer(Ceil(img.Height / drHeight));

    { ページ数分印刷 }
    for x_cnt:= 0 to x_page - 1 do begin
      for y_cnt:= 0 to y_page - 1 do begin

        { プリンタDCにビットマップ描画 }
        if not BitBlt(Canvas.Handle,
                       10,
                       10,
                       drWidth,
                       drHeight,
                       img.Canvas.Handle,
                       drWidth * x_cnt,
                       drHeight * y_cnt,
                       SRCCOPY) then Break;

        NewPage;//改ページ

      end;
    end;

    EndDoc;// 印刷完了

  end;

end;

この例では Printerwith してあります。BitBlt() に渡している Canvas.Handle というのは、Printer.Canvas.Handle のこと、つまり、プリンタDCのことです。


ハードコピーをとるには

いちばん簡単なのは、PrintScreenキーが押されたのと同じ状態を起すことです。

procedure HardCopyToCB;
begin
  keybd_event(VK_SNAPSHOT, 1, 0, 0);
end;

これで、クリップボードに画面全体のハードコピーが転送されます。

画面全体でなく、アクティブ画面のみのハードコピーをとりたい(Alt+PrintScreen の操作を行いたい)ときは、第二引数を0にすればOKです。


[ Delphi へ戻る ]