⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagewin.pas

📁 虚拟打印机
💻 PAS
字号:
unit ImageWin;
// emf file viewer with some features
interface

uses Windows, Classes, Graphics, Forms, Controls,
  FileCtrl, StdCtrls, ExtCtrls, Buttons, ComCtrls, Dialogs, Printers,
  Grids, Outline, DirOutln;

type
  TImageForm = class(TForm)
    PrinterSetupDialog1: TPrinterSetupDialog;
    PrintDialog1: TPrintDialog;
    m_butClose: TButton;
    m_butPrinterSetup: TButton;
    m_butPrint: TButton;
    GroupBox1: TGroupBox;
    LoadButton: TButton;
    m_butFore: TBitBtn;
    GroupBox2: TGroupBox;
    m_butRew: TBitBtn;
    m_butStart: TBitBtn;
    m_ComboBoxZoom: TComboBox;
    Button1: TButton;
    Label2: TLabel;
    Label1: TLabel;
    m_StatusBar: TStatusBar;
    m_DriveComboBox: TDriveComboBox;
    m_DirectoryListBox: TDirectoryListBox;
    procedure m_butPrinterSetupClick(Sender: TObject);
    procedure m_butPrintClick(Sender: TObject);
    procedure m_butCloseClick(Sender: TObject);
    procedure LoadButtonClick(Sender: TObject);
    procedure ViewPic(strPicFile : string);
    procedure FormShow(Sender: TObject);
    procedure m_butStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure m_butForeClick(Sender: TObject);
    procedure m_butRewClick(Sender: TObject);
    procedure InitFileCounter(n : integer);
    procedure m_ComboBoxZoomClick(Sender: TObject);
    procedure m_ComboBoxZoomKeyPress(Sender: TObject; var Key: Char);
    procedure Zoom;
    procedure Button1Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    procedure m_DriveComboBoxChange(Sender: TObject);
    procedure m_DirectoryListBoxChange(Sender: TObject);
  public
    strTempDir : string;
    strSelectedDir : string;
    lpszTempDir : PChar;
    strTempFirstFileName : string;
    nMetaWidth, nMetaHeight : integer;
  private
    FormCaption: string;
    nFileCounter : integer;
    strFileCounter : string;
  end;

const
  PMON_KEY = 'SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Print Processors';

var
  ImageForm: TImageForm;

implementation

uses ViewWin, SysUtils, LoadWin, about, WinReg;

{$R *.DFM}


procedure TImageForm.m_butPrinterSetupClick(Sender: TObject);
// brings up windows standard printer setup dialog
begin
  PrinterSetupDialog1.Execute;
end;

procedure TImageForm.m_butPrintClick(Sender: TObject);
// prints the printer job actually seen
var
  rRec : TRect;
  strTmpFile : string;
  SearchRes : TSearchRec; // search structure
  i, nMax, nTemp, nFound : integer;
  hmf : HMETAFILE;
begin
  rRec.Left := 0;
  rRec.Top := 0;
  rRec.Bottom := Printer.PageHeight;
  rRec.Right := Printer.PageWidth;
  // search min and max values for printing (0..1.EMF .. 0..n.EMF)
  PrintDialog1.MinPage := 1;
  nMax := 1;
  nFound := FindFirst(strTempDir + '\*.EMF', faAnyFile, SearchRes);
  while nFound = 0 do begin
    nTemp := StrToInt(Copy(ExtractFileName(SearchRes.Name),1,Pos('.',ExtractFileName(SearchRes.Name))-1));
    if (nMax<nTemp) then nMax := nTemp;
    nFound := FindNext(SearchRes);
  end;
  FindClose(SearchRes);
  PrintDialog1.MaxPage := nMax;
  if (PrintDialog1.Execute) then begin
    try
      if (PrintDialog1.PrintRange = prAllPages) then begin
        PrintDialog1.FromPage := 0;
        PrintDialog1.ToPage := nMax;
      end;
      for i:=PrintDialog1.FromPage to PrintDialog1.ToPage do begin
        strTmpFile := IntToStr(i);
        while (Length(strTmpFile)<8) do
          insert('0', strTmpFile, 1);
        // load pic
        strTmpFile := strTempDir + '\' + strTmpFile + '.EMF';
        if (FileExists(strTmpFile)) then begin
          hmf := GetEnhMetaFile(PChar(strTmpFile));
          // print pic
          Printer.BeginDoc;
          PlayEnhMetaFile(Printer.Handle, hmf, rRec);
          Printer.EndDoc;
          DeleteEnhMetaFile(hmf);
        end;
      end;
    except
      on Exception do begin { just in case an error happens... }
        Printer.Abort;
        Printer.EndDoc;
        Raise;
      end;
    end;
  end;
end;

procedure TImageForm.m_butCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TImageForm.LoadButtonClick(Sender: TObject);
// brings up load/browse window
begin
  strSelectedDir := m_DirectoryListBox.Directory;
  LoadForm.strSelectedDir := strSelectedDir;
  LoadForm.Show;
end;

procedure TImageForm.ViewPic(strPicFile : string);
// show picture in separate window
begin
  if (FileExists(strPicFile)) then begin  // this is the name of a file that exists
    m_StatusBar.Panels[0].Text := 'Page: ' + Copy(ExtractFileName(strPicFile), 1, Pos('.', ExtractFileName(strPicFile))-1);
    ViewForm.Image1.Picture.LoadFromFile(strPicFile);
    ViewForm.Caption := FormCaption + ExtractFilename(strPicFile);
    ViewForm.HorzScrollBar.Range := ViewForm.Image1.Picture.Width;
    ViewForm.VertScrollBar.Range := ViewForm.Image1.Picture.Height;
    ViewForm.ClientHeight := ViewForm.Image1.Picture.Height;
    ViewForm.ClientWidth := ViewForm.Image1.Picture.Width;
    nMetaWidth := ViewForm.Image1.Picture.Metafile.Width;
    nMetaHeight := ViewForm.Image1.Picture.Metafile.Height;
    ViewForm.Show;
  end;
