Opi napisał(a)
- Na TPanel położony jest TImage. Gdybym odmalowywał to na TPanelu, to wiadomo jak tu jest z Canvasem (np.: po zminimalizowaniu okna odmalowanie utraci się), dlatego zastosowany TImage i to na nim maluję gradient i dochodzi do wywołania OnMouseLeave, OnMouseEnter
Nie wiem Opi czy jakoś to Tobie pomoże, bo chyba zdarzenia OnMouseLeave da się dopisać zawsze
do komponentu, ale jeżeli nie chcesz tracić tego co jest narysowane na Canvasie panelu i nie kłaść
na niego TImage, o ile to by w czymś Tobie pomogło. To może kiedy trzeba zapamiętuj w zmiennej
typu TBitmap co ma być na malowane, przechwytuj komunikat WM_PAINT i maluj to na nowo, jak
w kodzie poniżej. Mi takie rozwiązanie wystarczyło w TScrollBox, który wzbogaciłem o Canvas, ale
powiem szczerze, że nie wiem jak rozwiązać Twój głowny problem, lecz może i to, Ci coś pomoże.
unit canvasedscrollbox;
interface
uses
Windows, Messages, Classes, Controls, Forms, Graphics;
type
TCanvasedScrollBox = class(TScrollBox)
private
FBmp : TBitmap;
FCanvas : TCanvas;
procedure SetBitmap(Value : TBitmap);
protected
procedure WMPaint(var Message : TMessage); message WM_PAINT;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
property Bitmap : TBitmap read FBmp write SetBitmap;
property Canvas : TCanvas read FCanvas;
end;
implementation
constructor TCanvasedScrollBox.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csSetCaption, csDoubleClicks];
Width := 185;
Height := 41;
BorderStyle := bsSingle;
FBmp := TBitmap.Create;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TCanvasedScrollBox.Destroy;
begin
FBmp.Free;
FCanvas.Free;
inherited Destroy;
end;
procedure TCanvasedScrollBox.SetBitmap(Value : TBitmap);
begin
FBmp.Assign(Value);
SendMessage(Handle, WM_PAINT, 0, 0);
end;
procedure TCanvasedScrollBox.WMPaint(var Message : TMessage);
begin
if Assigned(FBmp) then
Canvas.Draw(0, 0, FBmp);
inherited;
end;
end.
EDIT: no a właśnie cimak napisal, że do panelu mozna dopisać zdarzenia obslugi "wchodzenia" i
"opuszczania" myszki na obszarze Panelu, a skoro z Panelem wszystko działa dobrze, a jedynym
minusem było to, że Canvas jest tracony po wywołaniu WM_PAINT to może skorzystaj z kodu w
stylu powyższego i uzyskasz wtedy idealne dla siebie rozwiązanie, które zadziala tak, jak chcesz.
Czyli, o ile to możliwe, rysujesz po Canvasie Bitmapy dodanej jako własnośc dla TPanel i później
przy wywolaniu WM_PAINT ta Bitmapa pozwala pokazać zawartośc na komponencie. Nic innego,
nie przychodzi mi do głowy, a może jak połaczysz wskazówki cimaka i moją to całość będzie ok.