📄 jvbuttons.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvButtons.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
Copyright (c) 1999, 2002 Andrei Prygounkov
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
components : TJvaCaptionButton,
TJvaColorButton,
TJvNoFrameButton,
TJvHTButton
description : Buttons
Known Issues:
Maciej Kaczkowski:
[X] Height of JvHTComboBox - on design time you cannot use mouse for resize
[X] alignment not work correctly on JvHTButtonGlyph
[X] not tested on BCB & Kylix
Create label with caption:
<ALIGN CENTER>Item 1 <b>bold</b> <u>underline</u><br><ALIGN RIGHT><FONT COLOR="clRed">red <FONT COLOR="clgreen">green <FONT COLOR="clblue">blue</i><br><ALIGN LEFT><FONT COLOR="clTeal">Item 2 <i>italic ITALIC</i> <s>strikeout STRIKEOUT </s><hr><br><ALIGN CENTER><FONT COLOR="clRed" BGCOLOR="clYellow">red with yellow background</FONT><FONT COLOR="clwhite"> white <FONT COLOR="clnavy"><b><i>navy</i></b>
Some information about coding:
[?] If you want use few times function <ALIGN> you must use before next <ALIGN>
function <BR>
[?] After <HR> must be <BR>
Changes:
========
Maciej Kaczkowski:
[+] <BR> - new line
[+] <HR> - horizontal line
[+] <S> and </S> - StrikeOut
[+] Multiline for JvHTListBox, JvHTComboBox
TJvHTButton
[+] You can change Height of JvHTComboBox
[+] Tags: & " ® © ™
< >
[+] <ALIGN [CENTER, LEFT, RIGHT]>
[*] <C:color> was changed to ex.:
<FONT COLOR="clRed" BGCOLOR="clWhite">
</FONT>
[*] procedure ItemHtDrawEx - rewrited
[*] function ItemHtPlain - optimized
-----------------------------------------------------------------------------}
// $Id: JvButtons.pas,v 1.41 2005/02/17 10:20:00 marquardt Exp $
unit JvButtons;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Windows, Messages,
Classes, Graphics, Controls, Forms, Buttons,
{$IFDEF VisualCLX}
QImgList,
{$ENDIF VisualCLX}
{$IFDEF VCL}
JvWndProcHook,
{$ENDIF VCL}
JvJCLUtils, JvComponent, JvExButtons;
type
{ VCL Buttons unit does not publish TJvButtonGlyph class,
so we do it for other programers (Delphi 3 version) }
TJvButtonGlyph = class(TObject)
private
FGlyphList: TImageList;
FIndexs: array [TButtonState] of Integer;
FTransparentColor: TColor;
FNumGlyphs: TNumGlyphs;
FOnChange: TNotifyEvent;
FColor: TColor;
{$IFDEF VCL}
FBiDiMode: TBiDiMode; {o}
FParentBiDiMode: Boolean;
procedure SetBiDiMode(Value: TBiDiMode);
procedure SetParentBiDiMode(Value: Boolean);
{$ENDIF VCL}
procedure GlyphChanged(Sender: TObject);
procedure SetGlyph(Value: TBitmap);
procedure SetNumGlyphs(Value: TNumGlyphs);
procedure SetColor(Value: TColor);
procedure Invalidate;
function CreateButtonGlyph(State: TButtonState): Integer;
procedure DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint;
State: TButtonState; Transparent: Boolean);
procedure DrawButtonText(Canvas: TCanvas; const Caption: string;
TextBounds: TRect; State: TButtonState); virtual;
procedure CalcButtonLayout(Canvas: TCanvas; const Client: TRect;
const Offset: TPoint; const Caption: string; Layout: TButtonLayout;
Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect);
protected
FOriginal: TBitmap;
procedure CalcTextRect(Canvas: TCanvas; var TextRect: TRect;
Caption: string); virtual;
public
constructor Create;
destructor Destroy; override;
{ return the text rectangle }
function Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint;
const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
State: TButtonState; Transparent: Boolean): TRect;
{ DrawExternal draws any glyph (not glyph property) -
if you don't needed to save previous glyph set IgnoreOld to True -
this increases performance }
function DrawExternal(AGlyph: TBitmap; ANumGlyphs: TNumGlyphs; AColor: TColor; IgnoreOld: Boolean;
Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string;
Layout: TButtonLayout; Margin, Spacing: Integer; State: TButtonState; Transparent: Boolean): TRect;
{$IFDEF VCL}
property BiDiMode: TBiDiMode read FBiDiMode write SetBiDiMode;
property ParentBiDiMode: Boolean read FParentBiDiMode write SetParentBiDiMode;
{$ENDIF VCL}
property Glyph: TBitmap read FOriginal write SetGlyph;
property NumGlyphs: TNumGlyphs read FNumGlyphs write SetNumGlyphs;
property Color: TColor read FColor write SetColor;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
TJvHTButtonGlyph = class(TJvButtonGlyph)
private
procedure DrawButtonText(Canvas: TCanvas; const Caption: string;
TextBounds: TRect; State: TButtonState); override;
protected
procedure CalcTextRect(Canvas: TCanvas; var TextRect: TRect;
Caption: string); override;
end;
{$IFDEF VCL}
TJvaCaptionButton = class(TJvComponent)
private
FGlyph: TJvButtonGlyph;
FCaption: string;
FLayout: TButtonLayout;
FSpacing: Integer;
FMargin: Integer;
FRect: TRect;
FMouseLButtonDown: Boolean;
FPress: Boolean;
FOnClick: TNotifyEvent;
FBPos: Integer;
FWidth: Integer;
WHook: TJvWindowHook;
FActive: Boolean;
FFont: TFont;
FVisible: Boolean;
procedure DoBeforeMsg(Sender: TObject; var Msg: TMessage; var Handled: Boolean);
procedure DoAfterMsg(Sender: TObject; var Msg: TMessage; var Handled: Boolean);
// procedure HookWndProc(var Msg: TMessage);
procedure Draw;
function MouseOnButton(X, Y: Integer): Boolean;
procedure Resize;
procedure GlyphChanged(Sender: TObject);
function GetHeight: Integer;
function GetWidth: Integer;
function GetLeft: Integer;
procedure SetCaption(Value: string);
function IsCaptionStored: Boolean;
function GetGlyph: TBitmap;
procedure SetGlyph(Value: TBitmap);
function GetNumGlyphs: TNumGlyphs;
procedure SetNumGlyphs(Value: TNumGlyphs);
procedure SetBPos(const Value: Integer);
procedure SetLayout(Value: TButtonLayout);
procedure SetSpacing(Value: Integer);
procedure SetMargin(Value: Integer);
procedure SetWidth(const Value: Integer);
procedure SetFont(Value: TFont);
procedure FontChange(Sender: TObject);
procedure SetDown(const Value: Boolean);
procedure SetVisible(const Value: Boolean);
protected
FState: TButtonState;
function CalcOffset: TPoint;
procedure Changed; dynamic;
function BorderStyle: TFormBorderStyle;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Click; dynamic;
procedure Update;
published
property Position: Integer read FBPos write SetBPos;
property Spacing: Integer read FSpacing write SetSpacing default 4;
property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft;
property Margin: Integer read FMargin write SetMargin default -1;
property Caption: string read FCaption write SetCaption stored IsCaptionStored;
property Width: Integer read FWidth write SetWidth default -1;
property Font: TFont read FFont write SetFont;
property Glyph: TBitmap read GetGlyph write SetGlyph;
property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs default 1;
property Down: Boolean read FPress write SetDown default False;
property Visible: Boolean read FVisible write SetVisible default True;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;
{$ENDIF VCL}
TPaintButtonEvent = procedure(Sender: TObject; IsDown, IsDefault: Boolean; State: TButtonState) of object;
TJvaColorButton = class(TJvExBitBtn)
private
{$IFDEF VisualCLX}
FCanvas: TCanvas; // asn: never created
{$ENDIF VisualCLX}
FGlyphDrawer: TJvButtonGlyph;
FOnPaint: TPaintButtonEvent;
{$IFDEF VCL}
FCanvas: TControlCanvas ;
function GetCanvas: TCanvas;
procedure CNDrawItem(var Msg: TWMDrawItem); message CN_DRAWITEM;
{$ENDIF VCL}
protected
IsFocused: Boolean;
{$IFDEF VCL}
procedure SetButtonStyle(ADefault: Boolean); override;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure Paint; override;
{$ENDIF VisualCLX}
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DefaultDrawing(const IsDown, IsDefault: Boolean; const State: TButtonState);
{$IFDEF VCL}
property Canvas: TCanvas read GetCanvas;
{$ENDIF VCL}
published
property Color;
property ParentColor;
property OnPaint: TPaintButtonEvent read FOnPaint write FOnPaint;
end;
TJvNoFrameButton = class(TJvExSpeedButton)
private
FGlyphDrawer: TJvButtonGlyph;
FNoBorder: Boolean;
FOnPaint: TPaintButtonEvent;
procedure SetNoBorder(Value: Boolean);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DefaultDrawing(const IsDown: Boolean; const State: TButtonState);
property Canvas;
published
property Color;
property ParentColor;
property NoBorder: Boolean read FNoBorder write SetNoBorder;
property OnPaint: TPaintButtonEvent read FOnPaint write FOnPaint;
end;
TJvHTButton = class(TJvaColorButton)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvButtons.pas,v $';
Revision: '$Revision: 1.41 $';
Date: '$Date: 2005/02/17 10:20:00 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
{$IFDEF VCL}
CommCtrl,
{$ENDIF VCL}
SysUtils, Math,
JvHtControls, JvDsgnIntf, JvConsts, JvResources, JvTypes, JvThemes;
type
TJvGlyphList = class(TImageList)
private
FUsed: TBits;
FCount: Integer;
function AllocateIndex: Integer;
public
constructor CreateSize(AWidth, AHeight: Integer);
destructor Destroy; override;
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;
{$IFDEF VisualCLX} reintroduce; {$ENDIF}
procedure Delete(Index: Integer);
property Count: Integer read FCount;
end;
TJvGlyphCache = class(TObject)
private
FGlyphLists: TList;
public
constructor Create;
destructor Destroy; override;
function GetList(AWidth, AHeight: Integer): TJvGlyphList;
procedure ReturnList(List: TJvGlyphList);
function Empty: Boolean;
end;
//=== { TJvGlyphList } =======================================================
constructor TJvGlyphList.CreateSize(AWidth, AHeight: Integer);
begin
inherited CreateSize(AWidth, AHeight);
FUsed := TBits.Create;
end;
destructor TJvGlyphList.Destroy;
begin
FUsed.Free;
inherited Destroy;
end;
function TJvGlyphList.AllocateIndex: Integer;
begin
Result := FUsed.OpenBit;
if Result >= FUsed.Size then
begin
Result := inherited Add(nil, nil);
FUsed.Size := Result + 1;
end;
FUsed[Result] := True;
end;
function TJvGlyphList.AddMasked(Image: TBitmap; MaskColor: TColor): Integer;
begin
Result := AllocateIndex;
ReplaceMasked(Result, Image, MaskColor);
Inc(FCount);
end;
procedure TJvGlyphList.Delete(Index: Integer);
begin
if FUsed[Index] then
begin
Dec(FCount);
FUsed[Index] := False;
end;
end;
//=== { TJvGlyphCache } ======================================================
constructor TJvGlyphCache.Create;
begin
inherited Create;
FGlyphLists := TList.Create;
end;
destructor TJvGlyphCache.Destroy;
begin
FGlyphLists.Free;
inherited Destroy;
end;
function TJvGlyphCache.GetList(AWidth, AHeight: Integer): TJvGlyphList;
var
I: Integer;
begin
for I := FGlyphLists.Count - 1 downto 0 do
begin
Result := FGlyphLists[I];
with Result do
if (AWidth = Width) and (AHeight = Height) then
Exit;
end;
Result := TJvGlyphList.CreateSize(AWidth, AHeight);
FGlyphLists.Add(Result);
end;
procedure TJvGlyphCache.ReturnList(List: TJvGlyphList);
begin
if List = nil then
Exit;
if List.Count = 0 then
begin
FGlyphLists.Remove(List);
List.Free;
end;
end;
function TJvGlyphCache.Empty: Boolean;
begin
Result := FGlyphLists.Count = 0;
end;
//=== { TJvButtonGlyph } =====================================================
var
GlyphCache: TJvGlyphCache = nil;
Pattern: TBitmap = nil;
procedure CreateBrushPattern(FaceColor, HighLightColor: TColor);
var
X, Y: Integer;
begin
Pattern := TBitmap.Create;
Pattern.Width := 8;
Pattern.Height := 8;
with Pattern.Canvas do
begin
Brush.Style := bsSolid;
Brush.Color := FaceColor; // clBtnFace
FillRect(Rect(0, 0, Pattern.Width, Pattern.Height));
for Y := 0 to 7 do
for X := 0 to 7 do
if (Y mod 2) = (X mod 2) then { toggles between even/odd pixels }
Pixels[X, Y] := HighLightColor; {clBtnHighlight}; { on even/odd rows }
end;
end;
constructor TJvButtonGlyph.Create;
var
I: TButtonState;
begin
inherited Create;
FOriginal := TBitmap.Create;
FOriginal.OnChange := GlyphChanged;
FTransparentColor := clOlive;
FNumGlyphs := 1;
for I := Low(I) to High(I) do
FIndexs[I] := -1;
if GlyphCache = nil then
GlyphCache := TJvGlyphCache.Create;
end;
destructor TJvButtonGlyph.Destroy;
begin
FOriginal.Free;
Invalidate;
if Assigned(GlyphCache) and GlyphCache.Empty then
begin
GlyphCache.Free;
GlyphCache := nil;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -