cxrichedit.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,877 行 · 第 1/5 页
PAS
1,877 行
{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressEditors }
{ }
{ Copyright (c) 1998-2008 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL }
{ ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{********************************************************************}
unit cxRichEdit;
{$I cxVer.inc}
interface
uses
Variants, Windows, Messages, ActiveX, OleDlg, OleConst, OleCtnrs, Classes,
ClipBrd, ComCtrls, Controls, Dialogs, Forms, Graphics,
Menus, RichEdit, StdCtrls, SysUtils, cxClasses, cxContainer,
cxControls, cxEdit, cxDrawTextUtils, cxGraphics, cxLookAndFeels, cxMemo,
cxScrollbar, cxTextEdit;
(*$HPPEMIT 'DECLARE_DINTERFACE_TYPE(IOleLink);'*)
type
TcxRichEditStreamMode = (resmSelection, resmPlainRtf, resmRtfNoObjs, resmUnicode, resmTextIzed);
TcxRichEditStreamModes = set of TcxRichEditStreamMode;
TcxTextRange = record
chrg: TCharRange;
lpstrText: PAnsiChar;
end;
TReObject = packed record
cbStruct: DWORD; // Size of structure
cp: Cardinal; // Character position of object
clsid: TCLSID; // Class ID of object
oleobj: IOleObject; // OLE object interface
stg: IStorage; // Associated storage interface
olesite: IOLEClientSite;// Associated client site interface
sizel: TSize; // Size of object (may be 0,0)
dvaspect: DWORD; // Display aspect to use
dwFlags: DWORD; // Object status flags
dwUser: DWORD; // Dword for user's use
end;
TcxCustomRichEdit = class;
TcxRichEditURLClickEvent = procedure(Sender: TcxCustomRichEdit; const URLText: string;
Button: TMouseButton) of object;
TcxRichEditURLMoveEvent = procedure(Sender: TcxCustomRichEdit; const URLText: string) of object;
TcxRichEditQueryInsertObjectEvent = procedure(Sender: TcxCustomRichEdit; var AAllowInsertObject: Boolean;
const ACLSID: TCLSID) of object;
TcxCustomRichEditViewInfo = class(TcxCustomMemoViewInfo)
public
DrawBitmap: HBITMAP;
IsDrawBitmapDirty: Boolean;
PrevDrawBitmapSize: TSize;
constructor Create; override;
destructor Destroy; override;
procedure DrawNativeStyleEditBackground(ACanvas: TcxCanvas; ADrawBackground: Boolean;
ABackgroundStyle: TcxEditBackgroundPaintingStyle; ABackgroundBrush: TBrushHandle); override;
procedure DrawText(ACanvas: TcxCanvas); override;
function GetUpdateRegion(AViewInfo: TcxContainerViewInfo): TcxRegion; override;
function NeedShowHint(ACanvas: TcxCanvas; const P: TPoint;
const AVisibleBounds: TRect; out AText: TCaption;
out AIsMultiLine: Boolean; out ATextRect: TRect): Boolean; override;
procedure Paint(ACanvas: TcxCanvas); override;
end;
TcxCustomRichEditProperties = class;
TcxCustomRichEditViewData = class(TcxCustomMemoViewData)
private
function GetProperties: TcxCustomRichEditProperties;
protected
function InternalGetEditContentSize(ACanvas: TcxCanvas;
const AEditValue: TcxEditValue;
const AEditSizeProperties: TcxEditSizeProperties): TSize; override;
public
procedure Calculate(ACanvas: TcxCanvas; const ABounds: TRect; const P: TPoint;
Button: TcxMouseButton; Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo;
AIsMouseEvent: Boolean); override;
property Properties: TcxCustomRichEditProperties read GetProperties;
end;
{IRichEditOleCallback}
TcxRichInnerEdit = class;
IcxRichEditOleCallback = interface(IUnknown)
['{00020D00-0000-0000-C000-000000000046}']
function GetNewStorage(out stg: IStorage): HRESULT; stdcall;
function GetInPlaceContext(out Frame: IOleInPlaceFrame;
out Doc: IOleInPlaceUIWindow; lpFrameInfo: POleInPlaceFrameInfo): HRESULT; stdcall;
function ShowContainerUI(fShow: BOOL): HRESULT; stdcall;
function QueryInsertObject(const clsid: TCLSID; stg: IStorage; cp: longint): HRESULT; stdcall;
function DeleteObject(oleobj: IOLEObject): HRESULT; stdcall;
function QueryAcceptData(dataobj: IDataObject; var cfFormat: TClipFormat;
reco: DWORD; fReally: BOOL; hMetaPict: HGLOBAL): HRESULT; stdcall;
function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall;
function GetClipboardData(const chrg: TCharRange; reco: DWORD;
out dataobj: IDataObject): HRESULT; stdcall;
function GetDragDropEffect(fDrag: BOOL; grfKeyState: DWORD;
var dwEffect: DWORD): HRESULT; stdcall;
function GetContextMenu(seltype: Word; oleobj: IOleObject;
const chrg: TCharRange; var menu: HMENU): HRESULT; stdcall;
end;
{ IRichEditOle }
IcxRichEditOle = interface(IUnknown)
['{00020D00-0000-0000-C000-000000000046}']
function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;
function GetObjectCount: HResult; stdcall;
function GetLinkCount: HResult; stdcall;
function GetObject(iob: Longint; out reobject: TReObject;
dwFlags: DWORD): HResult; stdcall;
function InsertObject(var reobject: TReObject): HResult; stdcall;
function ConvertObject(iob: Longint; rclsidNew: TIID;
lpstrUserTypeNew: LPCSTR): HResult; stdcall;
function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
function SetHostNames(lpstrContainerApp: LPCSTR;
lpstrContainerObj: LPCSTR): HResult; stdcall;
function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
function HandsOffStorage(iob: Longint): HResult; stdcall;
function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
function InPlaceDeactivate: HResult; stdcall;
function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
function GetClipboardData(var chrg: TCharRange; reco: DWORD;
out dataobj: IDataObject): HResult; stdcall;
function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;
hMetaPict: HGLOBAL): HResult; stdcall;
end;
{ TcxRichEditOleCallback }
TcxRichEditOleCallback = class(TcxIUnknownObject, IcxRichEditOleCallback)
private
FEdit: TcxRichInnerEdit;
FDocParentForm: IVCLFrameForm;
FParentFrame: IVCLFrameForm;
FAccelTable: HAccel;
FAccelCount: Integer;
procedure AssignParentFrame;
procedure CreateAccelTable;
procedure DestroyAccelTable;
protected
property ParentFrame: IVCLFrameForm read FParentFrame;
property DocParentForm: IVCLFrameForm read FDocParentForm;
public
constructor Create(AOwner: TcxRichInnerEdit);
//IRichEditOleCallback
function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall;
function DeleteObject(oleobj: IOLEObject): HRESULT; stdcall;
function GetClipboardData(const chrg: TCharRange; reco: DWORD;
out dataobj: IDataObject): HRESULT; stdcall;
function GetContextMenu(seltype: Word; oleobj: IOleObject;
const chrg: TCharRange; var menu: HMENU): HRESULT; stdcall;
function GetDragDropEffect(fDrag: BOOL; grfKeyState: DWORD;
var dwEffect: DWORD): HRESULT; stdcall;
function GetInPlaceContext(out Frame: IOleInPlaceFrame;
out Doc: IOleInPlaceUIWindow; lpFrameInfo: POleInPlaceFrameInfo): HRESULT; stdcall;
function GetNewStorage(out stg: IStorage): HRESULT; stdcall;
function QueryInsertObject(const clsid: TCLSID; stg: IStorage; cp: longint): HRESULT; stdcall;
function QueryAcceptData(dataobj: IDataObject; var cfFormat: TClipFormat;
reco: DWORD; fReally: BOOL; hMetaPict: HGLOBAL): HRESULT; stdcall;
function ShowContainerUI(fShow: BOOL): HRESULT; stdcall;
end;
{ TcxCustomRichEditProperties }
TcxCustomRichEditProperties = class(TcxCustomMemoProperties)
private
FAllowObjects: Boolean;
FAutoURLDetect: Boolean;
FHideScrollBars: Boolean;
FMemoMode: Boolean;
FPlainText: Boolean;
FPlainTextChanged: Boolean;
FSelectionBar: Boolean;
FStreamModes: TcxRichEditStreamModes;
FOnQueryInsertObject: TcxRichEditQueryInsertObjectEvent;
FOnProtectChange: TRichEditProtectChange;
FOnResizeRequest: TRichEditResizeEvent;
FOnSaveClipboard: TRichEditSaveClipboard;
FOnSelectionChange: TNotifyEvent;
FOnURLClick: TcxRichEditURLClickEvent;
FOnURLMove: TcxRichEditURLMoveEvent;
procedure SetAllowObjects(const Value: Boolean);
procedure SetAutoURLDetect(const Value: Boolean);
procedure SetHideScrollBars(Value: Boolean);
procedure SetMemoMode(Value: Boolean);
procedure SetPlainText(Value: Boolean);
procedure SetSelectionBar(Value: Boolean);
procedure SetStreamModes(const Value: TcxRichEditStreamModes);
procedure SetOnQueryInsertObject(Value: TcxRichEditQueryInsertObjectEvent);
protected
function CanValidate: Boolean; override;
class function GetViewDataClass: TcxCustomEditViewDataClass; override;
property PlainTextChanged: Boolean read FPlainTextChanged;
public
constructor Create(AOwner: TPersistent); override;
procedure Assign(Source: TPersistent); override;
class function GetContainerClass: TcxContainerClass; override;
function GetDisplayText(const AEditValue: TcxEditValue;
AFullText: Boolean = False; AIsInplace: Boolean = True): WideString; override;
function GetSupportedOperations: TcxEditSupportedOperations; override;
class function GetViewInfoClass: TcxContainerViewInfoClass; override;
function IsResetEditClass: Boolean; override;
property AllowObjects: Boolean read FAllowObjects write SetAllowObjects default False;
property AutoURLDetect: Boolean read FAutoURLDetect write SetAutoURLDetect default False;
property PlainText: Boolean read FPlainText write SetPlainText default False;
// !!!
property HideScrollBars: Boolean read FHideScrollBars
write SetHideScrollBars default True;
property MemoMode: Boolean read FMemoMode write SetMemoMode default False;
property SelectionBar: Boolean read FSelectionBar write SetSelectionBar
default False;
property StreamModes: TcxRichEditStreamModes read FStreamModes
write SetStreamModes default [];
property OnQueryInsertObject: TcxRichEditQueryInsertObjectEvent read FOnQueryInsertObject
write SetOnQueryInsertObject;
property OnProtectChange: TRichEditProtectChange read FOnProtectChange
write FOnProtectChange;
property OnResizeRequest: TRichEditResizeEvent read FOnResizeRequest
write FOnResizeRequest;
property OnSaveClipboard: TRichEditSaveClipboard read FOnSaveClipboard
write FOnSaveClipboard;
property OnSelectionChange: TNotifyEvent read FOnSelectionChange
write FOnSelectionChange;
property OnURLClick: TcxRichEditURLClickEvent read FOnURLClick
write FOnURLClick;
property OnURLMove: TcxRichEditURLMoveEvent read FOnURLMove
write FOnURLMove;
end;
{ TcxRichEditProperties }
TcxRichEditProperties = class(TcxCustomRichEditProperties)
published
property Alignment;
property AllowObjects;
property AssignedValues;
property AutoSelect;
property AutoURLDetect;
property ClearKey;
property HideScrollBars;
property HideSelection;
property ImeMode;
property ImeName;
property MaxLength;
property MemoMode;
property OEMConvert;
property PlainText;
property ReadOnly;
property ScrollBars;
property SelectionBar;
property StreamModes;
property VisibleLineCount;
property WantReturns;
property WantTabs;
property WordWrap;
property OnQueryInsertObject;
property OnChange;
property OnEditValueChanged;
property OnProtectChange;
property OnResizeRequest;
property OnSaveClipboard;
property OnSelectionChange;
property OnURLClick;
property OnURLMove;
end;
{ TcxOleUILinkInfo }
TcxOleUILinkInfo = class(TcxIUnknownObject, IOleUILinkInfo)
private
FRichEdit: TcxRichInnerEdit;
FReObject: TReObject;
FOleLink: IOleLink;
public
constructor Create(AOwner: TcxRichInnerEdit; AReObject: TReObject);
destructor Destroy; override;
//IOleUILinkInfo
function GetLastUpdate(dwLink: Longint; var LastUpdate: TFileTime): HResult; stdcall;
//IOleUILinkContainer
function GetNextLink(dwLink: Longint): Longint; stdcall;
function SetLinkUpdateOptions(dwLink: Longint; dwUpdateOpt: Longint): HResult; stdcall;
function GetLinkUpdateOptions(dwLink: Longint;
var dwUpdateOpt: Longint): HResult; stdcall;
function SetLinkSource(dwLink: Longint; pszDisplayName: PChar;
lenFileName: Longint; var chEaten: Longint;
fValidateSource: BOOL): HResult; stdcall;
function GetLinkSource(dwLink: Longint; var pszDisplayName: PChar;
var lenFileName: Longint; var pszFullLinkType: PChar;
var pszShortLinkType: PChar; var fSourceAvailable: BOOL;
var fIsSelected: BOOL): HResult; stdcall;
function OpenLinkSource(dwLink: Longint): HResult; stdcall;
function UpdateLink(dwLink: Longint; fErrorMessage: BOOL;
fErrorAction: BOOL): HResult; stdcall;
function CancelLink(dwLink: Longint): HResult; stdcall;
end;
{ TcxOleUIObjInfo }
TcxOleUIObjInfo = class(TcxIUnknownObject, IOleUIObjInfo)
private
FRichEdit: TcxRichInnerEdit;
FReObject: TReObject;
function GetObjectDataSize: Integer;
public
constructor Create(AOwner: TcxRichInnerEdit; AReObject: TReObject);
//IOleUIObjInfo
function GetObjectInfo(dwObject: Longint;
var dwObjSize: Longint; var lpszLabel: PChar;
var lpszType: PChar; var lpszShortType: PChar;
var lpszLocation: PChar): HResult; stdcall;
function GetConvertInfo(dwObject: Longint; var ClassID: TCLSID;
var wFormat: Word; var ConvertDefaultClassID: TCLSID;
var lpClsidExclude: PCLSID; var cClsidExclude: Longint): HResult; stdcall;
function ConvertObject(dwObject: Longint; const clsidNew: TCLSID): HResult; stdcall;
function GetViewInfo(dwObject: Longint; var hMetaPict: HGlobal;
var dvAspect: Longint; var nCurrentScale: Integer): HResult; stdcall;
function SetViewInfo(dwObject: Longint; hMetaPict: HGlobal;
dvAspect: Longint; nCurrentScale: Integer;
bRelativeToOrig: BOOL): HResult; stdcall;
end;
{ TcxCustomRichEdit }
TcxCustomRichEdit = class(TcxCustomMemo)
private
FEditPopupMenu: TComponent;
FIsNullEditValue: Boolean;
FLastLineCount: Integer;
FPropertiesChange: Boolean;
procedure DoProtectChange(Sender: TObject; AStartPos, AEndPos: Integer;
var AAllowChange: Boolean);
procedure DoSaveClipboard(Sender: TObject; ANumObjects, ANumChars: Integer;
var ASaveClipboard: Boolean);
procedure EditPopupMenuClick(Sender: TObject);
function GetLines: TStrings;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?