Soa ... nach reichlicher herumjongliererei mit windows messages und einer kleinen Mittagspause ist nun folgendes herausgekommen:
Code:
type
TOwnButton = class(TButton)
private
isin: boolean;
ismousein: boolean;
isdown: boolean;
procedure paintme;
public
procedure PMNorm(var message: TMessage); message WM_PAINT;
procedure PMUpDown(var message: TMessage); message $f3;
procedure PMEnter(var message: TMessage); message WM_SETFOCUS;
procedure PMLeave(var message: TMessage); message WM_KILLFOCUS;
procedure PMMouseEnter(var message: TMessage); message CM_MOUSEENTER;
procedure PMMouseLeave(var message: TMessage); message CM_MOUSELEAVE;
end;
implementation
procedure TOwnButton.paintme;
var
c: TControlCanvas;
begin
try
c := TControlCanvas.create;
c.Control := self;
if isdown then
begin
c.TextOut(5,5,'down'); //hier statt textout einfach auf dem canvas malen ...
end
else if ismousein then
begin
c.TextOut(5,5,'hover'); //hier statt textout einfach auf dem canvas malen ...
end
else if isin then
begin
c.TextOut(5,5,'focus'); //hier statt textout einfach auf dem canvas malen ...
end
else
begin
c.TextOut(5,5,'norm'); //hier statt textout einfach auf dem canvas malen ...
end;
finally
FreeAndNil(c);
end;
end;
procedure TOwnButton.PMNorm(var message: TMessage);
begin
inherited;
paintme;
end;
procedure TOwnButton.PMUpDown(var message: TMessage);
begin
inherited;
if message.WParam = 1 then
begin
isdown := true;
paintme;
end
else
begin
isdown := false;
paintme;
end;
end;
procedure TOwnButton.PMMouseEnter(var message: TMessage);
begin
ismousein := true;
paintme;
end;
procedure TOwnButton.PMMouseLeave(var message: TMessage);
begin
ismousein := false;
paintme;
end;
procedure TOwnButton.PMEnter(var message: TMessage);
begin
isin := true;
inherited;
end;
procedure TOwnButton.PMLeave(var message: TMessage);
begin
isin := false;
inherited;
end;
hoffe das war das, was du haben wolltest ;)
falls du noch runde buttons implementieren willst, musst du halt deren region setzen, aber das ist ein anderes thema ;)
greetz
-FastJack2