How to create a hotspot (Views: 27)
Problem/Question/Abstract: I need something like a hotspot that would lie above everything else and under certain conditions trap mouse events and under other conditions, let them through. I understand, to get the mouse events before anybody else it must be a TWinControl descendant? How do I make it transparent then? Answer: Here's one I wrote a couple of years ago. It isn't a TWinControl descendant, TGraphicControl instead, but it handles MouseEnter and MouseLeave. If you want others, you need to add them { TEXSHotSpot: HotSpot Component which allows developers to insert a "HotSpot" on top of an image or panel but lets the background show through and handle mouse entering and leaving the rectangle region of the component. New Property: ShowBorder- Use this if you want a border to show around the hotspot when the mouse is over it. Similar to the flat speedbutton look. } unit EXSHotSpot; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, extctrls, StdCtrls; type TEXSHotSpot = class(TGraphicControl) private { Private declarations } FMouseInControl: Boolean; FShowBorder: Boolean; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure DrawBorder; function GetShowBorder: Boolean; procedure SetShowBorder(Value: Boolean); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property Align; property Enabled; property OnClick; property OnDblClick; property OnMouseDown; property OnMouseUp; property OnMouseMove; property OnDragDrop; property OnEndDrag; property ShowBorder: Boolean read GetShowBorder write SetShowBorder; property ShowHint; property Visible; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TEXSHotSpot]); end; procedure TEXSHotSpot.DrawBorder; var R: TRect; begin R := ClientRect; InflateRect(R, -1, -1); Frame3D(Canvas, R, clBtnHighlight, clBtnShadow, 1); end; procedure TEXSHotSpot.CMMouseEnter(var Message: TMessage); begin inherited; if not FMouseInControl and Enabled then begin FMouseInControl := True; if FShowBorder then DrawBorder; end; end; procedure TEXSHotSpot.CMMouseLeave(var Message: TMessage); begin inherited; if FMouseInControl and Enabled then begin FMouseInControl := False; Invalidate; end; end; constructor TEXSHotSpot.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csReplicatable]; Height := 105; Width := 105; end; destructor TEXSHotSpot.Destroy; begin inherited Destroy; end; function TEXSHotSpot.GetShowBorder: Boolean; begin Result := FShowBorder; end; procedure TEXSHotSpot.SetShowBorder(Value: Boolean); begin if Value <> FShowBorder then FShowBorder := Value; Repaint; end; end. |