end;

procedure TImageForm.FormShow(Sender: TObject);
var strParam, m_strTempVar : string;
    reg : TWinRegistry;
begin
  // inits
  GetMem(lpszTempDir, 255);
  GetEnvironmentVariable('temp', lpszTempDir, 255);
  strTempDir := string(lpszTempDir);
  LoadForm.strTempDir := strTempDir;
  FreeMem(lpszTempDir, 255);
  // try to get registry settings for destdir
  reg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, PMON_KEY);
  m_strTempVar := reg.ReadString('vprproc', 'DestDir', '');
  if (m_strTempVar = '') then
    ShowMessage('vprproc registry settings not yet set!' + #13 + 'Please select destination directory for print jobs' + #13 +
                'using the Installer Tool!' + #13 + 'I will use your temp directory at' + #13 + strTempDir)
  else
    strTempDir := m_strTempVar;
  reg.free;
  m_DirectoryListBox.Directory := strTempDir;

end;

procedure TImageForm.m_butStartClick(Sender: TObject);
// jumps to file 00000000.emf
begin
  strSelectedDir := m_DirectoryListBox.Directory;
  nFileCounter := 0;
  InitFileCounter(nFileCounter);
  ViewPic(strTempFirstFileName);
  if (m_ComboBoxZoom.Text <> '100') then Zoom;
end;

procedure TImageForm.InitFileCounter(n : integer);
begin
  nFileCounter := n;
  strFileCounter := IntToStr(nFileCounter);
  while (Length(strFileCounter)<8) do
    insert('0', strFileCounter, 1);
end;

procedure TImageForm.FormCreate(Sender: TObject);
begin
  InitFileCounter(1);
end;

procedure TImageForm.m_butForeClick(Sender: TObject);
// jumps 1 picture forward
var
  strTmpFile,
  strTmpFilCnt : string;
begin
  strSelectedDir := m_DirectoryListBox.Directory;
  strTmpFilCnt := strFileCounter;
  Inc(nFileCounter);
  InitFileCounter(nFileCounter);
  strTmpFile := strSelectedDir + '\' + strFileCounter + '.EMF';
  if (FileExists(strTmpFile)) then begin
    ViewPic(strTmpFile);
    if (m_ComboBoxZoom.Text <> '100') then Zoom;
  end else begin
    Dec(nFileCounter);
    strFileCounter := strTmpFilCnt;
  end;
end;

procedure TImageForm.m_butRewClick(Sender: TObject);
// jumps 1 picture backward
var
  strTmpFile,
  strTmpFilCnt : string;
begin
  strSelectedDir := m_DirectoryListBox.Directory;
  strTmpFilCnt := strFileCounter;
  if (nFileCounter-1) >= 0 then begin
    Dec(nFileCounter);
    InitFileCounter(nFileCounter);
    strTmpFile := strSelectedDir + '\' + strFileCounter + '.EMF';
    if (FileExists(strTmpFile)) then begin
      ViewPic(strTmpFile);
      if (m_ComboBoxZoom.Text <> '100') then Zoom;
    end else begin
      Inc(nFileCounter);
      strFileCounter := strTmpFilCnt;
    end;
  end;
end;

procedure TImageForm.Zoom;
// zoom factor for picture in viewwindow
begin
  ViewForm.Image1.Picture.Metafile.Height := (nMetaHeight div 100) * StrToInt(m_ComboBoxZoom.Text);
  ViewForm.Image1.Picture.Metafile.Width := (nMetaWidth div 100) * StrToint(m_ComboBoxZoom.Text);
  ViewForm.HorzScrollBar.Range := ViewForm.Image1.Picture.Width;
  ViewForm.VertScrollBar.Range := ViewForm.Image1.Picture.Height;
  ViewForm.ClientHeight := ViewForm.Image1.Picture.Height;
  ViewForm.ClientWidth := ViewForm.Image1.Picture.Width;
  ViewForm.Repaint;
end;

procedure TImageForm.m_ComboBoxZoomClick(Sender: TObject);
begin
  Zoom;
end;

procedure TImageForm.m_ComboBoxZoomKeyPress(Sender: TObject; var Key: Char);
// for manual setting of zoom factor
begin
  if Key = #13 then Zoom;
end;

procedure TImageForm.Button1Click(Sender: TObject);
begin
  MessageDlg('EMF Viewer for Virtual Printer' + #13 + '(C) 2002 mabuse.de', mtInformation, [mbOK], 0);
end;

procedure TImageForm.FormResize(Sender: TObject);
begin
  ImageForm.Repaint;
end;

procedure TImageForm.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  m_DirectoryListBox.Width := NewWidth - 20;
  m_DirectoryListBox.Height := NewHeight - 210;
end;


procedure TImageForm.m_DriveComboBoxChange(Sender: TObject);
begin
  m_DirectoryListBox.Drive := m_DriveComboBox.Drive;
end;

procedure TImageForm.m_DirectoryListBoxChange(Sender: TObject);
begin
  strSelectedDir := m_DirectoryListBox.Directory;
  strTempFirstFileName := strSelectedDir + '\' + strFileCounter + '.EMF';
  if (FileExists(strTempFirstFileName)) then ViewPic(strTempFirstFileName);

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -