📄 jvqbuttons.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
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: JvQButtons.pas,v 1.25 2004/09/11 21:07:02 asnepvangers Exp $
unit JvQButtons;
{$I jvcl.inc}
interface
uses
QWindows, QMessages,
Classes, QGraphics, QControls, QForms, QButtons,
QImgList,
JvQJCLUtils, JvQComponent, JvQExButtons;
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;
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;
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;
TPaintButtonEvent = procedure(Sender: TObject; IsDown, IsDefault: Boolean; State: TButtonState) of object;
TJvaColorButton = class(TJvExBitBtn)
private
FCanvas: TCanvas; // asn: never created
FGlyphDrawer: TJvButtonGlyph;
FOnPaint: TPaintButtonEvent;
protected
IsFocused: Boolean;
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DefaultDrawing(const IsDown, IsDefault: Boolean; const State: TButtonState);
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;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
SysUtils, Math,
JvQHtControls, JvQDsgnIntf, JvQConsts, JvQResources, JvQTypes, JvQThemes;
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; reintroduce;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -