📄 jvxctrls.pas
字号:
protected
FState: TJvButtonState;
//Polaris
FFlatStandard: Boolean;
procedure SetFlatStandard(Value: Boolean);
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
function GetDropDownMenuPos: TPoint;
function GetPalette: HPALETTE; override;
procedure Paint; override;
procedure Loaded; override;
procedure PaintGlyph(Canvas: TCanvas; ARect: TRect; AState: TJvButtonState;
DrawMark: Boolean); virtual;
procedure MouseEnter; reintroduce;
procedure MouseLeave; reintroduce;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
property ButtonGlyph: Pointer read FGlyph;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ButtonClick;
function CheckBtnMenuDropDown: Boolean;
procedure Click; override;
procedure UpdateTracking;
property MouseInControl: Boolean read FMouseInControl;
published
property Action;
property Alignment: TAlignment read GetAlignment write SetAlignment default taCenter;
property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False;
property AllowTimer: Boolean read FAllowTimer write SetAllowTimer default False;
property Anchors;
property BiDiMode;
property Caption;
property Constraints;
{ Ensure group index is declared before Down }
property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;
property Down: Boolean read FDown write SetDown default False;
property DragCursor;
property DragKind;
property DragMode;
property DropDownMenu: TPopupMenu read FDropDownMenu write SetDropDownMenu;
property Enabled;
property Flat: Boolean read FFlat write SetFlat default False;
property FlatStandard: Boolean read FFlatStandard write SetFlatStandard default False;
property Font;
property Glyph: TBitmap read GetGlyph write SetGlyph;
property GrayedInactive: Boolean read FInactiveGrayed write SetInactiveGrayed default True;
property GrayNewStyle: Boolean read GetGrayNewStyle write SetGrayNewStyle default True;
property HintColor: TColor read FHintColor write FHintColor default clInfoBk;
property HotGlyph: TBitmap read FHotGlyph write SetGlyph;
property HotTrack: Boolean read FHotTrack write FHotTrack default False;
property HotTrackFont: TFont read FHotTrackFont write SetHotTrackFont;
property HotTrackFontOptions:TJvTrackFontOptions read FHotTrackFontOptions write SetHotTrackFontOptions default DefaultTrackFontOptions;
property InitPause: Word read FInitRepeatPause write FInitRepeatPause default 500;
property Layout: TButtonLayout read FLayout write SetLayout default blGlyphTop;
property Margin: Integer read FMargin write SetMargin default -1;
property MarkDropDown: Boolean read FMarkDropDown write SetMarkDropDown default True;
property MenuPosition: TJvDropDownMenuPos read FMenuPosition write FMenuPosition default dmpBottom;
property ModalResult: TModalResult read FModalResult write FModalResult default 0;
property NumGlyphs: TJvNumGlyphs read GetNumGlyphs write SetNumGlyphs default 1;
property ParentBiDiMode;
property ParentFont;
property ParentShowHint default False;
property RepeatInterval: Word read FRepeatPause write FRepeatPause default 100;
property ShowHint default True;
property Spacing: Integer read FSpacing write SetSpacing default 1;
property Style: TButtonStyle read FStyle write SetStyle default bsAutoDetect;
property Transparent: Boolean read FTransparent write SetTransparent default False;
property Visible;
property WordWrap: Boolean read GetWordWrap write SetWordWrap default False;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnParentColorChange: TNotifyEvent read FOnParentColorChanged write FOnParentColorChanged;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
property OnEndDock;
property OnStartDock;
end;
TJvButtonImage = class(TObject)
private
FGlyph: TObject;
FButtonSize: TPoint;
FCaption: TCaption;
function GetNumGlyphs: TJvNumGlyphs;
procedure SetNumGlyphs(Value: TJvNumGlyphs);
function GetWordWrap: Boolean;
procedure SetWordWrap(Value: Boolean);
function GetAlignment: TAlignment;
procedure SetAlignment(Value: TAlignment);
function GetGlyph: TBitmap;
procedure SetGlyph(Value: TBitmap);
public
constructor Create;
destructor Destroy; override;
procedure Invalidate;
procedure DrawEx(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
Layout: TButtonLayout; AFont: TFont; Images: TImageList;
ImageIndex: Integer; Flags: Word);
procedure Draw(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
Layout: TButtonLayout; AFont: TFont; Flags: Word);
property Alignment: TAlignment read GetAlignment write SetAlignment;
property Caption: TCaption read FCaption write FCaption;
property Glyph: TBitmap read GetGlyph write SetGlyph;
property NumGlyphs: TJvNumGlyphs read GetNumGlyphs write SetNumGlyphs;
property ButtonSize: TPoint read FButtonSize write FButtonSize;
property WordWrap: Boolean read GetWordWrap write SetWordWrap;
end;
TJvxButtonGlyph = class
private
FAlignment: TAlignment;
FGlyphList: TImageList;
FGrayNewStyle: Boolean;
FIndexs: array[TJvButtonState] of Integer;
FNumGlyphs: TJvNumGlyphs;
FOnChange: TNotifyEvent;
FOriginal: TBitmap;
FTransparentColor: TColor;
FWordWrap: Boolean;
procedure GlyphChanged(Sender: TObject);
procedure SetGlyph(Value: TBitmap);
procedure SetGrayNewStyle(const Value: Boolean);
procedure SetNumGlyphs(Value: TJvNumGlyphs);
function MapColor(Color: TColor): TColor;
protected
procedure MinimizeCaption(Canvas: TCanvas; const Caption: string;
Buffer: PChar; MaxLen, Width: Integer);
function CreateButtonGlyph(State: TJvButtonState): Integer;
function CreateImageGlyph(State: TJvButtonState; Images: TImageList;
Index: Integer): Integer;
procedure CalcButtonLayout(Canvas: TCanvas; const Client: TRect;
var Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
PopupMark: Boolean; var GlyphPos: TPoint; var TextBounds: TRect;
Flags: Word; Images: TImageList; ImageIndex: Integer);
public
constructor Create;
destructor Destroy; override;
procedure Invalidate;
function DrawButtonGlyph(Canvas: TCanvas; X, Y: Integer;
State: TJvButtonState): TPoint;
function DrawButtonImage(Canvas: TCanvas; X, Y: Integer; Images: TImageList;
ImageIndex: Integer; State: TJvButtonState): TPoint;
function DrawEx(Canvas: TCanvas; const Client: TRect; const Caption: string;
Layout: TButtonLayout; Margin, Spacing: Integer; PopupMark: Boolean;
Images: TImageList; ImageIndex: Integer; State: TJvButtonState;
Flags: Word): TRect;
procedure DrawButtonText(Canvas: TCanvas; const Caption: string;
TextBounds: TRect; State: TJvButtonState; Flags: Word);
procedure DrawPopupMark(Canvas: TCanvas; X, Y: Integer;
State: TJvButtonState);
function Draw(Canvas: TCanvas; const Client: TRect; const Caption: string;
Layout: TButtonLayout; Margin, Spacing: Integer; PopupMark: Boolean;
State: TJvButtonState; Flags: Word): TRect;
property Alignment: TAlignment read FAlignment write FAlignment;
property Glyph: TBitmap read FOriginal write SetGlyph;
property GrayNewStyle: Boolean read FGrayNewStyle write SetGrayNewStyle;
property NumGlyphs: TJvNumGlyphs read FNumGlyphs write SetNumGlyphs;
property WordWrap: Boolean read FWordWrap write FWordWrap;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
function DrawShadowText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect;
Format: Word; ShadowSize: Byte; ShadowColor: TColorRef;
ShadowPos: TShadowPosition): Integer;
function CheckBitmap: TBitmap;
implementation
{$R JvxCtrls.res}
uses
SysUtils, Consts, Math, ActnList, CommCtrl,
JvThemes, JvJVCLUtils, JvJCLUtils, JvFunctions;
const
Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
function HeightOf(const R: TRect): Integer;
begin
Result := R.Bottom - R.Top;
end;
function WidthOf(const R: TRect): Integer;
begin
Result := R.Right - R.Left;
end;
//=== TJvTextListBox =========================================================
procedure TJvTextListBox.SetHorizontalExtent;
begin
SendMessage(Handle, LB_SETHORIZONTALEXTENT, FMaxWidth, 0);
end;
function TJvTextListBox.GetItemWidth(Index: Integer): Integer;
var
ATabWidth: Longint;
S: string;
begin
S := Items[Index] + 'x';
if TabWidth > 0 then
begin
ATabWidth := Round((TabWidth * Canvas.TextWidth('0')) * 0.25);
Result := LoWord(GetTabbedTextExtent(Canvas.Handle, @S[1], Length(S),
1, ATabWidth));
end
else
Result := Canvas.TextWidth(S);
end;
procedure TJvTextListBox.ResetHorizontalExtent;
var
I: Integer;
begin
FMaxWidth := 0;
for I := 0 to Items.Count - 1 do
FMaxWidth := Max(FMaxWidth, GetItemWidth(I));
SetHorizontalExtent;
end;
procedure TJvTextListBox.WndProc(var Msg: TMessage);
begin
case Msg.Msg of
LB_ADDSTRING, LB_INSERTSTRING:
begin
inherited WndProc(Msg);
FMaxWidth := Max(FMaxWidth, GetItemWidth(Msg.Result));
SetHorizontalExtent;
end;
LB_DELETESTRING:
begin
if GetItemWidth(Msg.WParam) >= FMaxWidth then
begin
Perform(WM_HSCROLL, SB_TOP, 0);
inherited WndProc(Msg);
ResetHorizontalExtent;
end
else
inherited WndProc(Msg);
end;
LB_RESETCONTENT:
begin
FMaxWidth := 0;
SetHorizontalExtent;
Perform(WM_HSCROLL, SB_TOP, 0);
inherited WndProc(Msg);
end;
WM_SETFONT:
begin
inherited WndProc(Msg);
Canvas.Font.Assign(Self.Font);
ResetHorizontalExtent;
Exit;
end;
else
inherited WndProc(Msg);
end;
end;
//=== TJvListBoxStrings ======================================================
type
TJvListBoxStrings = class(TStrings)
private
ListBox: TJvxCustomListBox;
protected
function Get(Index: Integer): string; override;
function GetCount: Integer; override;
function GetObject(Index: Integer): TObject; override;
procedure PutObject(Index: Integer; AObject: TObject); override;
procedure SetUpdateState(Updating: Boolean); override;
public
function Add(const S: string): Integer; override;
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Insert(Index: Integer; const S: string); override;
end;
function TJvListBoxStrings.GetCount: Integer;
begin
Result := SendMessage(ListBox.Handle, LB_GETCOUNT, 0, 0);
end;
function TJvListBoxStrings.Get(Index: Integer): string;
var
Len: Integer;
Text: array[0..4095] of Char;
begin
Len := SendMessage(ListBox.Handle, LB_GETTEXT, Index,
Longint(@Text));
if Len < 0 then
Error(SListIndexError, Index);
SetString(Result, Text, Len);
end;
function TJvListBoxStrings.GetObject(Index: Integer): TObject;
begin
Result := TObject(ListBox.GetItemData(Index));
if Longint(Result) = LB_ERR then
Error(SListIndexError, Index);
end;
procedure TJvListBoxStrings.PutObject(Index: Integer; AObject: TObject);
begin
ListBox.SetItemData(Index, Longint(AObject));
end;
function TJvListBoxStrings.Add(const S: string): Integer;
begin
Result := SendMessage(ListBox.Handle, LB_ADDSTRING, 0, Longint(PChar(S)));
if Result < 0 then
raise EOutOfResources.Create(SInsertLineError);
end;
procedure TJvListBoxStrings.Insert(Index: Integer; const S: string);
begin
if SendMessage(ListBox.Handle, LB_INSERTSTRING, Index,
Longint(PChar(S))) < 0 then
raise EOutOfResources.Create(SInsertLineError);
end;
procedure TJvListBoxStrings.Delete(Index: Integer);
begin
ListBox.DeleteString(Index);
end;
procedure TJvListBoxStrings.Clear;
begin
ListBox.ResetContent;
end;
procedure TJvListBoxStrings.SetUpdateState(Updating: Boolean);
begin
SendMessage(ListBox.Handle, WM_SETREDRAW, Ord(not Updating), 0);
if not Updating then
ListBox.Refresh;
end;
//=== TJvxCustomListBox ======================================================
{ TJvxCustomListBox implementation copied from STDCTRLS.PAS and modified }
procedure ListIndexError(Index: Integer);
function ReturnAddr: Pointer;
asm
MOV EAX,[EBP+4]
end;
begin
raise EStringListError.CreateFmt(SListIndexError, [Index])at ReturnAddr;
end;
constructor TJvxCustomListBox.Create(AOwner: TComponent);
const
ListBoxStyle = [csSetCaption, csDoubleClicks];
begin
inherited Create(AOwner);
if NewStyleControls then
ControlStyle := ListBoxStyle
else
ControlStyle := ListBoxStyle + [csFramed];
Width := 121;
Height := 97;
TabStop := True;
ParentColor := False;
FItems := CreateItemList;
TJvListBoxStrings(FItems).ListBox := Self;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
FItemHeight := 16;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -