home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 September
/
Chip_2001-09_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
RMCTL.ZIP
/
rmHint.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-06-22
|
4KB
|
154 lines
{================================================================================
Copyright (C) 1997-2001 Mills Enterprise
Unit : rmHint
Purpose : Minor enhancements to the original VCL THintWindow. Used in other
unit's of the rmControl library.
Date : 10-26-2000
Author : Ryan J. Mills
Version : 1.80
================================================================================}
unit rmHint;
interface
{$I CompilerDefines.INC}
uses messages, windows, controls, classes, Graphics;
type
TrmHintWindow = class(TCustomControl)
private
FActivating: Boolean;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
procedure ActivateHint(Rect: TRect; const AHint: string); virtual;
procedure ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer); virtual;
function CalcHintRect(MaxWidth: Integer; const AHint: string;
AData: Pointer): TRect; virtual;
function IsHintMsg(var Msg: TMsg): Boolean; virtual;
procedure ReleaseHandle;
property BiDiMode;
property Caption;
property Color;
property Canvas;
property Font;
end;
implementation
uses Forms, extctrls;
{ TrmHintWindow }
constructor TrmHintWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Color := clInfoBk;
{$ifdef D5_OR_HIGHER}
Canvas.Font := Screen.HintFont;
{$else}
Canvas.Font := Font;
{$endif}
Canvas.Brush.Style := bsClear;
end;
procedure TrmHintWindow.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := WS_POPUP or WS_BORDER;
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
if NewStyleControls then ExStyle := WS_EX_TOOLWINDOW;
AddBiDiModeExStyle(ExStyle);
end;
end;
procedure TrmHintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTTRANSPARENT;
end;
procedure TrmHintWindow.WMNCPaint(var Message: TMessage);
var
DC: HDC;
R: TRect;
begin
DC := GetWindowDC(Handle);
try
R := Rect(0, 0, Width, Height);
DrawEdge(DC, R, BDR_RAISEDOUTER, BF_RECT);
finally
ReleaseDC(Handle, DC);
end;
end;
procedure TrmHintWindow.Paint;
var
R: TRect;
begin
R := ClientRect;
inc(R.Left,1);
Canvas.Font.Assign(font);
Canvas.Font.Color := clInfoText;
DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or
DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
end;
function TrmHintWindow.IsHintMsg(var Msg: TMsg): Boolean;
begin
with Msg do
Result := ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) or
((Message = CM_ACTIVATE) or (Message = CM_DEACTIVATE)) or
(Message = CM_APPKEYDOWN) or (Message = CM_APPSYSCOMMAND) or
(Message = WM_COMMAND) or ((Message > WM_MOUSEMOVE) and
(Message <= WM_MOUSELAST)) or (Message = WM_NCMOUSEMOVE);
end;
procedure TrmHintWindow.ActivateHint(Rect: TRect; const AHint: string);
begin
FActivating := True;
try
Caption := AHint;
UpdateBoundsRect(Rect);
if Rect.Top + Height > Screen.DesktopHeight then
Rect.Top := Screen.DesktopHeight - Height;
if Rect.Left + Width > Screen.DesktopWidth then
Rect.Left := Screen.DesktopWidth - Width;
if Rect.Left < Screen.DesktopLeft then Rect.Left := Screen.DesktopLeft;
if Rect.Bottom < Screen.DesktopTop then Rect.Bottom := Screen.DesktopTop;
SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
SWP_SHOWWINDOW or SWP_NOACTIVATE);
Invalidate;
finally
FActivating := False;
end;
end;
procedure TrmHintWindow.ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer);
begin
ActivateHint(Rect, AHint);
end;
function TrmHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
begin
Result := Rect(0, 0, MaxWidth, 0);
DrawText(Canvas.Handle, PChar(AHint), -1, Result, DT_CALCRECT or DT_LEFT or
DT_SINGLELINE or DT_TOP OR DT_NOPREFIX or DrawTextBiDiModeFlagsReadingOnly);
end;
procedure TrmHintWindow.ReleaseHandle;
begin
DestroyHandle;
end;
end.