📄 skinhint.pas
字号:
{*******************************************************************}
{ }
{ Almediadev Visual Component Library }
{ DynamicSkinForm }
{ Version 6.85 }
{ }
{ 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 SkinHint;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SkinData, ExtCtrls;
type
TspSkinHint = class;
TspSkinHintWindow = class(THintWindow)
private
NewClRect: TRect;
NewLTPoint, NewRTPoint,
NewLBPoint, NewRBPoint: TPoint;
FspHint: TspSkinHint;
DrawBuffer: TBitMap;
FSD: TspSkinData;
SI: TBitMap;
FRgn: HRGN;
OldAlphaBlend: Boolean;
OldAlphaBlendValue: Integer;
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
procedure WMEraseBkGnd(var Msg: TWMEraseBkgnd); message WM_EraseBkgnd;
function FindHintComponent: TspSkinHint;
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;
TspSkinHint = class(TComponent)
private
FOnShowHint: TShowHintEvent;
FActive: Boolean;
FSD: TspSkinData;
HW: TspSkinHintWindow;
FAlphaBlendSupport: Boolean;
FDefaultFont: TFont;
FUseSkinFont: Boolean;
HintTimer: TTimer;
HintText: String;
procedure SetDefaultFont(Value: TFont);
procedure SetActive(Value: Boolean);
procedure SetAlphaBlendSupport(Value: Boolean);
procedure HintTime1(Sender: TObject);
procedure HintTime2(Sender: TObject);
protected
FAlphaBlend: Boolean;
FAlphaBlendValue: Byte;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetSkinData(Value: TspSkinData);
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);
procedure HideHint;
function IsVisible: Boolean;
published
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
property AlphaBlendSupport: Boolean read FAlphaBlendSupport
write SetAlphaBlendSupport;
property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
property AlphaBlendValue: Byte
read FAlphaBlendValue write FAlphaBlendValue;
property SkinData: TspSkinData read FSD write SetSkinData;
property Active: Boolean read FActive write SetActive;
property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint;
end;
implementation
Uses spUtils, spEffBmp;
const
CS_DROPSHADOW_ = $20000;
constructor TspSkinHintWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SI := TBitMap.Create;
FRgn := 0;
OldAlphaBlend := False;
OldAlphaBlendValue := 0;
end;
destructor TspSkinHintWindow.Destroy;
begin
SI.Free;
inherited Destroy;
if FRgn <> 0 then DeleteObject(FRgn);
end;
procedure TspSkinHintWindow.WMNCPaint(var Message: TMessage);
begin
end;
procedure TspSkinHintWindow.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 TspSkinHintWindow.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 TspSkinHintWindow.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 TspSkinHint) and
(TspSkinHint(Components[i]).Active)
then
begin
Result := TspSkinHint(Components[i]);
Break;
end;
end;
procedure TspSkinHintWindow.ActivateHint(Rect: TRect; const AHint: string);
const
WS_EX_LAYERED = $80000;
var
HintWidth, HintHeight: Integer;
CanSkin: Boolean;
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;
end
else
Font.Assign(FspHint.FDefaultFont);
end;
end
else
with Canvas do
begin
Font.Assign(FspHint.FDefaultFont);
end;
if (FspHint.SkinData <> nil) and (FspHint.SkinData.ResourceStrData <> nil)
then
Canvas.Font.CharSet := FspHint.SkinData.ResourceStrData.CharSet
else
Canvas.Font.CharSet := FspHint.DefaultFont.CharSet;
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, -HintWidth-2, 0);
if (Rect.Bottom > Screen.Height) then OffsetRect(Rect, 0, -HintHeight-2);
//
BoundsRect := Rect;
if (OldAlphaBlend <> FspHint.AlphaBlend) and FSpHint.AlphaBlendSupport
then
begin
if OldAlphaBlend
then
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_LAYERED))
else
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
or WS_EX_LAYERED);
SetAlphaBlendTransparent(Handle, FspHint.AlphaBlendValue);
end;
OldAlphaBlend := FspHint.AlphaBlend;
end;
if (OldAlphaBlendValue <> FspHint.AlphaBlendValue) and FSpHint.AlphaBlendSupport and
FspHint.AlphaBlend
then
begin
SetAlphaBlendTransparent(Handle, FspHint.AlphaBlendValue);
OldAlphaBlendValue := FspHint.AlphaBlendValue;
end;
//
if FspHint.AlphaBlend and not FspHint.AlphaBlendSupport
then
begin
SI.Width := Width;
SI.Height := Height;
GetScreenImage(Rect.Left, Rect.Top, SI);
end;
//
SetHintWindowRegion;
//
SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, 0,
0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE);
Visible := True;
end;
procedure TspSkinHintWindow.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style - WS_BORDER;
if CheckWXP
then
Params.WindowClass.Style := Params.WindowClass.style or CS_DROPSHADOW_;
end;
procedure TspSkinHintWindow.Paint;
var
R: TRect;
kf: Double;
EB1, EB2: TspEffectBmp;
B: TBitMap;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -