Pictedit.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:21k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       Delphi VCL Extensions (RX)                      }
  4. {                                                       }
  5. {       Copyright (c) 1995, 1997 Borland International  }
  6. {       Portions copyright (c) 1995, 1996 AO ROSNO      }
  7. {       Portions copyright (c) 1997 Master-Bank         }
  8. {                                                       }
  9. {*******************************************************}
  10. unit PictEdit;
  11. {$I RX.INC}
  12. interface
  13. uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  14.   Messages, Classes, Graphics, Forms, Controls, Dialogs, Buttons,
  15.   RTLConsts, DesignIntf, DesignEditors, VCLEditors, StdCtrls, ExtCtrls, Placemnt, ClipMon,
  16.   {$IFDEF RX_D3} ExtDlgs, ComCtrls, {$ELSE} ImagPrvw, {$ENDIF} Menus,
  17.   MRUList, RXCtrls;
  18. type
  19. { TPictureEditDialog }
  20.   TPictureEditDialog = class(TForm)
  21.     Load: TButton;
  22.     Save: TButton;
  23.     Copy: TButton;
  24.     Paste: TButton;
  25.     Clear: TButton;
  26.     OKButton: TButton;
  27.     CancelButton: TButton;
  28.     HelpBtn: TButton;
  29.     DecreaseBox: TCheckBox;
  30.     UsePreviewBox: TCheckBox;
  31.     FormStorage: TFormStorage;
  32.     GroupBox: TGroupBox;
  33.     ImagePanel: TPanel;
  34.     ImagePaintBox: TPaintBox;
  35.     Bevel: TBevel;
  36.     Paths: TButton;
  37.     PathsBtn: TRxSpeedButton;
  38.     PathsMenu: TPopupMenu;
  39.     PathsMRU: TMRUManager;
  40.     procedure FormCreate(Sender: TObject);
  41.     procedure FormDestroy(Sender: TObject);
  42.     procedure LoadClick(Sender: TObject);
  43.     procedure SaveClick(Sender: TObject);
  44.     procedure ClearClick(Sender: TObject);
  45.     procedure CopyClick(Sender: TObject);
  46.     procedure PasteClick(Sender: TObject);
  47.     procedure HelpBtnClick(Sender: TObject);
  48.     procedure FormStorageRestorePlacement(Sender: TObject);
  49.     procedure FormStorageSavePlacement(Sender: TObject);
  50.     procedure ImagePaintBoxPaint(Sender: TObject);
  51.     procedure PathsClick(Sender: TObject);
  52.     procedure PathsMRUClick(Sender: TObject; const RecentName,
  53.       Caption: string; UserData: Longint);
  54.     procedure PathsMenuPopup(Sender: TObject);
  55.     procedure PathsMRUChange(Sender: TObject);
  56.   private
  57.     FGraphicClass: TGraphicClass;
  58.     Pic: TPicture;
  59.     FIconColor: TColor;
  60.     FClipMonitor: TClipboardMonitor;
  61. {$IFDEF RX_D3}
  62.     FProgress: TProgressBar;
  63.     FProgressPos: Integer;
  64.     FileDialog: TOpenPictureDialog;
  65.     SaveDialog: TSavePictureDialog;
  66. {$ELSE}
  67.     FileDialog: TOpenDialog;
  68.     SaveDialog: TSaveDialog;
  69. {$ENDIF}
  70.     procedure CheckEnablePaste;
  71.     procedure ValidateImage;
  72.     procedure DecreaseBMPColors;
  73.     procedure SetGraphicClass(Value: TGraphicClass);
  74.     function GetDecreaseColors: Boolean;
  75.     procedure LoadFile(const FileName: string);
  76.     procedure UpdatePathsMenu;
  77.     procedure UpdateClipboard(Sender: TObject);
  78.     procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  79.     procedure WMDestroy(var Msg: TMessage); message WM_DESTROY;
  80. {$IFDEF RX_D3}
  81.     procedure GraphicProgress(Sender: TObject; Stage: TProgressStage;
  82.       PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string);
  83. {$ENDIF}
  84.   protected
  85.     procedure CreateHandle; override;
  86.   public
  87.     property DecreaseColors: Boolean read GetDecreaseColors;
  88.     property GraphicClass: TGraphicClass read FGraphicClass write SetGraphicClass;
  89.   end;
  90. { TPictEditor }
  91.   TPictEditor = class(TComponent)
  92.   private
  93.     FGraphicClass: TGraphicClass;
  94.     FPicture: TPicture;
  95.     FPicDlg: TPictureEditDialog;
  96.     FDecreaseColors: Boolean;
  97.     procedure SetPicture(Value: TPicture);
  98.     procedure SetGraphicClass(Value: TGraphicClass);
  99.   public
  100.     constructor Create(AOwner: TComponent); override;
  101.     destructor Destroy; override;
  102.     function Execute: Boolean;
  103.     property PicDlg: TPictureEditDialog read FPicDlg;
  104.     property GraphicClass: TGraphicClass read FGraphicClass write SetGraphicClass;
  105.     property Picture: TPicture read FPicture write SetPicture;
  106.   end;
  107. { TPictProperty }
  108. { Property editor the TPicture properties (e.g. the Picture property). Brings
  109.   up a file open dialog allowing loading a picture file. }
  110.   TPictProperty = class(TPropertyEditor)
  111.   public
  112.     procedure Edit; override;
  113.     function GetAttributes: TPropertyAttributes; override;
  114.     function GetValue: string; override;
  115.     procedure SetValue(const Value: string); override;
  116.   end;
  117. { TGraphicPropertyEditor }
  118.   TGraphicPropertyEditor = class(TClassProperty)
  119.   public
  120.     procedure Edit; override;
  121.     function GetAttributes: TPropertyAttributes; override;
  122.     function GetValue: string; override;
  123.     procedure SetValue(const Value: string); override;
  124.   end;
  125. { TGraphicsEditor }
  126.   TGraphicsEditor = class(TDefaultEditor)
  127.   public
  128.     procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override;
  129.   end;
  130. function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
  131.   const DialogCaption: string): Boolean;
  132. implementation
  133. uses TypInfo, SysUtils, Clipbrd, Consts, ShellApi, LibHelp, ClipIcon, RxGraph,
  134.   VCLUtils, AppUtils, RxConst, RxDirFrm, FileUtil;
  135. {$B-}
  136. {$IFDEF WIN32}
  137.  {$D-}
  138. {$ENDIF}
  139. {$R *.DFM}
  140. procedure CopyPicture(Pict: TPicture; BackColor: TColor);
  141. begin
  142.   if Pict.Graphic <> nil then begin
  143.     if Pict.Graphic is TIcon then CopyIconToClipboard(Pict.Icon, BackColor)
  144.     { check another specific graphic types here }
  145.     else Clipboard.Assign(Pict);
  146.   end;
  147. end;
  148. procedure PastePicture(Pict: TPicture; GraphicClass: TGraphicClass);
  149. var
  150.   NewGraphic: TGraphic;
  151. begin
  152.   if (Pict <> nil) then begin
  153.     if Clipboard.HasFormat(CF_ICON) and ((GraphicClass = TIcon) or
  154.       (GraphicClass = TGraphic)) then
  155.     begin
  156.       NewGraphic := CreateIconFromClipboard;
  157.       if NewGraphic <> nil then
  158.         try
  159.           Pict.Assign(NewGraphic);
  160.         finally
  161.           NewGraphic.Free;
  162.         end;
  163.     end
  164.     { check another specific graphic types here }
  165.     else if Clipboard.HasFormat(CF_PICTURE) then
  166.       Pict.Assign(Clipboard);
  167.   end;
  168. end;
  169. function EnablePaste(Graph: TGraphicClass): Boolean;
  170. begin
  171.   if (Graph = TBitmap) then Result := Clipboard.HasFormat(CF_BITMAP)
  172.   else if (Graph = TMetafile) then Result := Clipboard.HasFormat(CF_METAFILEPICT)
  173.   else if (Graph = TIcon) then Result := Clipboard.HasFormat(CF_ICON)
  174.   { check another graphic types here }
  175.   else if (Graph = TGraphic) then Result := Clipboard.HasFormat(CF_PICTURE)
  176.   else Result := Clipboard.HasFormat(CF_PICTURE);
  177. end;
  178. function ValidPicture(Pict: TPicture): Boolean;
  179. begin
  180.   Result := (Pict.Graphic <> nil) and not Pict.Graphic.Empty;
  181. end;
  182. { TPictEditor }
  183. constructor TPictEditor.Create(AOwner: TComponent);
  184. begin
  185.   inherited Create(AOwner);
  186.   FPicture := TPicture.Create;
  187.   FPicDlg := TPictureEditDialog.Create(Self);
  188.   FGraphicClass := TGraphic;
  189.   FPicDlg.GraphicClass := FGraphicClass;
  190. end;
  191. destructor TPictEditor.Destroy;
  192. begin
  193.   FPicture.Free;
  194.   inherited Destroy;
  195. end;
  196. function TPictEditor.Execute: Boolean;
  197. var
  198.   Bmp: TBitmap;
  199.   CurDir: string;
  200. begin
  201.   FPicDlg.Pic.Assign(FPicture);
  202.   with FPicDlg.FileDialog do
  203.   begin
  204.     Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp];
  205.     DefaultExt := GraphicExtension(GraphicClass);
  206.     Filter := GraphicFilter(GraphicClass);
  207.     HelpContext := hcDLoadPicture;
  208.   end;
  209.   with FPicDlg.SaveDialog do
  210.   begin
  211.     Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp,
  212.       ofOverwritePrompt];
  213.     DefaultExt := GraphicExtension(GraphicClass);
  214.     Filter := GraphicFilter(GraphicClass);
  215.     HelpContext := hcDSavePicture;
  216.   end;
  217.   FPicDlg.ValidateImage;
  218.   CurDir := GetCurrentDir;
  219.   try
  220.     Result := FPicDlg.ShowModal = mrOK;
  221.   finally
  222.     SetCurrentDir(CurDir);
  223.   end;
  224.   FDecreaseColors := FPicDlg.DecreaseColors;
  225.   if Result then begin
  226.     if FPicDlg.Pic.Graphic <> nil then begin
  227.       if (GraphicClass = TBitmap) and (FPicDlg.Pic.Graphic is TIcon) then
  228.       begin
  229.         Bmp := CreateBitmapFromIcon(FPicDlg.Pic.Icon, FPicDlg.FIconColor);
  230.         try
  231.           if FPicDlg.DecreaseColors then
  232.             SetBitmapPixelFormat(Bmp, pf4bit, DefaultMappingMethod);
  233.           FPicture.Assign(Bmp);
  234.         finally
  235.           Bmp.Free;
  236.         end;
  237.       end
  238.       else FPicture.Assign(FPicDlg.Pic);
  239.     end
  240.     else FPicture.Graphic := nil;
  241.   end;
  242. end;
  243. procedure TPictEditor.SetGraphicClass(Value: TGraphicClass);
  244. begin
  245.   FGraphicClass := Value;
  246.   if FPicDlg <> nil then FPicDlg.GraphicClass := Value;
  247. end;
  248. procedure TPictEditor.SetPicture(Value: TPicture);
  249. begin
  250.   FPicture.Assign(Value);
  251. end;
  252. { Utility routines }
  253. function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
  254.   const DialogCaption: string): Boolean;
  255. var
  256.   PictureEditor: TPictEditor;
  257. begin
  258.   Result := False;
  259.   if Graphic = nil then Exit;
  260.   PictureEditor := TPictEditor.Create(nil);
  261.   try
  262.     PictureEditor.FPicDlg.Caption := DialogCaption;
  263.     PictureEditor.GraphicClass := AClass;
  264.     if AClass = nil then
  265.       PictureEditor.GraphicClass := TGraphicClass(Graphic.ClassType);
  266.     PictureEditor.Picture.Assign(Graphic);
  267.     Result := PictureEditor.Execute;
  268.     if Result then
  269.       if (PictureEditor.Picture.Graphic = nil) or
  270.          (PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
  271.         Graphic.Assign(PictureEditor.Picture.Graphic)
  272.       else Result := False;
  273.   finally
  274.     PictureEditor.Free;
  275.   end;
  276. end;
  277. { TPictProperty }
  278. procedure TPictProperty.Edit;
  279. var
  280.   PictureEditor: TPictEditor;
  281.   Comp: TPersistent;
  282. begin
  283.   PictureEditor := TPictEditor.Create(nil);
  284.   try
  285.     Comp := GetComponent(0);
  286.     if Comp is TComponent then
  287.       PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName;
  288.     PictureEditor.Picture := TPicture(Pointer(GetOrdValue));
  289.     if PictureEditor.Execute then
  290.       SetOrdValue(Longint(PictureEditor.Picture));
  291.   finally
  292.     PictureEditor.Free;
  293.   end;
  294. end;
  295. function TPictProperty.GetAttributes: TPropertyAttributes;
  296. begin
  297.   Result := [paDialog];
  298. end;
  299. function TPictProperty.GetValue: string;
  300. var
  301.   Picture: TPicture;
  302. begin
  303.   Picture := TPicture(GetOrdValue);
  304.   if Picture.Graphic = nil then Result := ResStr(srNone)
  305.   else Result := '(' + Picture.Graphic.ClassName + ')';
  306. end;
  307. procedure TPictProperty.SetValue(const Value: string);
  308. begin
  309.   if Value = '' then SetOrdValue(0);
  310. end;
  311. { TGraphicPropertyEditor }
  312. procedure TGraphicPropertyEditor.Edit;
  313. var
  314.   PictureEditor: TPictEditor;
  315.   Comp: TPersistent;
  316. begin
  317.   PictureEditor := TPictEditor.Create(nil);
  318.   try
  319.     Comp := GetComponent(0);
  320.     if Comp is TComponent then
  321.       PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName
  322.     else PictureEditor.FPicDlg.Caption := GetName;
  323.     PictureEditor.GraphicClass := TGraphicClass(GetTypeData(GetPropType)^.ClassType);
  324.     PictureEditor.Picture.Graphic := TGraphic(Pointer(GetOrdValue));
  325.     if PictureEditor.Execute then
  326.       if (PictureEditor.Picture.Graphic = nil) or
  327.          (PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
  328.         SetOrdValue(LongInt(PictureEditor.Picture.Graphic))
  329.       else raise Exception.Create(ResStr(SInvalidPropertyValue));
  330.   finally
  331.     PictureEditor.Free;
  332.   end;
  333. end;
  334. function TGraphicPropertyEditor.GetAttributes: TPropertyAttributes;
  335. begin
  336.   Result := [paDialog];
  337. end;
  338. function TGraphicPropertyEditor.GetValue: string;
  339. var
  340.   Graphic: TGraphic;
  341. begin
  342.   Graphic := TGraphic(GetOrdValue);
  343.   if (Graphic = nil) or Graphic.Empty then Result := ResStr(srNone)
  344.   else Result := '(' + Graphic.ClassName + ')';
  345. end;
  346. procedure TGraphicPropertyEditor.SetValue(const Value: string);
  347. begin
  348.   if Value = '' then SetOrdValue(0);
  349. end;
  350. { TGraphicsEditor }
  351. procedure TGraphicsEditor.EditProperty(const Prop: IProperty; var Continue: Boolean);
  352. var
  353.   PropName: string;
  354. begin
  355.   PropName := Prop.GetName;
  356.   if (CompareText(PropName, 'PICTURE') = 0) or
  357.     (CompareText(PropName, 'IMAGE') = 0) or
  358.     (CompareText(PropName, 'GLYPH') = 0) then
  359.   begin
  360.     Prop.Edit;
  361.     Continue := False;
  362.   end;
  363. end;
  364. { TPictureEditDialog }
  365. procedure TPictureEditDialog.SetGraphicClass(Value: TGraphicClass);
  366. begin
  367.   FGraphicClass := Value;
  368.   CheckEnablePaste;
  369.   DecreaseBox.Enabled := (GraphicClass = TBitmap) or (GraphicClass = TGraphic);
  370. end;
  371. procedure TPictureEditDialog.CheckEnablePaste;
  372. begin
  373.   Paste.Enabled := EnablePaste(GraphicClass);
  374. end;
  375. procedure TPictureEditDialog.ValidateImage;
  376. var
  377.   Enable: Boolean;
  378. begin
  379.   Enable := ValidPicture(Pic);
  380.   Save.Enabled := Enable;
  381.   Clear.Enabled := Enable;
  382.   Copy.Enabled := Enable;
  383. end;
  384. {$IFDEF RX_D3}
  385. procedure TPictureEditDialog.GraphicProgress(Sender: TObject; Stage: TProgressStage;
  386.   PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string);
  387. begin
  388.   if Stage in [psStarting, psEnding] then begin
  389.     FProgressPos := 0;
  390.     FProgress.Position := 0;
  391.   end
  392.   else if Stage = psRunning then begin
  393.     if PercentDone >= FProgressPos + 10 then begin
  394.       FProgress.Position := PercentDone;
  395.       FProgressPos := PercentDone;
  396.     end;
  397.   end;
  398.   if RedrawNow then ImagePaintBox.Update;
  399. end;
  400. {$ENDIF}
  401. procedure TPictureEditDialog.UpdateClipboard(Sender: TObject);
  402. begin
  403.   CheckEnablePaste;
  404. end;
  405. procedure TPictureEditDialog.FormCreate(Sender: TObject);
  406. begin
  407.   Pic := TPicture.Create;
  408. {$IFDEF RX_D3}
  409.   FileDialog := TOpenPictureDialog.Create(Self);
  410.   SaveDialog := TSavePictureDialog.Create(Self);
  411.   UsePreviewBox.Visible := False;
  412.   FProgress := TProgressBar.Create(Self);
  413.   with FProgress do begin
  414.     SetBounds(UsePreviewBox.Left, UsePreviewBox.Top, UsePreviewBox.Width,
  415.       UsePreviewBox.Height);
  416.     Parent := Self;
  417.     Min := 0; Max := 100;
  418.     Position := 0;
  419.   end;
  420.   Pic.OnProgress := GraphicProgress;
  421. {$ELSE}
  422.   FileDialog := TOpenDialog.Create(Self);
  423.   SaveDialog := TSaveDialog.Create(Self);
  424. {$ENDIF}
  425.   FileDialog.Title := 'Load picture';
  426.   SaveDialog.Title := 'Save picture as';
  427. {$IFDEF WIN32}
  428.   Bevel.Visible := False;
  429.   Font.Style := [];
  430.   with FormStorage do begin
  431.     UseRegistry := True;
  432.     IniFileName := SDelphiKey;
  433.   end;
  434. {$ELSE}
  435.   if NewStyleControls then Font.Style := [];
  436. {$ENDIF}
  437.   PathsMRU.RecentMenu := PathsMenu.Items;
  438.   FIconColor := clBtnFace;
  439.   HelpContext := hcDPictureEditor;
  440.   Save.Enabled := False;
  441.   Clear.Enabled := False;
  442.   Copy.Enabled := False;
  443.   FClipMonitor := TClipboardMonitor.Create(Self);
  444.   FClipMonitor.OnChange := UpdateClipboard;
  445.   CheckEnablePaste;
  446. end;
  447. function TPictureEditDialog.GetDecreaseColors: Boolean;
  448. begin
  449.   Result := DecreaseBox.Checked;
  450. end;
  451. procedure TPictureEditDialog.FormDestroy(Sender: TObject);
  452. begin
  453.   FClipMonitor.Free;
  454.   Pic.Free;
  455. end;
  456. procedure TPictureEditDialog.LoadFile(const FileName: string);
  457. begin
  458.   Application.ProcessMessages;
  459.   StartWait;
  460.   try
  461.     Pic.LoadFromFile(FileName);
  462.   finally
  463.     StopWait;
  464.   end;
  465.   ImagePaintBox.Invalidate;
  466.   ValidateImage;
  467. end;
  468. procedure TPictureEditDialog.LoadClick(Sender: TObject);
  469. {$IFNDEF RX_D3}
  470. var
  471.   FileName: string;
  472. {$ENDIF}
  473. begin
  474. {$IFNDEF RX_D3}
  475.   if UsePreviewBox.Checked then begin
  476.     FileName := '';
  477.     if DirExists(FileDialog.InitialDir) then
  478.       SetCurrentDir(FileDialog.InitialDir);
  479.     if SelectImage(FileName, GraphicExtension(GraphicClass),
  480.       GraphicFilter(GraphicClass)) then
  481.     begin
  482.       FileDialog.Filename := FileName;
  483.       Self.LoadFile(FileName);
  484.     end;
  485.   end
  486.   else begin
  487. {$ENDIF}
  488.     if FileDialog.Execute then begin
  489.       Self.LoadFile(FileDialog.Filename);
  490.     end;
  491. {$IFNDEF RX_D3}
  492.   end;
  493. {$ENDIF}
  494. end;
  495. procedure TPictureEditDialog.SaveClick(Sender: TObject);
  496. begin
  497.   if (Pic.Graphic <> nil) and not Pic.Graphic.Empty then begin
  498.     with SaveDialog do begin
  499.       DefaultExt := GraphicExtension(TGraphicClass(Pic.Graphic.ClassType));
  500.       Filter := GraphicFilter(TGraphicClass(Pic.Graphic.ClassType));
  501.       if Execute then begin
  502.         StartWait;
  503.         try
  504.           Pic.SaveToFile(Filename);
  505.         finally
  506.           StopWait;
  507.         end;
  508.       end;
  509.     end;
  510.   end;
  511. end;
  512. procedure TPictureEditDialog.DecreaseBMPColors;
  513. begin
  514.   if ValidPicture(Pic) and (Pic.Graphic is TBitmap) and DecreaseColors then
  515.     SetBitmapPixelFormat(Pic.Bitmap, pf4bit, DefaultMappingMethod);
  516. end;
  517. procedure TPictureEditDialog.CopyClick(Sender: TObject);
  518. begin
  519.   CopyPicture(Pic, FIconColor);
  520. end;
  521. procedure TPictureEditDialog.PasteClick(Sender: TObject);
  522. begin
  523.   if (Pic <> nil) then begin
  524.     PastePicture(Pic, GraphicClass);
  525.     DecreaseBMPColors;
  526.     ImagePaintBox.Invalidate;
  527.     ValidateImage;
  528.   end;
  529. end;
  530. procedure TPictureEditDialog.ImagePaintBoxPaint(Sender: TObject);
  531. var
  532.   DrawRect: TRect;
  533.   SNone: string;
  534. {$IFDEF WIN32}
  535.   Ico: HIcon;
  536.   W, H: Integer;
  537. {$ENDIF}
  538. begin
  539.   with TPaintBox(Sender) do begin
  540.     Canvas.Brush.Color := Color;
  541.     DrawRect := ClientRect;
  542.     if ValidPicture(Pic) then begin
  543.       with DrawRect do
  544.         if (Pic.Width > Right - Left) or (Pic.Height > Bottom - Top) then
  545.         begin
  546.           if Pic.Width > Pic.Height then
  547.             Bottom := Top + MulDiv(Pic.Height, Right - Left, Pic.Width)
  548.           else
  549.             Right := Left + MulDiv(Pic.Width, Bottom - Top, Pic.Height);
  550.           Canvas.StretchDraw(DrawRect, Pic.Graphic);
  551.         end
  552.         else begin
  553.           with DrawRect do begin
  554. {$IFDEF WIN32}
  555.             if Pic.Graphic is TIcon then begin
  556.               Ico := CreateRealSizeIcon(Pic.Icon);
  557.               try
  558.                 GetIconSize(Ico, W, H);
  559.                 DrawIconEx(Canvas.Handle, (Left + Right - W) div 2,
  560.                   (Top + Bottom - H) div 2, Ico, W, H, 0, 0, DI_NORMAL);
  561.               finally
  562.                 DestroyIcon(Ico);
  563.               end;
  564.             end else
  565. {$ENDIF}
  566.             Canvas.Draw((Right + Left - Pic.Width) div 2,
  567.               (Bottom + Top - Pic.Height) div 2, Pic.Graphic);
  568.           end;
  569.         end;
  570.     end
  571.     else
  572.       with DrawRect, Canvas do begin
  573.         SNone := ResStr(srNone);
  574.         TextOut(Left + (Right - Left - TextWidth(SNone)) div 2, Top + (Bottom -
  575.           Top - TextHeight(SNone)) div 2, SNone);
  576.       end;
  577.   end;
  578. end;
  579. procedure TPictureEditDialog.CreateHandle;
  580. begin
  581.   inherited CreateHandle;
  582.   DragAcceptFiles(Handle, True);
  583. end;
  584. procedure TPictureEditDialog.WMDestroy(var Msg: TMessage);
  585. begin
  586.   DragAcceptFiles(Handle, False);
  587.   inherited;
  588. end;
  589. procedure TPictureEditDialog.WMDropFiles(var Msg: TWMDropFiles);
  590. var
  591.   AFileName: array[0..255] of Char;
  592.   Num: Cardinal;
  593. begin
  594.   Msg.Result := 0;
  595.   try
  596.     Num := DragQueryFile(Msg.Drop, {$IFDEF WIN32} $FFFFFFFF {$ELSE}
  597.       $FFFF {$ENDIF}, nil, 0);
  598.     if Num > 0 then begin
  599.       DragQueryFile(Msg.Drop, 0, PChar(@AFileName), Pred(SizeOf(AFileName)));
  600.       Application.BringToFront;
  601.       Self.LoadFile(StrPas(AFileName));
  602.     end;
  603.   finally
  604.     DragFinish(Msg.Drop);
  605.   end;
  606. end;
  607. procedure TPictureEditDialog.UpdatePathsMenu;
  608. var
  609.   I: Integer;
  610. begin
  611.   for I := 0 to PathsMenu.Items.Count - 1 do begin
  612.     PathsMenu.Items[I].Checked := CompareText(PathsMenu.Items[I].Caption,
  613.       FileDialog.InitialDir) = 0;
  614.   end;
  615. end;
  616. procedure TPictureEditDialog.ClearClick(Sender: TObject);
  617. begin
  618.   Pic.Graphic := nil;
  619.   ImagePaintBox.Invalidate;
  620.   Save.Enabled := False;
  621.   Clear.Enabled := False;
  622.   Copy.Enabled := False;
  623. end;
  624. procedure TPictureEditDialog.HelpBtnClick(Sender: TObject);
  625. begin
  626.   Application.HelpContext(HelpContext);
  627. end;
  628. const
  629.   sBackColorIdent = 'ClipboardBackColor';
  630.   sFileDir = 'FileDialog.InitialDir';
  631. procedure TPictureEditDialog.FormStorageRestorePlacement(Sender: TObject);
  632. begin
  633.   FIconColor := TColor(IniReadInteger(FormStorage.IniFileObject,
  634.     FormStorage.IniSection, sBackColorIdent, clBtnFace));
  635.   FileDialog.InitialDir := IniReadString(FormStorage.IniFileObject,
  636.     FormStorage.IniSection, sFileDir, FileDialog.InitialDir);
  637. end;
  638. procedure TPictureEditDialog.FormStorageSavePlacement(Sender: TObject);
  639. begin
  640.   IniWriteInteger(FormStorage.IniFileObject, FormStorage.IniSection,
  641.     sBackColorIdent, FIconColor);
  642.   IniWriteString(FormStorage.IniFileObject, FormStorage.IniSection,
  643.     sFileDir, FileDialog.InitialDir);
  644. end;
  645. procedure TPictureEditDialog.PathsClick(Sender: TObject);
  646. begin
  647.   if EditFolderList(PathsMRU.Strings) then
  648.     UpdatePathsMenu;
  649. end;
  650. procedure TPictureEditDialog.PathsMRUClick(Sender: TObject;
  651.   const RecentName, Caption: string; UserData: Longint);
  652. begin
  653.   if DirExists(RecentName) then begin
  654.     {SetCurrentDir(RecentName);}
  655.     FileDialog.InitialDir := RecentName;
  656.   end
  657.   else begin
  658.     PathsMRU.Remove(RecentName);
  659.   end;
  660.   UpdatePathsMenu;
  661. end;
  662. procedure TPictureEditDialog.PathsMenuPopup(Sender: TObject);
  663. begin
  664.   UpdatePathsMenu;
  665. end;
  666. procedure TPictureEditDialog.PathsMRUChange(Sender: TObject);
  667. begin
  668.   PathsBtn.Enabled := PathsMRU.Strings.Count > 0;
  669. end;
  670. end.