IMAGEWIN.PAS
上传用户:yuandong
上传日期:2022-08-08
资源大小:954k
文件大小:9k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. unit ImageWin;
  2. // emf file viewer with some features
  3. interface
  4. uses Windows, Classes, Graphics, Forms, Controls,
  5.   FileCtrl, StdCtrls, ExtCtrls, Buttons, ComCtrls, Dialogs, Printers,
  6.   Grids, Outline, DirOutln;
  7. type
  8.   TImageForm = class(TForm)
  9.     PrinterSetupDialog1: TPrinterSetupDialog;
  10.     PrintDialog1: TPrintDialog;
  11.     m_butClose: TButton;
  12.     m_butPrinterSetup: TButton;
  13.     m_butPrint: TButton;
  14.     GroupBox1: TGroupBox;
  15.     LoadButton: TButton;
  16.     m_butFore: TBitBtn;
  17.     GroupBox2: TGroupBox;
  18.     m_butRew: TBitBtn;
  19.     m_butStart: TBitBtn;
  20.     m_ComboBoxZoom: TComboBox;
  21.     Button1: TButton;
  22.     Label2: TLabel;
  23.     Label1: TLabel;
  24.     m_StatusBar: TStatusBar;
  25.     m_DriveComboBox: TDriveComboBox;
  26.     m_DirectoryListBox: TDirectoryListBox;
  27.     procedure m_butPrinterSetupClick(Sender: TObject);
  28.     procedure m_butPrintClick(Sender: TObject);
  29.     procedure m_butCloseClick(Sender: TObject);
  30.     procedure LoadButtonClick(Sender: TObject);
  31.     procedure ViewPic(strPicFile : string);
  32.     procedure FormShow(Sender: TObject);
  33.     procedure m_butStartClick(Sender: TObject);
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure m_butForeClick(Sender: TObject);
  36.     procedure m_butRewClick(Sender: TObject);
  37.     procedure InitFileCounter(n : integer);
  38.     procedure m_ComboBoxZoomClick(Sender: TObject);
  39.     procedure m_ComboBoxZoomKeyPress(Sender: TObject; var Key: Char);
  40.     procedure Zoom;
  41.     procedure Button1Click(Sender: TObject);
  42.     procedure FormResize(Sender: TObject);
  43.     procedure FormCanResize(Sender: TObject; var NewWidth,
  44.       NewHeight: Integer; var Resize: Boolean);
  45.     procedure m_DriveComboBoxChange(Sender: TObject);
  46.     procedure m_DirectoryListBoxChange(Sender: TObject);
  47.   public
  48.     strTempDir : string;
  49.     strSelectedDir : string;
  50.     lpszTempDir : PChar;
  51.     strTempFirstFileName : string;
  52.     nMetaWidth, nMetaHeight : integer;
  53.   private
  54.     FormCaption: string;
  55.     nFileCounter : integer;
  56.     strFileCounter : string;
  57.   end;
  58. const
  59.   PMON_KEY = 'SYSTEMCurrentControlSetControlPrintEnvironmentsWindows NT x86Print Processors';
  60. var
  61.   ImageForm: TImageForm;
  62. implementation
  63. uses ViewWin, SysUtils, LoadWin, about, WinReg;
  64. {$R *.DFM}
  65. procedure TImageForm.m_butPrinterSetupClick(Sender: TObject);
  66. // brings up windows standard printer setup dialog
  67. begin
  68.   PrinterSetupDialog1.Execute;
  69. end;
  70. procedure TImageForm.m_butPrintClick(Sender: TObject);
  71. // prints the printer job actually seen
  72. var
  73.   rRec : TRect;
  74.   strTmpFile : string;
  75.   SearchRes : TSearchRec; // search structure
  76.   i, nMax, nTemp, nFound : integer;
  77.   hmf : HMETAFILE;
  78. begin
  79.   rRec.Left := 0;
  80.   rRec.Top := 0;
  81.   rRec.Bottom := Printer.PageHeight;
  82.   rRec.Right := Printer.PageWidth;
  83.   // search min and max values for printing (0..1.EMF .. 0..n.EMF)
  84.   PrintDialog1.MinPage := 1;
  85.   nMax := 1;
  86.   nFound := FindFirst(strTempDir + '*.EMF', faAnyFile, SearchRes);
  87.   while nFound = 0 do begin
  88.     nTemp := StrToInt(Copy(ExtractFileName(SearchRes.Name),1,Pos('.',ExtractFileName(SearchRes.Name))-1));
  89.     if (nMax<nTemp) then nMax := nTemp;
  90.     nFound := FindNext(SearchRes);
  91.   end;
  92.   FindClose(SearchRes);
  93.   PrintDialog1.MaxPage := nMax;
  94.   if (PrintDialog1.Execute) then begin
  95.     try
  96.       if (PrintDialog1.PrintRange = prAllPages) then begin
  97.         PrintDialog1.FromPage := 0;
  98.         PrintDialog1.ToPage := nMax;
  99.       end;
  100.       for i:=PrintDialog1.FromPage to PrintDialog1.ToPage do begin
  101.         strTmpFile := IntToStr(i);
  102.         while (Length(strTmpFile)<8) do
  103.           insert('0', strTmpFile, 1);
  104.         // load pic
  105.         strTmpFile := strTempDir + '' + strTmpFile + '.EMF';
  106.         if (FileExists(strTmpFile)) then begin
  107.           hmf := GetEnhMetaFile(PChar(strTmpFile));
  108.           // print pic
  109.           Printer.BeginDoc;
  110.           PlayEnhMetaFile(Printer.Handle, hmf, rRec);
  111.           Printer.EndDoc;
  112.           DeleteEnhMetaFile(hmf);
  113.         end;
  114.       end;
  115.     except
  116.       on Exception do begin { just in case an error happens... }
  117.         Printer.Abort;
  118.         Printer.EndDoc;
  119.         Raise;
  120.       end;
  121.     end;
  122.   end;
  123. end;
  124. procedure TImageForm.m_butCloseClick(Sender: TObject);
  125. begin
  126.   Close;
  127. end;
  128. procedure TImageForm.LoadButtonClick(Sender: TObject);
  129. // brings up load/browse window
  130. begin
  131.   strSelectedDir := m_DirectoryListBox.Directory;
  132.   LoadForm.strSelectedDir := strSelectedDir;
  133.   LoadForm.Show;
  134. end;
  135. procedure TImageForm.ViewPic(strPicFile : string);
  136. // show picture in separate window
  137. begin
  138.   if (FileExists(strPicFile)) then begin  // this is the name of a file that exists
  139.     m_StatusBar.Panels[0].Text := 'Page: ' + Copy(ExtractFileName(strPicFile), 1, Pos('.', ExtractFileName(strPicFile))-1);
  140.     ViewForm.Image1.Picture.LoadFromFile(strPicFile);
  141.     ViewForm.Caption := FormCaption + ExtractFilename(strPicFile);
  142.     ViewForm.HorzScrollBar.Range := ViewForm.Image1.Picture.Width;
  143.     ViewForm.VertScrollBar.Range := ViewForm.Image1.Picture.Height;
  144.     ViewForm.ClientHeight := ViewForm.Image1.Picture.Height;
  145.     ViewForm.ClientWidth := ViewForm.Image1.Picture.Width;
  146.     nMetaWidth := ViewForm.Image1.Picture.Metafile.Width;
  147.     nMetaHeight := ViewForm.Image1.Picture.Metafile.Height;
  148.     ViewForm.Show;
  149.   end;
  150. end;
  151. procedure TImageForm.FormShow(Sender: TObject);
  152. var strParam, m_strTempVar : string;
  153.     reg : TWinRegistry;
  154. begin
  155.   // inits
  156.   GetMem(lpszTempDir, 255);
  157.   GetEnvironmentVariable('temp', lpszTempDir, 255);
  158.   strTempDir := string(lpszTempDir);
  159.   LoadForm.strTempDir := strTempDir;
  160.   FreeMem(lpszTempDir, 255);
  161.   // try to get registry settings for destdir
  162.   reg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, PMON_KEY);
  163.   m_strTempVar := reg.ReadString('vprproc', 'DestDir', '');
  164.   if (m_strTempVar = '') then
  165.     ShowMessage('vprproc registry settings not yet set!' + #13 + 'Please select destination directory for print jobs' + #13 +
  166.                 'using the Installer Tool!' + #13 + 'I will use your temp directory at' + #13 + strTempDir)
  167.   else
  168.     strTempDir := m_strTempVar;
  169.   reg.free;
  170.   m_DirectoryListBox.Directory := strTempDir;
  171. end;
  172. procedure TImageForm.m_butStartClick(Sender: TObject);
  173. // jumps to file 00000000.emf
  174. begin
  175.   strSelectedDir := m_DirectoryListBox.Directory;
  176.   nFileCounter := 0;
  177.   InitFileCounter(nFileCounter);
  178.   ViewPic(strTempFirstFileName);
  179.   if (m_ComboBoxZoom.Text <> '100') then Zoom;
  180. end;
  181. procedure TImageForm.InitFileCounter(n : integer);
  182. begin
  183.   nFileCounter := n;
  184.   strFileCounter := IntToStr(nFileCounter);
  185.   while (Length(strFileCounter)<8) do
  186.     insert('0', strFileCounter, 1);
  187. end;
  188. procedure TImageForm.FormCreate(Sender: TObject);
  189. begin
  190.   InitFileCounter(1);
  191. end;
  192. procedure TImageForm.m_butForeClick(Sender: TObject);
  193. // jumps 1 picture forward
  194. var
  195.   strTmpFile,
  196.   strTmpFilCnt : string;
  197. begin
  198.   strSelectedDir := m_DirectoryListBox.Directory;
  199.   strTmpFilCnt := strFileCounter;
  200.   Inc(nFileCounter);
  201.   InitFileCounter(nFileCounter);
  202.   strTmpFile := strSelectedDir + '' + strFileCounter + '.EMF';
  203.   if (FileExists(strTmpFile)) then begin
  204.     ViewPic(strTmpFile);
  205.     if (m_ComboBoxZoom.Text <> '100') then Zoom;
  206.   end else begin
  207.     Dec(nFileCounter);
  208.     strFileCounter := strTmpFilCnt;
  209.   end;
  210. end;
  211. procedure TImageForm.m_butRewClick(Sender: TObject);
  212. // jumps 1 picture backward
  213. var
  214.   strTmpFile,
  215.   strTmpFilCnt : string;
  216. begin
  217.   strSelectedDir := m_DirectoryListBox.Directory;
  218.   strTmpFilCnt := strFileCounter;
  219.   if (nFileCounter-1) >= 0 then begin
  220.     Dec(nFileCounter);
  221.     InitFileCounter(nFileCounter);
  222.     strTmpFile := strSelectedDir + '' + strFileCounter + '.EMF';
  223.     if (FileExists(strTmpFile)) then begin
  224.       ViewPic(strTmpFile);
  225.       if (m_ComboBoxZoom.Text <> '100') then Zoom;
  226.     end else begin
  227.       Inc(nFileCounter);
  228.       strFileCounter := strTmpFilCnt;
  229.     end;
  230.   end;
  231. end;
  232. procedure TImageForm.Zoom;
  233. // zoom factor for picture in viewwindow
  234. begin
  235.   ViewForm.Image1.Picture.Metafile.Height := (nMetaHeight div 100) * StrToInt(m_ComboBoxZoom.Text);
  236.   ViewForm.Image1.Picture.Metafile.Width := (nMetaWidth div 100) * StrToint(m_ComboBoxZoom.Text);
  237.   ViewForm.HorzScrollBar.Range := ViewForm.Image1.Picture.Width;
  238.   ViewForm.VertScrollBar.Range := ViewForm.Image1.Picture.Height;
  239.   ViewForm.ClientHeight := ViewForm.Image1.Picture.Height;
  240.   ViewForm.ClientWidth := ViewForm.Image1.Picture.Width;
  241.   ViewForm.Repaint;
  242. end;
  243. procedure TImageForm.m_ComboBoxZoomClick(Sender: TObject);
  244. begin
  245.   Zoom;
  246. end;
  247. procedure TImageForm.m_ComboBoxZoomKeyPress(Sender: TObject; var Key: Char);
  248. // for manual setting of zoom factor
  249. begin
  250.   if Key = #13 then Zoom;
  251. end;
  252. procedure TImageForm.Button1Click(Sender: TObject);
  253. begin
  254.   MessageDlg('EMF Viewer for Virtual Printer' + #13 + '(C) 2002 mabuse.de', mtInformation, [mbOK], 0);
  255. end;
  256. procedure TImageForm.FormResize(Sender: TObject);
  257. begin
  258.   ImageForm.Repaint;
  259. end;
  260. procedure TImageForm.FormCanResize(Sender: TObject; var NewWidth,
  261.   NewHeight: Integer; var Resize: Boolean);
  262. begin
  263.   m_DirectoryListBox.Width := NewWidth - 20;
  264.   m_DirectoryListBox.Height := NewHeight - 210;
  265. end;
  266. procedure TImageForm.m_DriveComboBoxChange(Sender: TObject);
  267. begin
  268.   m_DirectoryListBox.Drive := m_DriveComboBox.Drive;
  269. end;
  270. procedure TImageForm.m_DirectoryListBoxChange(Sender: TObject);
  271. begin
  272.   strSelectedDir := m_DirectoryListBox.Directory;
  273.   strTempFirstFileName := strSelectedDir + '' + strFileCounter + '.EMF';
  274.   if (FileExists(strTempFirstFileName)) then ViewPic(strTempFirstFileName);
  275. end;
  276. end.