📄 jvqcomctrls.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: JvComCtrls.PAS, released Oct 10, 1999.
The Initial Developer of the Original Code is Petr Vones (petr dott v att mujmail dott cz)
Portions created by Petr Vones are Copyright (C) 1999 Petr Vones.
Portions created by Microsoft are Copyright (C) 1998, 1999 Microsoft Corp.
All Rights Reserved.
Contributor(s):
Peter Below [100113 dott 1101 att compuserve dott com] - alternate TJvPageControl.OwnerDraw routine
Peter Th鰎nqvist [peter3 at sourceforge dot net] added TJvIPAddress.AddressValues and TJvPageControl.ReduceMemoryUse
Alfi [alioscia_alessi att onde dott net] alternate TJvPageControl.OwnerDraw routine
Rudy Velthuis - ShowRange in TJvTrackBar
Andreas Hausladen - TJvIPAddress designtime bug, components changed to JvExVCL
Kai Gossens - TJvIPAddress: changing Color, drawing bug on XP (fat frame on edits removed)
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:
TJvTreeView:
When dragging an item and MultiSelect is True droptarget node is not painted
correctly.
-----------------------------------------------------------------------------}
// $Id: JvQComCtrls.pas,v 1.13 2005/02/06 14:06:02 asnepvangers Exp $
unit JvQComCtrls;
{$I jvcl.inc}
interface
uses
QWindows, QMessages, Contnrs, QGraphics, QControls, QForms,
Classes, // (ahuser) "Classes" after "Forms" (D5 warning)
QMenus, QComCtrls, QImgList, QButtons,
QExtCtrls,
JvQJVCLUtils, JvQComponent, JvQExControls, JvQExComCtrls, JvQTypes;
const
JvDefPageControlBorder = 4;
JvDefaultInactiveColorFrom = TColor($D7D7D7);
JvDefaultInactiveColorTo= TColor($ADADAD);
type
// TJvHintSource is a hint enumeration type to describe how to display hints for
// controls that have hint properties both for the main control as well as
// for it's subitems (like a PageControl)
// TODO: (p3) this should really be moved to JvTypes or something...
TJvHintSource =
(
hsDefault, // use default hint behaviour (i.e as regular control)
hsForceMain, // use the main hint even if subitems have hints
hsForceChildren, // always use subitems hints even if empty
hsPreferMain, // use main control hint unless empty then use subitems hints
hsPreferChildren // use subitems hints unless empty then use main control hint
);
// painters that can be used to draw the tabs of a TPageControl or TTabControl
TJvTabControlPainter = class(TJvComponent)
private
FClients: TList;
protected
// descendants must override and implement this method
procedure DrawTab(AControl: TCustomTabControl; Canvas: TCanvas;
Images: TCustomImageList; ImageIndex: Integer; const Caption: string;
const Rect: TRect; Active, Enabled: Boolean); virtual; abstract;
procedure Change; virtual;
procedure RegisterChange(AControl: TCustomTabControl);
procedure UnRegisterChange(AControl: TCustomTabControl);
procedure Notification(AComponent: TComponent; Operation: TOperation);
override;
public
destructor Destroy; override;
end;
TJvTabDefaultPainter = class(TJvTabControlPainter)
private
FActiveFont: TFont;
FDisabledFont: TFont;
FInactiveFont: TFont;
FInactiveColorTo: TColor;
FActiveColorTo: TColor;
FDisabledColorTo: TColor;
FInactiveColorFrom: TColor;
FActiveColorFrom: TColor;
FDisabledColorFrom: TColor;
FActiveGradientDirection: TFillDirection;
FInactiveGradientDirection: TFillDirection;
FDisabledGradientDirection: TFillDirection;
FGlyphLayout: TButtonLayout;
FDivider: Boolean;
FShowFocus: Boolean;
procedure SetActiveFont(const Value: TFont);
procedure SetDisabledFont(const Value: TFont);
procedure SetInactiveFont(const Value: TFont);
procedure SetActiveColorFrom(const Value: TColor);
procedure SetActiveColorTo(const Value: TColor);
procedure SetActiveGradientDirection(const Value: TFillDirection);
procedure SetDisabledColorFrom(const Value: TColor);
procedure SetDisabledColorTo(const Value: TColor);
procedure SetDisabledGradientDirection(const Value: TFillDirection);
procedure SetInactiveColorFrom(const Value: TColor);
procedure SetInactiveColorTo(const Value: TColor);
procedure SetInactiveGradientDirection(const Value: TFillDirection);
function IsActiveFontStored: Boolean;
function IsInactiveFontStored: Boolean;
function IsDisabledFontStored: Boolean;
procedure SetGlyphLayout(const Value: TButtonLayout);
procedure SetDivider(const Value: Boolean);
procedure SetShowFocus(const Value: Boolean);
protected
procedure DrawTab(AControl: TCustomTabControl; Canvas: TCanvas;
Images: TCustomImageList; ImageIndex: Integer; const Caption: string;
const Rect: TRect; Active, Enabled: Boolean); override;
procedure DoFontChange(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ActiveFont: TFont read FActiveFont write SetActiveFont stored IsActiveFontStored;
property ActiveColorFrom: TColor read FActiveColorFrom write SetActiveColorFrom default clWhite;
property ActiveColorTo: TColor read FActiveColorTo write SetActiveColorTo default clBtnFace;
property ActiveGradientDirection: TFillDirection read FActiveGradientDirection write SetActiveGradientDirection default fdTopToBottom;
property InactiveFont: TFont read FInactiveFont write SetInactiveFont stored IsInactiveFontStored;
property InactiveColorFrom: TColor read FInactiveColorFrom write SetInactiveColorFrom default JvDefaultInactiveColorFrom;
property InactiveColorTo: TColor read FInactiveColorTo write SetInactiveColorTo default JvDefaultInactiveColorTo;
property InactiveGradientDirection: TFillDirection read FInactiveGradientDirection write SetInactiveGradientDirection default fdTopToBottom;
property DisabledFont: TFont read FDisabledFont write SetDisabledFont stored IsDisabledFontStored;
property DisabledColorFrom: TColor read FDisabledColorFrom write SetDisabledColorFrom default clBtnFace;
property DisabledColorTo: TColor read FDisabledColorTo write SetDisabledColorTo default clBtnFace;
property DisabledGradientDirection: TFillDirection read FDisabledGradientDirection write SetDisabledGradientDirection default fdTopToBottom;
property GlyphLayout: TButtonLayout read FGlyphLayout write SetGlyphLayout default blGlyphLeft;
property Divider: Boolean read FDivider write SetDivider default False;
property ShowFocus: Boolean read FShowFocus write SetShowFocus default False;
end;
TJvTabControl = class(TJvExTabControl)
private
FTabPainter: TJvTabControlPainter;
FRightClickSelect: Boolean;
procedure SetTabPainter(const Value: TJvTabControlPainter); // not WantKeys
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
function DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean): Boolean; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
published
property RightClickSelect: Boolean read FRightClickSelect write FRightClickSelect default False;
property TabPainter: TJvTabControlPainter read FTabPainter write SetTabPainter;
property HintColor;
property OnMouseEnter;
property OnMouseLeave;
property OnParentColorChange;
property Color;
end;
TJvPageControl = class(TJvExPageControl)
private
FClientBorderWidth: TBorderWidth;
FHideAllTabs: Boolean;
FHandleGlobalTab: Boolean;
FHintSource: TJvHintSource;
FReduceMemoryUse: Boolean;
FTabPainter: TJvTabControlPainter;
FRightClickSelect: Boolean;
procedure SetClientBorderWidth(const Value: TBorderWidth);
procedure SetHideAllTabs(const Value: Boolean);
function FormKeyPreview: Boolean;
procedure SetReduceMemoryUse(const Value: Boolean);
procedure SetTabPainter(const Value: TJvTabControlPainter);
protected
function HintShow(var HintInfo: THintInfo): Boolean; override;
function WantKey(Key: Integer; Shift: TShiftState;
const KeyText: WideString): Boolean; override;
procedure Loaded; override;
function CanChange: Boolean; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
function DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean): Boolean; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
procedure UpdateTabImages;
published
property TabPainter: TJvTabControlPainter read FTabPainter write SetTabPainter;
property HintSource: TJvHintSource read FHintSource write FHintSource default hsDefault;
property HandleGlobalTab: Boolean read FHandleGlobalTab write FHandleGlobalTab default False;
property ClientBorderWidth: TBorderWidth read FClientBorderWidth write SetClientBorderWidth default JvDefPageControlBorder;
property ParentColor;
property RightClickSelect: Boolean read FRightClickSelect write FRightClickSelect default False;
property ReduceMemoryUse: Boolean read FReduceMemoryUse write SetReduceMemoryUse default False;
property HideAllTabs: Boolean read FHideAllTabs write SetHideAllTabs default False;
property HintColor;
property OnMouseEnter;
property OnMouseLeave;
property OnParentColorChange;
property Color;
end;
TJvTrackToolTipSide = (tsLeft, tsTop, tsRight, tsBottom);
TJvTrackToolTipEvent = procedure(Sender: TObject; var ToolTipText: string) of object;
TJvTrackBar = class(TJvExTrackBar)
private
FOnChanged: TNotifyEvent;
FShowRange: Boolean;
procedure SetShowRange(const Value: Boolean);
protected
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
published
property ShowRange: Boolean read FShowRange write SetShowRange default True;
property HintColor;
property OnMouseEnter;
property OnMouseLeave;
property OnParentColorChange;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
property Color;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
SysUtils,
JclStrings,
JvQConsts, JvQJCLUtils;
//=== { TJvTabControlPainter } ===============================================
destructor TJvTabControlPainter.Destroy;
begin
if FClients <> nil then
while FClients.Count > 0 do
UnRegisterChange(TCustomTabControl(FClients.Last));
FreeAndNil(FClients);
inherited Destroy;
end;
procedure TJvTabControlPainter.Change;
var
I: Integer;
begin
if FClients <> nil then
for I := 0 to FClients.Count - 1 do
TCustomTabControl(FClients[I]).Invalidate;
end;
procedure TJvTabControlPainter.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent is TCustomTabControl) and (FClients <> nil) then
FClients.Remove(AComponent);
end;
procedure TJvTabControlPainter.RegisterChange(AControl: TCustomTabControl);
begin
if FClients = nil then
FClients := TList.Create;
if AControl <> nil then
begin
FClients.Add(AControl);
AControl.FreeNotification(Self);
AControl.Invalidate;
end;
end;
procedure TJvTabControlPainter.UnRegisterChange(AControl: TCustomTabControl);
begin
if FClients <> nil then
begin
FClients.Remove(AControl);
if (AControl <> nil) and not (csDestroying in AControl.ComponentState) then
AControl.Invalidate;
end;
end;
//=== { TJvTabDefaultPainter } ===============================================
constructor TJvTabDefaultPainter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FActiveFont := TFont.Create;
if Owner is TForm then
FActiveFont.Assign(TForm(Owner).Font)
else
FActiveFont.Assign(Screen.HintFont);
FActiveFont.Color := clHighlight;
FActiveFont.OnChange := DoFontChange;
FActiveColorFrom := clWhite;
FActiveColorTo := clBtnFace;
FActiveGradientDirection := fdTopToBottom;
FDisabledFont := TFont.Create;
if Owner is TForm then
FDisabledFont.Assign(TForm(Owner).Font)
else
FDisabledFont.Assign(Screen.HintFont);
FDisabledFont.Color := clGrayText;
FDisabledFont.OnChange := DoFontChange;
FDisabledColorFrom := clBtnFace;
FDisabledColorTo := clBtnFace;
FDisabledGradientDirection := fdTopToBottom;
FInactiveFont := TFont.Create;
if Owner is TForm then
FInactiveFont.Assign(TForm(Owner).Font)
else
FInactiveFont.Assign(Screen.HintFont);
FInactiveFont.OnChange := DoFontChange;
FInactiveColorFrom := JvDefaultInactiveColorFrom;
FInactiveColorTo := JvDefaultInactiveColorTo;
FInactiveGradientDirection := fdTopToBottom;
FGlyphLayout := blGlyphLeft;
end;
destructor TJvTabDefaultPainter.Destroy;
begin
FActiveFont.Free;
FDisabledFont.Free;
FInactiveFont.Free;
inherited Destroy;
end;
procedure TJvTabDefaultPainter.DoFontChange(Sender: TObject);
begin
Change;
end;
procedure TJvTabDefaultPainter.DrawTab(AControl: TCustomTabControl;
Canvas: TCanvas; Images: TCustomImageList; ImageIndex: Integer;
const Caption: string; const Rect: TRect; Active, Enabled: Boolean);
var
TextRect, ImageRect: TRect;
SaveState: Integer;
procedure DrawDivider(X, Y, X1, Y1: Integer);
begin
Canvas.Pen.Color := clBtnShadow;
Canvas.MoveTo(X, Y);
Canvas.LineTo(X1, Y1);
Canvas.Pen.Color := clHighlightText;
Canvas.MoveTo(X + 1, Y + 1);
Canvas.LineTo(X1 + 1, Y1 + 1);
end;
begin
TextRect := Rect;
ImageRect := Rect;
if not Enabled then
begin
GradientFillRect(Canvas, TextRect, DisabledColorFrom, DisabledColorTo, DisabledGradientDirection, 255);
Canvas.Font := DisabledFont;
end
else
if Active then
begin
GradientFillRect(Canvas, TextRect, ActiveColorFrom, ActiveColorTo, ActiveGradientDirection, 255);
Canvas.Font := ActiveFont;
end
else
begin
GradientFillRect(Canvas, TextRect, InactiveColorFrom, InactiveColorTo, InactiveGradientDirection, 255);
Canvas.Font := InactiveFont;
end;
if Assigned(Images) and (ImageIndex >= 0) and (ImageIndex < Images.Count) then
begin // GlyphLayout is only used if we have images
case GlyphLayout of
blGlyphLeft:
begin
Inc(ImageRect.Left, 4);
ImageRect.Right := ImageRect.Left + Images.Width + 4;
TextRect.Left := ImageRect.Right;
end;
blGlyphRight:
begin
Dec(ImageRect.Right, 4);
ImageRect.Left := ImageRect.Right - Images.Width - 4;
TextRect.Right := ImageRect.Left;
end;
blGlyphTop:
begin
Dec(ImageRect.Bottom, RectHeight(Rect) div 2);
TextRect.Top := ImageRect.Bottom;
if Divider and (Caption <> '') then
DrawDivider(Rect.Left + 4 + Ord(Active), Rect.Top + RectHeight(Rect) div 2, Rect.Right - 4 - Ord(Active), Rect.Top + RectHeight(Rect) div 2);
end;
blGlyphBottom:
begin
Inc(ImageRect.Top, RectHeight(Rect) div 2);
TextRect.Bottom := ImageRect.Top;
if Divider and (Caption <> '') then
DrawDivider(Rect.Left + 4 + Ord(Active), Rect.Top + RectHeight(Rect) div 2, Rect.Right - 4 - Ord(Active), Rect.Top + RectHeight(Rect) div 2);
end;
end;
InflateRect(ImageRect, -(RectWidth(ImageRect) - Images.Width) div 2, -(RectHeight(ImageRect) - Images.Height) div 2);
SaveState := SaveDC(Canvas.Handle);
try
Images.Draw(Canvas, ImageRect.Left, ImageRect.Top, ImageIndex,
itImage,
Enabled);
finally
RestoreDC(Canvas.Handle, SaveState);
end;
end;
if Caption <> '' then
begin
// InflateRect(TextRect, -2, -2);
SetBkMode(Canvas.Handle, TRANSPARENT);
DrawText(Canvas, Caption, Length(Caption), TextRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
if Active and ShowFocus then
begin
TextRect := Rect;
InflateRect(TextRect, -3, -3);
Canvas.DrawFocusRect(TextRect);
end;
end;
procedure TJvTabDefaultPainter.SetActiveColorFrom(const Value: TColor);
begin
if FActiveColorFrom <> Value then
begin
FActiveColorFrom := Value;
Change;
end;
end;
procedure TJvTabDefaultPainter.SetActiveFont(const Value: TFont);
begin
FActiveFont.Assign(Value);
end;
procedure TJvTabDefaultPainter.SetActiveColorTo(const Value: TColor);
begin
if FActiveColorTo <> Value then
begin
FActiveColorTo := Value;
Change;
end;
end;
procedure TJvTabDefaultPainter.SetActiveGradientDirection(
const Value: TFillDirection);
begin
if FActiveGradientDirection <> Value then
begin
FActiveGradientDirection := Value;
Change;
end;
end;
procedure TJvTabDefaultPainter.SetDisabledColorFrom(const Value: TColor);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -