📄 bsskinhint.pas
字号:
{*******************************************************************}
{ }
{ Almediadev Visual Component Library }
{ BusinessSkinForm }
{ Version 2.74 }
{ }
{ Copyright (c) 2000-2004 Almediadev }
{ ALL RIGHTS RESERVED }
{ }
{ Home: http://www.almdev.com }
{ Support: support@almdev.com }
{ }
{*******************************************************************}
{$P+,S-,W-,R-}
{$WARNINGS OFF}
{$HINTS OFF}
unit bsSkinHint;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
bsSkinData, ExtCtrls;
type
TbsSkinHint = class;
TbsSkinHintWindow = class(THintWindow)
private
NewClRect: TRect;
NewLTPoint, NewRTPoint,
NewLBPoint, NewRBPoint: TPoint;
FspHint: TbsSkinHint;
DrawBuffer: TBitMap;
FSD: TbsSkinData;
FRgn: HRGN;
FOldAlphaBlend: Boolean;
FOldAlphaBlendValue: Byte;
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
procedure WMEraseBkGnd(var Msg: TWMEraseBkgnd); message WM_EraseBkgnd;
function FindHintComponent: TBSSKINHINT;
procedure CalcHintSize(Cnvs: TCanvas; S: String; var W, H: Integer);
protected
procedure SetHintWindowRegion;
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ActivateHint(Rect: TRect; const AHint: string); override;
end;
TbsSkinHint = class(TComponent)
private
FOnShowHint: TShowHintEvent;
FActive: Boolean;
FSD: TbsSkinData;
HW: TbsSkinHintWindow;
FAlphaBlend: Boolean;
FAlphaBlendValue: Byte;
FDefaultFont: TFont;
FUseSkinFont: Boolean;
HintTimer: TTimer;
HintText: String;
procedure SetActive(Value: Boolean);
procedure SetDefaultFont(Value: TFont);
procedure HintTime1(Sender: TObject);
procedure HintTime2(Sender: TObject);
protected
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetSkinData(Value: TbsSkinData);
procedure SelfOnShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetCursorHeightMargin: Integer;
procedure ActivateHint(P: TPoint; const AHint: string);
procedure ActivateHint2(const AHint: string);
function IsVisible: Boolean;
procedure HideHint;
published
property SkinData: TbsSkinData read FSD write SetSkinData;
property Active: Boolean read FActive write SetActive;
property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint;
end;
implementation
Uses bsUtils;
constructor TbsSkinHintWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FRgn := 0;
FOldAlphaBlend := False;
FOldAlphaBlendValue := 0;
end;
destructor TbsSkinHintWindow.Destroy;
begin
inherited Destroy;
if FRgn <> 0 then DeleteObject(FRgn);
end;
procedure TbsSkinHintWindow.WMNCPaint(var Message: TMessage);
begin
end;
procedure TbsSkinHintWindow.SetHintWindowRegion;
var
TempRgn: HRgn;
MaskPicture: TBitMap;
begin
if (FSD <> nil) and (FSD.HintWindow.MaskPictureIndex <> -1)
then
begin
TempRgn := FRgn;
with FSD.HintWindow do
begin
MaskPicture := TBitMap(FSD.FActivePictures[MaskPictureIndex]);
CreateSkinRegion
(FRgn, LTPoint, RTPoint, LBPoint, RBPoint, ClRect,
NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewClRect,
MaskPicture, Width, Height);
end;
SetWindowRgn(Handle, FRgn, False);
if TempRgn <> 0 then DeleteObject(TempRgn);
end
else
if FRgn <> 0 then
begin
SetWindowRgn(Handle, 0, False);
DeleteObject(FRgn);
FRgn := 0;
end;
end;
procedure TbsSkinHintWindow.CalcHintSize(Cnvs: TCanvas; S: String; var W, H: Integer);
var
R: TRect;
PW, PH, OX, OY: Integer;
begin
R := Rect(0, 0, 0, 0);
DrawText(Cnvs.Handle, PChar(S), -1, R, DT_CALCRECT or DT_LEFT);
W := RectWidth(R);
H := RectHeight(R);
if FSD <> nil
then
begin
with FSD.HintWindow do
begin
PW := TBitMap(FSD.FActivePictures[WindowPictureIndex]).Width;
PH := TBitMap(FSD.FActivePictures[WindowPictureIndex]).Height;
W := W + ClRect.Left + (PW - ClRect.Right);
H := H + ClRect.Top + (PH - ClRect.Bottom);
if W < PW then W := PW;
if H < PH then H := PH;
OX := W - PW;
OY := H - PH;
NewClRect := ClRect;
Inc(NewClRect.Right, OX);
Inc(NewClRect.Bottom, OY);
NewLTPoint := LTPoint;
NewRTPoint := Point(RTPoint.X + OX, RTPoint.Y);
NewLBPoint := Point(LBPoint.X, LBPoint.Y + OY);
NewRBPoint := Point(RBPoint.X + OX, RBPoint.Y + OY);
end;
end
else
begin
Inc(W, 4);
Inc(H, 4);
end;
end;
function TbsSkinHintWindow.FindHintComponent;
var
i: Integer;
begin
Result := nil;
if (Application.MainForm <> nil) and
(Application.MainForm.ComponentCount > 0)
then
with Application.MainForm do
for i := 0 to ComponentCount - 1 do
if (Components[i] is TbsSkinHint) and
(TbsSkinHint(Components[i]).Active)
then
begin
Result := TbsSkinHint(Components[i]);
Break;
end;
end;
procedure TbsSkinHintWindow.ActivateHint(Rect: TRect; const AHint: string);
const
WS_EX_LAYERED = $80000;
AnimationStep = 1;
var
HintWidth, HintHeight: Integer;
CanSkin: Boolean;
i: Integer;
begin
FspHint := FindHintComponent;
if FspHint = nil then Exit;
if not FspHint.Active then Exit;
CanSkin := ((FspHint.FSD <> nil) and (not FspHInt.FSD.Empty) and
(FspHint.FSD.HintWindow.WindowPictureIndex <> -1));
//
if CanSkin then FSD := FspHint.FSD else FSD := nil;
if FSD <> nil
then
begin
with Canvas, FSD.HintWindow do
begin
if FspHint.UseSkinFont
then
begin
Font.Height := FontHeight;
Font.Name := FontName;
Font.Style := FontStyle;
Font.CharSet := FspHint.DefaultFont.CharSet;
end
else
Font.Assign(FspHint.FDefaultFont);
end;
end
else
with Canvas do
begin
Font.Assign(FspHint.FDefaultFont);
end;
Caption := AHint;
CalcHintSize(Canvas, Caption, HintWidth, HintHeight);
Rect.Right := Rect.Left + HintWidth;
Rect.Bottom := Rect.Top + HIntHeight;
//
{if Rect.Right > Screen.Width then OffsetRect(Rect, - (Rect.Right - Screen.Width), 0);
if Rect.Bottom > Screen.Height then OffsetRect(Rect, 0, - (Rect.Bottom - Screen.Height));}
if (Rect.Right > Screen.Width) then OffsetRect(Rect, -HintWidth - 2, 0);
if (Rect.Bottom > Screen.Height) then OffsetRect(Rect, 0, -HintHeight - 2);
//
BoundsRect := Rect;
//
if CheckW2KWXP
then
begin
if FspHint.AlphaBlend and not FOldAlphaBlend
then
begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
end
else
if not FspHint.AlphaBlend and FOldAlphaBlend
then
begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_LAYERED));
end;
FOldAlphaBlend := FspHint.AlphaBlend;
if (FOldAlphaBlendValue <> FspHint.AlphaBlendValue) and FspHint.AlphaBlend
then
begin
SetAlphaBlendTransparent(Handle, FspHint.AlphaBlendValue);
FOldAlphaBlendValue := FspHint.AlphaBlendValue;
end;
end;
//
SetHintWindowRegion;
SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, 0,
0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
Visible := True;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -