📄 jvqlookout.pas
字号:
const
cSpeed = 20;
cHeight = 19;
cInitTime = 400;
cTimeDelay = 120;
{ utility }
{ this creates a correctly masked bitmap - for use with D2 TImageList }
{
procedure CreateMaskedImageList(ImageList: TImageList);
var
Bmp: TBitmap;
I: Integer;
begin
Bmp := TBitmap.Create;
Bmp.Width := ImageList.Width;
Bmp.Height := ImageList.Height;
try
for I := 0 to ImageList.Count - 1 do
begin
ImageList.GetBitmap(I,Bmp);
ImageList.ReplaceMasked(I,Bmp,Bmp.TransparentColor);
end;
finally
Bmp.Free;
end;
end;
}
{ returns number of visible children }
{
function NoOfVisibles(Control: TWinControl): Integer;
var
R: TRect;
I: Integer;
begin
R := Control.ClientRect;
Result := 0;
if Control = nil then
Exit;
for I := 0 to Control.ControlCount - 1 do
if (PtInRect(R,Point(R.Left + 1,Control.Controls[I].Top)) and
PtInRect(R,Point(R.Left + 1,Control.Controls[I].Top + Control.Controls[I].Height))) then
Inc(Result);
end;
}
{
function IMax(Val1, Val2: Integer): Integer;
begin
Result := Val1;
if Val2 > Val1 then
Result := Val2;
end;
function IMin(Val1, Val2: Integer): Integer;
begin
Result := Val1;
if Val2 < Val1 then
Result := Val2;
end;
}
{ returns Atleast if Value < AtLeast, Val1 otherwise }
{
function IAtLeast(Value, AtLeast: Integer): Integer;
begin
Result := Value;
if Value < AtLeast then
Result := AtLeast;
end;
}
//=== { TJvLookOutEdit } =====================================================
type
TJvLookOutEdit = class(TEdit)
private
procedure DoExit; override;
end;
procedure TJvLookOutEdit.DoExit;
begin
Visible := False;
// (ahuser) What is with OnExit() ?
end;
//=== { TJvLookOutButtonActionLink } =========================================
type
TJvLookOutButtonActionLink = class(TControlActionLink)
protected
FClient: TJvCustomLookOutButton;
procedure AssignClient(AClient: TObject); override;
function IsCheckedLinked: Boolean; override;
procedure SetChecked(Value: Boolean); override;
end;
procedure TJvLookOutButtonActionLink.AssignClient(AClient: TObject);
begin
inherited AssignClient(AClient);
FClient := AClient as TJvCustomLookOutButton;
end;
function TJvLookOutButtonActionLink.IsCheckedLinked: Boolean;
begin
Result := inherited IsCheckedLinked and
(FClient.Down = (Action as TCustomAction).Checked);
end;
procedure TJvLookOutButtonActionLink.SetChecked(Value: Boolean);
begin
if IsCheckedLinked then
FClient.Down := Value;
end;
//=== { TJvUpArrowBtn } ======================================================
constructor TJvUpArrowBtn.Create(AOwner: TComponent);
var
FSize: Word;
begin
inherited Create(AOwner);
ControlStyle := [csCaptureMouse, csClickEvents, csSetCaption];
ParentColor := True;
FDown := False;
FAutoRepeat := False;
FFlat := False;
FSize := GetSystemMetrics(SM_CXVSCROLL);
SetBounds(0, 0, FSize, FSize);
end;
procedure TJvUpArrowBtn.SetFlat(Value: Boolean);
begin
if FFlat <> Value then
begin
FFlat := Value;
Invalidate;
end;
end;
procedure TJvUpArrowBtn.MouseEnter(Control: TControl);
begin
if csDesigning in ComponentState then
Exit;
if not MouseOver then
begin
inherited MouseEnter(Control);
if FFlat then
Invalidate;
end;
end;
procedure TJvUpArrowBtn.MouseLeave(Control: TControl);
begin
if MouseOver then
begin
inherited MouseLeave(Control);
// FDown := False;
if FFlat then
Invalidate;
end;
end;
procedure TJvUpArrowBtn.Paint;
var
Flags: Integer;
R: TRect;
begin
// if not Visible then Exit;
R := GetClientRect;
if FDown then
Flags := DFCS_PUSHED
else
Flags := 0;
if not Enabled then
Flags := Flags or DFCS_INACTIVE;
if FFlat and not MouseOver then
begin
Flags := Flags or DFCS_FLAT;
OffsetRect(R, 0, -2);
end;
if FFlat then
InflateRect(R, 1, 1);
if MouseOver then
Flags := Flags or DFCS_HOT;
Canvas.Brush.Color := Color;
Canvas.Pen.Color := Color;
DrawThemedFrameControl(Self, Canvas.Handle, R, DFC_SCROLL, DFCS_SCROLLUP or Flags);
if FFlat and MouseOver then
begin
R := GetClientRect;
if FDown then
Frame3D(Canvas, R, clBlack, clWhite, 1)
else
Frame3D(Canvas, R, clWhite, clBlack, 1);
end;
end;
procedure TJvUpArrowBtn.Click;
begin
if Enabled then
begin
inherited Click;
ReleaseCapture;
end;
end;
procedure TJvUpArrowBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDown := True;
inherited MouseDown(Button, Shift, X, Y);
if Parent is TJvLookOutPage then
FAutoRepeat := TJvLookOutPage(Parent).AutoRepeat;
if FAutoRepeat then
begin
if not Assigned(FTimer) then
FTimer := TTimer.Create(Self);
with FTimer do
begin
OnTimer := OnTime;
Interval := cInitTime;
Enabled := True;
end;
end;
Repaint;
end;
procedure TJvUpArrowBtn.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
inherited MouseUp(Button, Shift, X, Y);
if Assigned(FTimer) then
begin
FTimer.Free;
FTimer := nil;
end;
FDown := False;
(Parent as TJvLookOutPage).UpArrowClick(Self);
end;
procedure TJvUpArrowBtn.OnTime(Sender: TObject);
var
R: TRect;
begin
FTimer.Interval := cTimeDelay;
if FDown and MouseCapture and Visible then
begin
(Parent as TJvLookOutPage).UpArrowClick(Self);
R := Parent.ClientRect;
R := Rect(R.Left, R.Top + cHeight, R.Right, R.Bottom);
InvalidateRect(Parent.Handle, @R, False);
Parent.Update;
end;
end;
//=== { TJvDwnArrowBtn } =====================================================
constructor TJvDwnArrowBtn.Create(AOwner: TComponent);
var
FSize: Word;
begin
inherited Create(AOwner);
ControlStyle := [csCaptureMouse, csClickEvents, csSetCaption];
ParentColor := True;
FDown := False;
FFlat := False;
FSize := GetSystemMetrics(SM_CXVSCROLL);
SetBounds(0, 0, FSize, FSize);
end;
procedure TJvDwnArrowBtn.Paint;
var
Flags: Integer;
R: TRect;
begin
// if not Visible then Exit;
R := GetClientRect;
if FDown then
Flags := DFCS_PUSHED
else
Flags := 0;
if not Enabled then
Flags := Flags or DFCS_INACTIVE;
if FFlat and not MouseOver then
begin
Flags := Flags or DFCS_FLAT;
OffsetRect(R, 0, 2);
end;
if FFlat then
InflateRect(R, 1, 1);
if MouseOver then
Flags := Flags or DFCS_HOT;
Canvas.Brush.Color := Color;
Canvas.Pen.Color := Color;
DrawThemedFrameControl(Self, Canvas.Handle, R, DFC_SCROLL, DFCS_SCROLLDOWN or Flags);
if FFlat and MouseOver then
begin
R := GetClientRect;
if FDown then
Frame3D(Canvas, R, clBlack, clBtnShadow, 1)
else
Frame3D(Canvas, R, clWhite, clBlack, 1);
end;
end;
procedure TJvDwnArrowBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDown := True;
// inherited MouseDown(Button, Shift, X, Y);
if Assigned(OnMouseDown) then
OnMouseDown(Self, Button, Shift, X, Y);
if Parent is TJvLookOutPage then
FAutoRepeat := TJvLookOutPage(Parent).AutoRepeat;
if FAutoRepeat then
begin
if not Assigned(FTimer) then
FTimer := TTimer.Create(Self);
with FTimer do
begin
OnTimer := OnTime;
Interval := cInitTime;
Enabled := True;
end;
end;
Repaint;
end;
procedure TJvDwnArrowBtn.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
// inherited MouseUp(Button, Shift, X, Y);
if Assigned(OnMouseUp) then
OnMouseUp(Self, Button, Shift, X, Y);
FDown := False;
(Parent as TJvLookOutPage).DownArrowClick(Self);
// Parent.ScrollBy(0,-50);
if Assigned(FTimer) then
begin
FTimer.Free;
FTimer := nil;
end;
Repaint;
end;
procedure TJvDwnArrowBtn.OnTime(Sender: TObject);
var
R: TRect;
begin
FTimer.Interval := cTimeDelay;
if FDown and MouseCapture then
begin
(Parent as TJvLookOutPage).DownArrowClick(Self);
// Parent.ScrollBy(0,-50);
R := Parent.ClientRect;
R := Rect(R.Left, R.Top + cHeight, R.Right, R.Bottom);
InvalidateRect(Parent.Handle, @R, False);
Parent.Update;
if not Visible then
FDown := False;
end;
end;
//=== { TJvCustomLookOutButton } =============================================
constructor TJvCustomLookOutButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csCaptureMouse, csClickEvents];
FButtonBorder := bbDark;
FParentImageSize := True;
FImageSize := isLarge;
FFillColor := clNone;
FSpacing := 4;
FOffset := 0;
FStayDown := False;
FHighlightFont := TFont.Create;
FHighlightFont.Assign(Font);
Width := 60;
Height := 60;
FLargeImageChangeLink := TChangeLink.Create;
FSmallImageChangeLink := TChangeLink.Create;
FLargeImageChangeLink.OnChange := ImageListChange;
FSmallImageChangeLink.OnChange := ImageListChange;
end;
destructor TJvCustomLookOutButton.Destroy;
begin
FEdit.Free;
FLargeImageChangeLink.Free;
FSmallImageChangeLink.Free;
FHighlightFont.Free;
inherited Destroy;
end;
procedure TJvCustomLookOutButton.Click;
begin
inherited Click;
end;
procedure TJvCustomLookOutButton.EditCaption;
begin
if not Assigned(FEdit) then
begin
FEdit := TJvLookOutEdit.Create(nil);
FEdit.Parent := Self.Parent;
FEdit.Visible := False;
end;
FEdit.SetBounds(Left + FTextRect.Left, Top + FTextRect.Top,
Width, FTextRect.Bottom - FTextRect.Top);
with FEdit do
begin
Text := FCaption;
BorderStyle := bsNone;
AutoSelect := True;
OnKeyPress := EditKeyDown;
OnMouseDown := EditMouseDown;
if not Visible then
Show;
SetFocus;
SetCapture(FEdit.Handle);
SelStart := 0;
SelLength := Length(FCaption);
end;
end;
procedure TJvCustomLookOutButton.DoOnEdited(var Caption: string);
begin
if Assigned(FOnEdited) then
FOnEdited(Self, Caption);
end;
procedure TJvCustomLookOutButton.EditKeyDown(Sender: TObject; var Key: Char);
var
ACaption: string;
Modify: Boolean;
begin
Modify := False;
if Sender = FEdit then
case Key of
Cr:
begin
ACaption := FEdit.Text;
DoOnEdited(ACaption);
FEdit.Text := ACaption;
Key := #0;
Modify := True;
if FEdit.Handle = GetCapture then
ReleaseCapture;
FEdit.Hide;
FEdit.Free;
FEdit := nil;
Screen.Cursor := crDefault;
end;
Esc:
begin
Key := #0;
if FEdit.Handle = GetCapture then
ReleaseCapture;
FEdit.Hide;
FEdit.Free;
FEdit := nil;
Screen.Cursor := crDefault;
end;
end;
if Modify then
FCaption := ACaption;
end;
procedure TJvCustomLookOutButton.EditMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -