📄 pictedit.pas
字号:
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) }
{ }
{ Copyright (c) 1995, 1997 Borland International }
{ Portions copyright (c) 1995, 1996 AO ROSNO }
{ Portions copyright (c) 1997 Master-Bank }
{ }
{*******************************************************}
unit PictEdit;
{$I RX.INC}
interface
uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
Messages, Classes, Graphics, Forms, Controls, Dialogs, Buttons,
RTLConsts, DesignIntf, DesignEditors, VCLEditors, StdCtrls, ExtCtrls, Placemnt, ClipMon,
{$IFDEF RX_D3} ExtDlgs, ComCtrls, {$ELSE} ImagPrvw, {$ENDIF} Menus,
MRUList, RXCtrls;
type
{ TPictureEditDialog }
TPictureEditDialog = class(TForm)
Load: TButton;
Save: TButton;
Copy: TButton;
Paste: TButton;
Clear: TButton;
OKButton: TButton;
CancelButton: TButton;
HelpBtn: TButton;
DecreaseBox: TCheckBox;
UsePreviewBox: TCheckBox;
FormStorage: TFormStorage;
GroupBox: TGroupBox;
ImagePanel: TPanel;
ImagePaintBox: TPaintBox;
Bevel: TBevel;
Paths: TButton;
PathsBtn: TRxSpeedButton;
PathsMenu: TPopupMenu;
PathsMRU: TMRUManager;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LoadClick(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure ClearClick(Sender: TObject);
procedure CopyClick(Sender: TObject);
procedure PasteClick(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure FormStorageRestorePlacement(Sender: TObject);
procedure FormStorageSavePlacement(Sender: TObject);
procedure ImagePaintBoxPaint(Sender: TObject);
procedure PathsClick(Sender: TObject);
procedure PathsMRUClick(Sender: TObject; const RecentName,
Caption: string; UserData: Longint);
procedure PathsMenuPopup(Sender: TObject);
procedure PathsMRUChange(Sender: TObject);
private
FGraphicClass: TGraphicClass;
Pic: TPicture;
FIconColor: TColor;
FClipMonitor: TClipboardMonitor;
{$IFDEF RX_D3}
FProgress: TProgressBar;
FProgressPos: Integer;
FileDialog: TOpenPictureDialog;
SaveDialog: TSavePictureDialog;
{$ELSE}
FileDialog: TOpenDialog;
SaveDialog: TSaveDialog;
{$ENDIF}
procedure CheckEnablePaste;
procedure ValidateImage;
procedure DecreaseBMPColors;
procedure SetGraphicClass(Value: TGraphicClass);
function GetDecreaseColors: Boolean;
procedure LoadFile(const FileName: string);
procedure UpdatePathsMenu;
procedure UpdateClipboard(Sender: TObject);
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
procedure WMDestroy(var Msg: TMessage); message WM_DESTROY;
{$IFDEF RX_D3}
procedure GraphicProgress(Sender: TObject; Stage: TProgressStage;
PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string);
{$ENDIF}
protected
procedure CreateHandle; override;
public
property DecreaseColors: Boolean read GetDecreaseColors;
property GraphicClass: TGraphicClass read FGraphicClass write SetGraphicClass;
end;
{ TPictEditor }
TPictEditor = class(TComponent)
private
FGraphicClass: TGraphicClass;
FPicture: TPicture;
FPicDlg: TPictureEditDialog;
FDecreaseColors: Boolean;
procedure SetPicture(Value: TPicture);
procedure SetGraphicClass(Value: TGraphicClass);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Execute: Boolean;
property PicDlg: TPictureEditDialog read FPicDlg;
property GraphicClass: TGraphicClass read FGraphicClass write SetGraphicClass;
property Picture: TPicture read FPicture write SetPicture;
end;
{ TPictProperty }
{ Property editor the TPicture properties (e.g. the Picture property). Brings
up a file open dialog allowing loading a picture file. }
TPictProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TGraphicPropertyEditor }
TGraphicPropertyEditor = class(TClassProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TGraphicsEditor }
TGraphicsEditor = class(TDefaultEditor)
public
procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override;
end;
function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
const DialogCaption: string): Boolean;
implementation
uses TypInfo, SysUtils, Clipbrd, Consts, ShellApi, LibHelp, ClipIcon, RxGraph,
VCLUtils, AppUtils, RxConst, RxDirFrm, FileUtil;
{$B-}
{$IFDEF WIN32}
{$D-}
{$ENDIF}
{$R *.DFM}
procedure CopyPicture(Pict: TPicture; BackColor: TColor);
begin
if Pict.Graphic <> nil then begin
if Pict.Graphic is TIcon then CopyIconToClipboard(Pict.Icon, BackColor)
{ check another specific graphic types here }
else Clipboard.Assign(Pict);
end;
end;
procedure PastePicture(Pict: TPicture; GraphicClass: TGraphicClass);
var
NewGraphic: TGraphic;
begin
if (Pict <> nil) then begin
if Clipboard.HasFormat(CF_ICON) and ((GraphicClass = TIcon) or
(GraphicClass = TGraphic)) then
begin
NewGraphic := CreateIconFromClipboard;
if NewGraphic <> nil then
try
Pict.Assign(NewGraphic);
finally
NewGraphic.Free;
end;
end
{ check another specific graphic types here }
else if Clipboard.HasFormat(CF_PICTURE) then
Pict.Assign(Clipboard);
end;
end;
function EnablePaste(Graph: TGraphicClass): Boolean;
begin
if (Graph = TBitmap) then Result := Clipboard.HasFormat(CF_BITMAP)
else if (Graph = TMetafile) then Result := Clipboard.HasFormat(CF_METAFILEPICT)
else if (Graph = TIcon) then Result := Clipboard.HasFormat(CF_ICON)
{ check another graphic types here }
else if (Graph = TGraphic) then Result := Clipboard.HasFormat(CF_PICTURE)
else Result := Clipboard.HasFormat(CF_PICTURE);
end;
function ValidPicture(Pict: TPicture): Boolean;
begin
Result := (Pict.Graphic <> nil) and not Pict.Graphic.Empty;
end;
{ TPictEditor }
constructor TPictEditor.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPicture := TPicture.Create;
FPicDlg := TPictureEditDialog.Create(Self);
FGraphicClass := TGraphic;
FPicDlg.GraphicClass := FGraphicClass;
end;
destructor TPictEditor.Destroy;
begin
FPicture.Free;
inherited Destroy;
end;
function TPictEditor.Execute: Boolean;
var
Bmp: TBitmap;
CurDir: string;
begin
FPicDlg.Pic.Assign(FPicture);
with FPicDlg.FileDialog do
begin
Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp];
DefaultExt := GraphicExtension(GraphicClass);
Filter := GraphicFilter(GraphicClass);
HelpContext := hcDLoadPicture;
end;
with FPicDlg.SaveDialog do
begin
Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp,
ofOverwritePrompt];
DefaultExt := GraphicExtension(GraphicClass);
Filter := GraphicFilter(GraphicClass);
HelpContext := hcDSavePicture;
end;
FPicDlg.ValidateImage;
CurDir := GetCurrentDir;
try
Result := FPicDlg.ShowModal = mrOK;
finally
SetCurrentDir(CurDir);
end;
FDecreaseColors := FPicDlg.DecreaseColors;
if Result then begin
if FPicDlg.Pic.Graphic <> nil then begin
if (GraphicClass = TBitmap) and (FPicDlg.Pic.Graphic is TIcon) then
begin
Bmp := CreateBitmapFromIcon(FPicDlg.Pic.Icon, FPicDlg.FIconColor);
try
if FPicDlg.DecreaseColors then
SetBitmapPixelFormat(Bmp, pf4bit, DefaultMappingMethod);
FPicture.Assign(Bmp);
finally
Bmp.Free;
end;
end
else FPicture.Assign(FPicDlg.Pic);
end
else FPicture.Graphic := nil;
end;
end;
procedure TPictEditor.SetGraphicClass(Value: TGraphicClass);
begin
FGraphicClass := Value;
if FPicDlg <> nil then FPicDlg.GraphicClass := Value;
end;
procedure TPictEditor.SetPicture(Value: TPicture);
begin
FPicture.Assign(Value);
end;
{ Utility routines }
function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
const DialogCaption: string): Boolean;
var
PictureEditor: TPictEditor;
begin
Result := False;
if Graphic = nil then Exit;
PictureEditor := TPictEditor.Create(nil);
try
PictureEditor.FPicDlg.Caption := DialogCaption;
PictureEditor.GraphicClass := AClass;
if AClass = nil then
PictureEditor.GraphicClass := TGraphicClass(Graphic.ClassType);
PictureEditor.Picture.Assign(Graphic);
Result := PictureEditor.Execute;
if Result then
if (PictureEditor.Picture.Graphic = nil) or
(PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
Graphic.Assign(PictureEditor.Picture.Graphic)
else Result := False;
finally
PictureEditor.Free;
end;
end;
{ TPictProperty }
procedure TPictProperty.Edit;
var
PictureEditor: TPictEditor;
Comp: TPersistent;
begin
PictureEditor := TPictEditor.Create(nil);
try
Comp := GetComponent(0);
if Comp is TComponent then
PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName;
PictureEditor.Picture := TPicture(Pointer(GetOrdValue));
if PictureEditor.Execute then
SetOrdValue(Longint(PictureEditor.Picture));
finally
PictureEditor.Free;
end;
end;
function TPictProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
function TPictProperty.GetValue: string;
var
Picture: TPicture;
begin
Picture := TPicture(GetOrdValue);
if Picture.Graphic = nil then Result := ResStr(srNone)
else Result := '(' + Picture.Graphic.ClassName + ')';
end;
procedure TPictProperty.SetValue(const Value: string);
begin
if Value = '' then SetOrdValue(0);
end;
{ TGraphicPropertyEditor }
procedure TGraphicPropertyEditor.Edit;
var
PictureEditor: TPictEditor;
Comp: TPersistent;
begin
PictureEditor := TPictEditor.Create(nil);
try
Comp := GetComponent(0);
if Comp is TComponent then
PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName
else PictureEditor.FPicDlg.Caption := GetName;
PictureEditor.GraphicClass := TGraphicClass(GetTypeData(GetPropType)^.ClassType);
PictureEditor.Picture.Graphic := TGraphic(Pointer(GetOrdValue));
if PictureEditor.Execute then
if (PictureEditor.Picture.Graphic = nil) or
(PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
SetOrdValue(LongInt(PictureEditor.Picture.Graphic))
else raise Exception.Create(ResStr(SInvalidPropertyValue));
finally
PictureEditor.Free;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -