📄 jvqsecretpanel.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: JvSecretPanel.pas, released on 2003-10-19.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
Contributor(s):
Polaris Software
Peter Thornqvist [peter3 at sourceforge dot net]
Changes:
2003-10-19:
* Moved TJvSecretPanel from JvxCtrls to this unit
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvQSecretPanel.pas,v 1.15 2004/12/01 22:53:20 asnepvangers Exp $
unit JvQSecretPanel;
{$I jvcl.inc}
interface
uses
QWindows, QMessages, Classes, QGraphics, QControls, QExtCtrls, QForms,
JvQTimer, JvQComponent, JvQTypes;
type
TGlyphLayout = (glGlyphLeft, glGlyphRight, glGlyphTop, glGlyphBottom);
TScrollDirection = (sdVertical, sdHorizontal);
TPanelDrawEvent = procedure(Sender: TObject; Canvas: TCanvas; Rect: TRect) of object;
TJvSecretPanel = class(TJvCustomPanel)
private
FActive: Boolean;
FAlignment: TAlignment;
FLines: TStringList;
FCycled: Boolean;
FScrollCnt: Integer;
FMaxScroll: Integer;
FTxtDivider: Byte;
FFirstLine: Integer;
FTimer: TJvTimer;
FTxtRect: TRect;
FPaintRect: TRect;
FGlyphOrigin: TPoint;
FMemoryImage: TBitmap;
FGlyph: TBitmap;
FHiddenList: TList;
FTextStyle: TPanelBevel;
FDirection: TScrollDirection;
FGlyphLayout: TGlyphLayout;
FOnPaintClient: TPanelDrawEvent;
FOnStartPlay: TNotifyEvent;
FOnStopPlay: TNotifyEvent;
FAsyncDrawing: Boolean;
procedure SetAsyncDrawing(Value: Boolean);
function GetInflateWidth: Integer;
function GetInterval: Cardinal;
function GetLines: TStrings;
procedure SetInterval(Value: Cardinal);
procedure SetGlyph(Value: TBitmap);
procedure SetLines(Value: TStrings);
procedure SetActive(Value: Boolean);
procedure SetAlignment(Value: TAlignment);
procedure SetGlyphLayout(Value: TGlyphLayout);
procedure SetTextStyle(Value: TPanelBevel);
procedure SetDirection(Value: TScrollDirection);
procedure RecalcDrawRect;
procedure PaintGlyph;
procedure PaintText;
procedure UpdateMemoryImage;
procedure GlyphChanged(Sender: TObject);
procedure LinesChanged(Sender: TObject);
protected
procedure FontChanged; override;
procedure ColorChanged; override;
procedure BoundsChanged; override;
procedure AlignControls(AControl: TControl; var Rect: TRect); override;
procedure Paint; override;
procedure PaintClient(Canvas: TCanvas; Rect: TRect); virtual;
procedure TimerExpired(Sender: TObject); virtual;
procedure StartPlay; dynamic;
procedure StopPlay; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Play;
procedure Stop;
property Canvas;
published
property AsyncDrawing: Boolean read FAsyncDrawing write SetAsyncDrawing default True;
property Active: Boolean read FActive write SetActive default False;
property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;
property Cycled: Boolean read FCycled write FCycled default False;
property Glyph: TBitmap read FGlyph write SetGlyph;
property GlyphLayout: TGlyphLayout read FGlyphLayout write SetGlyphLayout
default glGlyphLeft;
property Interval: Cardinal read GetInterval write SetInterval default 30;
property Lines: TStrings read GetLines write SetLines;
property ScrollDirection: TScrollDirection read FDirection write SetDirection
default sdVertical;
property TextStyle: TPanelBevel read FTextStyle write SetTextStyle default bvNone;
property Anchors;
property Constraints;
property Align;
property BevelInner;
property BevelOuter default bvLowered;
property BevelWidth;
property BorderWidth;
property BorderStyle;
property Color;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnPaintClient: TPanelDrawEvent read FOnPaintClient write FOnPaintClient;
property OnStartPlay: TNotifyEvent read FOnStartPlay write FOnStartPlay;
property OnStopPlay: TNotifyEvent read FOnStopPlay write FOnStopPlay;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
property OnContextPopup;
property OnResize;
end;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
QConsts, SysUtils, Math, QActnList,
JvQJCLUtils, JvQJVCLUtils, JvQThemes, JvQConsts;
const
Alignments: array [TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
// WordWraps: array [Boolean] of Word = (0, DT_WORDBREAK); make Delphi 5 compiler happy // andreas
//=== { TJvSecretPanel } =====================================================
constructor TJvSecretPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FScrollCnt := 0;
FAlignment := taCenter;
FActive := False;
FTxtDivider := 1;
FGlyphLayout := glGlyphLeft;
ControlStyle := ControlStyle - [csSetCaption];
BevelOuter := bvLowered;
FTextStyle := bvNone;
FLines := TStringList.Create;
FLines.OnChange := LinesChanged;
FGlyph := TBitmap.Create;
FGlyph.OnChange := GlyphChanged;
FHiddenList := TList.Create;
FTimer := TJvTimer.Create(Self);
with FTimer do
begin
Enabled := False;
OnTimer := TimerExpired;
Interval := 30;
SyncEvent := False;
FAsyncDrawing := True;
end;
end;
destructor TJvSecretPanel.Destroy;
begin
SetActive(False);
FGlyph.OnChange := nil;
FGlyph.Free;
FLines.OnChange := nil;
FLines.Free;
FHiddenList.Free;
inherited Destroy;
end;
procedure TJvSecretPanel.GlyphChanged(Sender: TObject);
begin
if Active then
begin
UpdateMemoryImage;
Invalidate;
end;
end;
procedure TJvSecretPanel.LinesChanged(Sender: TObject);
begin
if Active then
begin
FScrollCnt := 0;
UpdateMemoryImage;
Invalidate;
end;
end;
procedure TJvSecretPanel.FontChanged;
begin
inherited FontChanged;
if Active then
UpdateMemoryImage;
end;
procedure TJvSecretPanel.ColorChanged;
begin
inherited ColorChanged;
if Active then
UpdateMemoryImage;
end;
procedure TJvSecretPanel.BoundsChanged;
begin
inherited BoundsChanged;
if Active then
begin
UpdateMemoryImage;
Invalidate;
end;
end;
procedure TJvSecretPanel.SetAsyncDrawing(Value: Boolean);
begin
if FAsyncDrawing <> Value then
begin
FTimer.SyncEvent := not Value;
FAsyncDrawing := Value;
end;
end;
procedure TJvSecretPanel.AlignControls(AControl: TControl; var Rect: TRect);
begin
inherited AlignControls(AControl, Rect);
if (AControl = nil) and Active then
UpdateMemoryImage;
end;
function TJvSecretPanel.GetInflateWidth: Integer;
begin
Result := BorderWidth;
if BevelOuter <> bvNone then
Inc(Result, BevelWidth);
if BevelInner <> bvNone then
Inc(Result, BevelWidth);
end;
procedure TJvSecretPanel.RecalcDrawRect;
const
MinOffset = 3;
var
InflateWidth: Integer;
LastLine: Integer;
begin
FTxtRect := GetClientRect;
FPaintRect := FTxtRect;
InflateWidth := GetInflateWidth;
InflateRect(FPaintRect, -InflateWidth, -InflateWidth);
Inc(InflateWidth, MinOffset);
InflateRect(FTxtRect, -InflateWidth, -InflateWidth);
with FGlyphOrigin do
begin
case FGlyphLayout of
glGlyphLeft:
begin
X := FTxtRect.Left;
Y := (FTxtRect.Bottom + FTxtRect.Top - Glyph.Height) div 2;
if Y < FTxtRect.Top then
Y := FTxtRect.Top;
if Glyph.Width > 0 then
begin
Inc(X, MinOffset);
FTxtRect.Left := X + Glyph.Width + InflateWidth;
end;
end;
glGlyphRight:
begin
Y := (FTxtRect.Bottom + FTxtRect.Top - Glyph.Height) div 2;
if Y < FTxtRect.Top then
Y := FTxtRect.Top;
X := FTxtRect.Right - Glyph.Width;
if Glyph.Width > 0 then
begin
Dec(X, MinOffset);
if X < FTxtRect.Left then
X := FTxtRect.Left;
FTxtRect.Right := X - InflateWidth;
end;
end;
glGlyphTop:
begin
Y := FTxtRect.Top;
X := (FTxtRect.Right + FTxtRect.Left - Glyph.Width) div 2;
if X < FTxtRect.Left then
X := FTxtRect.Left;
if Glyph.Height > 0 then
begin
Inc(Y, MinOffset);
FTxtRect.Top := Y + Glyph.Height + (InflateWidth + MinOffset);
end;
end;
glGlyphBottom:
begin
X := (FTxtRect.Right + FTxtRect.Left - Glyph.Width) div 2;
if X < FTxtRect.Left then
X := FTxtRect.Left;
Y := FTxtRect.Bottom - Glyph.Height;
if Glyph.Height > 0 then
begin
Dec(Y, MinOffset);
if Y < FTxtRect.Top then
Y := FTxtRect.Top;
FTxtRect.Bottom := Y - (InflateWidth + MinOffset);
end;
end;
end;
end;
if FDirection = sdHorizontal then
begin
LastLine := Lines.Count - 1;
while (LastLine >= 0) and (Trim(Lines[LastLine]) = '') do
Dec(LastLine);
InflateWidth := RectHeight(FTxtRect) -
(LastLine + 1 - FFirstLine) * FTxtDivider;
if InflateWidth > 0 then
InflateRect(FTxtRect, 0, -InflateWidth div 2);
end;
with FTxtRect do
if (Left >= Right) or (Top >= Bottom) then
FTxtRect := Rect(0, 0, 0, 0);
end;
procedure TJvSecretPanel.PaintGlyph;
begin
if not FGlyph.Empty then
begin
RecalcDrawRect;
DrawBitmapTransparent(Canvas, FGlyphOrigin.X, FGlyphOrigin.Y,
FGlyph, FGlyph.TransparentColor and not PaletteMask);
end;
end;
procedure TJvSecretPanel.PaintText;
var
STmp: array [0..255] of Char;
R: TRect;
I: Integer;
Flags: Longint;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -