// Getestet mit D4 unter XP
// Durch die
Funktion "inside" wird der Button erst aktiviert, wenn sich der // siehe auch: http://www.s170867368.online.de/delphi/pictbtn.php unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; // für "TImage" type TMImage = class(TImage) private unten, drin, merk: Boolean; a, b, ab, a2, b2: integer; p: TPoint; protected procedure setEnabled(Value: boolean); override; procedure MEnter(var EMsg: TMessage); message CM_MouseEnter; procedure MLeave(var LMsg: TMessage); message CM_MouseLeave; procedure setfalse; function cursordrin: boolean; function inside(x, y: integer): boolean; public constructor Create(AOwner: TComponent); override; procedure mousemove(Shift: TShiftState; X, Y: Integer); override; procedure mousedown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure mouseup(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; const ButtonAnzahl = 3; ersteTaste: char = '1'; var Form1: TForm1; MI: array[0..ButtonAnzahl - 1] of TMImage; T: integer; implementation {$R *.DFM} //------------- Buttonbetätigung --------------- procedure Klick(sender: Longint); begin (* hierher kommt alles, was beim Loslassen der linken Maustaste passieren soll. 0 = 1. Button (MI[0]) 1 = 2. Button (MI[1]) usw. Beispielsweise: *) case sender of 0: beep; 1: showmessage('Button 2'); 2: MI[0].enabled := not MI[0].enabled; end; end; //------------- TMImage ---------------------- constructor TMImage.Create(AOwner: TComponent); begin inherited Create(AOwner); autosize := true; picture.loadfromfile('inaktiv.bmp'); transparent := true; a := round(width / 2); b := round(height / 2); a2 := sqr(a); b2 := sqr(b); ab := a2 * b2; end; procedure TMImage.setfalse; begin unten := false; drin := false; merk := false; end; function TMImage.cursordrin: boolean; begin getcursorpos(p); p := self.ScreenToClient(p); result := inside(p.x, p.y); end; procedure TMImage.setEnabled(value: boolean); begin inherited; setfalse; if enabled then begin if cursordrin then begin picture.loadfromfile('aktiv.bmp'); drin := true; end else picture.loadfromfile('inaktiv.bmp'); end else picture.loadfromfile('disabled.bmp'); end; function TMImage.inside(x, y: integer): boolean; begin result := b2 * sqr(a - x) + a2 * sqr(b - y) <= ab; end; procedure TMImage.MEnter(var EMsg: TMessage); begin if not enabled then exit; if cursordrin then begin unten := false; merk := false; picture.loadfromfile('aktiv.bmp'); end; end; procedure TMImage.MLeave(var LMsg: TMessage); begin if enabled then begin setfalse; picture.loadfromfile('inaktiv.bmp'); end; end; procedure TMImage.mousemove(Shift: TShiftState; X, Y: Integer); begin if not enabled then exit; drin := inside(x, y); if (drin <> merk) then begin if drin then picture.loadfromfile('aktiv.bmp') else picture.loadfromfile('inaktiv.bmp'); merk := drin; end; end; procedure TMImage.mousedown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (not drin) or (button <> mbleft) or (not enabled) then exit; unten := true; picture.loadfromfile('unten.bmp'); end; procedure TMImage.mouseup(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (button <> mbleft) or (not enabled) then exit; if drin then begin picture.loadfromfile('aktiv.bmp'); if unten then Klick(self.tag); end; unten := false; end; //---------------- TForm1 --------------------------- procedure TForm1.FormCreate(Sender: TObject); var x, abstand, links, oben: integer; begin doublebuffered := true; keypreview := true; T := ord(upcase(ersteTaste)); oben := 15; links := 20; abstand := 10; for x := 0 to ButtonAnzahl - 1 do begin MI[x] := TMImage.create(self); MI[x].parent := self; MI[x].top := oben; MI[x].left := links + x * (MI[x].width + abstand); MI[x].tag := x; end; end; procedure TForm1.FormDestroy(Sender: TObject); var x: integer; begin for x := 0 to ButtonAnzahl - 1 do MI[x].free; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: integer; begin i := key - T; if (Shift <> [ssCtrl]) or (i >= ButtonAnzahl) or (i < 0) or MI[i].drin or (MI[i].enabled = false) then exit; MI[i].drin := true; MI[i].unten := true; MI[i].picture.loadfromfile('unten.bmp'); end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var i: integer; begin i := key - T; if (Shift <> [ssCtrl]) or (i >= ButtonAnzahl) or (i < 0) or (MI[i].enabled = false) then exit; if MI[i].cursordrin then exit; MI[i].setfalse; MI[i].picture.loadfromfile('inaktiv.bmp'); Klick(i); end; end.
|
Zugriffe seit 6.9.2001 auf Delphi-Ecke