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; |
この例では Printer を with してあります。BitBlt() に渡している Canvas.Handle というのは、Printer.Canvas.Handle のこと、つまり、プリンタDCのことです。
いちばん簡単なのは、PrintScreenキーが押されたのと同じ状態を起すことです。
procedure HardCopyToCB; begin keybd_event(VK_SNAPSHOT, 1, 0, 0); end; |
これで、クリップボードに画面全体のハードコピーが転送されます。
画面全体でなく、アクティブ画面のみのハードコピーをとりたい(Alt+PrintScreen の操作を行いたい)ときは、第二引数を0にすればOKです。
[ Delphi へ戻る ]