AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) wie in Tcustomcontrol auf Scrollen reagieren??
Thema durchsuchen
Ansicht
Themen-Optionen

wie in Tcustomcontrol auf Scrollen reagieren??

Ein Thema von supermuckl · begonnen am 31. Dez 2010 · letzter Beitrag vom 1. Jan 2011
Antwort Antwort
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#1

wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 31. Dez 2010, 01:30
Hi!
Ich möchte in einer eigenen classe, die auf Tcustomcontrol aufbaut, auf scrollereignisse (up and down) reagieren können
ich krieg es einfach nicht hin!
Die eigenen objekte liegen auf dem form und haben es auch als parent.

wie kann ich das nun erreichen? das form erhält die scrollevents (als integer 522) aber die selbstinstantiierten controls auf dem form erhalten keine scrollevents (nur alles andere wie z.b. click, mousemove usw)
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 31. Dez 2010, 10:15
Die Klasse etwas aufbohren:
Delphi-Quellcode:
  published
    property OnScrollHorz: TNotifyEvent read FOnScrollHorz write FOnScrollHorz;
    property OnScrollVert: TNotifyEvent read FOnScrollVert write FOnScrollVert;
    property OnWheel: TMyWheelEvent read FOnWheel write FOnWheel;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#3

AW: wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 31. Dez 2010, 14:56
hi
das hat mir jetzt leider nicht weitergeholfen
ich versteh grundsätzlich nicht, wieso keine events an mein customcontrol weitergeleitet werden, die fürs scollen verantwortlich sind
ich hab schon einiges versucht in meiner class und die sieht schon aus wie eine baustelle
ich poste mal wie die aktuell aussieht - katastrophe..

ich will ja keine events selber abfeuern sondern ich will auf events reagieren, die nicht ankommen!

wie kriegt meine tcustomcontrolXYZ mit, daß die maus gerade auf ihr scrollt..

Delphi-Quellcode:
unit poti;

interface

uses sysutils,windows,graphics,messages,controls,mucontrol,background,classes,pngimage;


type Tmupoti = class(Tmucontrol)
//procedure HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
private
parentbackgroundbitmap : Tbitmap;
knop: array[0..1] of TPNGObject;
mdown:boolean;
starty,posy:integer;
mousedownlock:boolean;
fstyle:integer;
fsenserect:Trect;
fmousepos:tpoint;
fmouseover:boolean;
frotationangle:extended;
procedure incangle(value:extended);
public

procedure Repaint; override;
procedure GetParentBackground;
constructor Create(owner:Tcontrol;style:integer);

procedure DefaultHandler(var Message); override;
procedure test(var Message); message 999;
Procedure WndProc(Var Msg: TMessage); Override;

protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
//procedure WMMOUSEWHEEL(var Msg: TMessage); message WM_MOUSEWHEEL;
//procedure MouseWheelHandler(var Message: TMessage); override;
//procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;

end;

implementation
      uses unit2;


Procedure Tmupoti.WndProc(Var Msg: TMessage);
Begin
  // If Msg.Msg = 999 Then
  // Begin
 try
  tmp.add(inttostr(Msg.Msg));
   form2.ListBox1.Items := tmp;
  except end;
  // End;
    Inherited;
End;

procedure Tmupoti.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbleft then begin

 mdown := true;
 if not mousedownlock then begin
 starty := y;
 posy := y;
 end;
 mousedownlock := true;
 forcerepaint := true;
 paint;
end;
end;

procedure Tmupoti.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbleft then begin
 mdown := false;
 mousedownlock := false;
 forcerepaint := true;
 paint;
end;
end;

procedure Tmupoti.MouseMove(Shift: TShiftState; X, Y: Integer);
var
inc:extended;
begin
 fmousepos := point(x,y);
 fmouseover := inrect(fsenserect,fmousepos);
 if mdown then begin
 posy := y;
 inc := ((starty-posy)*0.8);
 incangle(inc);


 starty := y;
 end;
 forcerepaint := true;
 paint;
end;

procedure Tmupoti.CMMouseLeave(var Msg: TMessage);
begin
 fmouseover := false;
 forcerepaint := true;
 paint;
    inherited;
end;

procedure Tmupoti.DefaultHandler(var Message);
begin
  if TMessage(Message).Msg = WM_MOUSEHWHEEL then
  incangle(4);
 try
  tmp.add(inttostr(TMessage(Message).Msg));
   form2.ListBox1.Items := tmp;
  except end;
  inherited DefaultHandler(Message);
end;

procedure Tmupoti.test(var Message);
begin
  if TMessage(Message).Msg = WM_MOUSEHWHEEL then
  incangle(4);
 try
  tmp.add(inttostr(TMessage(Message).Msg));
   form2.ListBox1.Items := tmp;
  except end;
end;

    {
procedure Tmupoti.MouseWheelHandler(var Message: TMessage);
begin
if Message.wParam > 0 then incangle(4) else incangle(-4);

forcerepaint := true;
paint;
    inherited;
end;

procedure Tmupoti.WMVScroll(var Message: TWMVScroll);
begin
if Message.ScrollCode > 0 then incangle(4) else incangle(-4);


end;  }


               {
procedure Tmupoti.WMMOUSEWHEEL(var Msg: TMessage);
begin
if Msg.wParam > 0 then incangle(4) else incangle(-4);


end;

procedure Tmupoti.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
case Msg.message of
      WM_MOUSEWHEEL:
      begin
        if Msg.wParam > 0 then incangle(4) else incangle(-4);

        handled := true;
      end;
end;
end;      }



procedure Tmupoti.incangle(value:extended);
begin
if (frotationangle+value < 180) and (frotationangle+value > -180) then frotationangle := frotationangle+value;

end;


procedure Tmupoti.GetParentBackground;
begin
 if self.Parent <> nil then begin
   //Tmubkg(self.Parent).upimg.SaveToFile('c:\upimg.bmp');
   bitblt(parentbackgroundbitmap.canvas.Handle,0,0,parentbackgroundbitmap.width,parentbackgroundbitmap.Height,Tmubkg(self.Parent).upimg.canvas.handle,self.Left*4,self.Top*4,SRCCOPY);
   //parentbackgroundbitmap.SaveToFile('c:\parentbackgroundbitmap.bmp');
 end;

end;


procedure Tmupoti.Repaint;
var
middlex,middley:integer;
_rect:Trect;
tmppng:Tpngimage;
begin

upimg.Canvas.Draw(0,0,parentbackgroundbitmap);
// zeichnen
middlex := upimg.Width div 2;
middley := upimg.Height div 2;
tmppng := Tpngimage.Create;
tmppng.Assign(knop[0]);
SmoothRotate(tmppng, frotationangle);

with upimg.Canvas do begin


// brush.Color := clmaroon;
//if mdown then brush.Style := bssolid else brush.Style := bsclear;
//rectangle(cliprect);
brush.Style := bsclear;
pen.Color := clsilver;
pen.Width := 4;


_rect := rect(fsenserect.Left*4,fsenserect.top*4,fsenserect.right*4,fsenserect.bottom*4);
inflaterect(_rect,16,16);
if fmouseover or mdown then begin
 roundrect(_rect,32,32);
 cursor := crHandPoint;
end else begin

cursor := crDefault;
end;

pen.Color := clwhite;
pen.Width := 4;
   {
moveto(middlex,0);
lineto(middlex,height*4);
moveto(0,middley);
lineto(width*4,middley);

font.Color := clyellow;
font.Height := 100;
textout(2,2,inttostr(starty-posy));  }


draw(middlex-(tmppng.Width div 2) ,middley-(tmppng.height div 2),tmppng);
draw(middlex-(knop[1].Width div 2) ,middley-(knop[1].height div 2),knop[1]);

end;



//auf standard img kopieren und downsamplen
img.Assign(upimg);
Downsample4xBitmap24(img);

tmppng.Free;

end;



constructor Tmupoti.Create(owner:Tcontrol;style:integer);
var
i:integer;
begin
  inherited create(owner);
  //ControlStyle := [csCaptureMouse, csClickEvents, csDesignInteractive];
  fstyle := style;
  parentbackgroundbitmap := Tbitmap.Create;
  for i := 0 to length(knop) - 1 do begin
  knop[i]:=TPNGObject.Create;
  end;

  case fstyle of
  1: begin
     self.Height := 42;
     self.width := 42;
     knop[0].LoadFromFile('C:\drehknopf.png');
     knop[1].LoadFromFile('C:\drehknopf_schatten.png');
     SmoothResize(knop[0],self.width*4,self.height*4);
     SmoothResize(knop[1],self.width*4,self.height*4);
     end;
  end;

  img.Height := self.Height;
  img.width := self.width;
  upimg.Height := self.Height*4;
  upimg.width := self.width*4;
  parentbackgroundbitmap.Width := self.width*4;
  parentbackgroundbitmap.Height := self.height*4;
  parentbackgroundbitmap.PixelFormat := pf24bit;
  fsenserect := rect(0,0,self.width,self.height);
  inflaterect(fsenserect,-8,-8);





  //knop[1].LoadFromFile('C:\test2-red.png');
 // SmoothRotate(knop[0], 90);
 // SmoothRotate(knop[0], 90);
 // knop[0].SaveTofile('C:\drehknopftest.png');

end;


end.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 31. Dez 2010, 16:30
vielleicht fehlt ein SetFocus, folgendes geht bei mir
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TWheelDir=Procedure(Direction:Integer) of Object;
  TMyClass=Class(TCustomControl)
  private
    FOnMouseWheel: TWheelDir;
  published
  procedure WMMOUSEWHEEL(var Msg: TMessage); message WM_MOUSEWHEEL;

  published
  Property OnMouseWheel:TWheelDir read FOnMouseWheel write FOnMouseWheel ;
  End;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Wheel(dir:Integer);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.WMMOUSEWHEEL(var Msg: TMessage);
begin

    if Assigned(FOnMouseWheel) then FOnMouseWheel(msg.WParam);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  With TMyClass.Create(self) do
    begin
      Parent := Self;
      Left := 0;
      Top := 0;
      Width := 200;
      Height := 200;
      SetFocus;
      OnMouseWheel := Wheel;
    end;
end;
procedure TForm1.Wheel(dir:Integer);
begin
  Caption := IntToStr(dir div ABS(dir));
end;
end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#5

AW: wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 31. Dez 2010, 17:06
sehr gut!
es hat NUR der focus gefehlt
- die objekte wurden im on create des forms erstellt und da konnte man dann auch keinen focus setzen da die objekte noch nicht sichtbar waren aber ich hab das jetzt so geregelt, das der focus automatisch gesetzt wird, wenn die maus über dem control sitzt (if fmouseover then setfocus

vielen dank!
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#6

AW: wie in Tcustomcontrol auf Scrollen reagieren??

  Alt 1. Jan 2011, 11:07
Das mit dem Focus sollte man im Auge behalten, denn früher oder später kommt der Wunsch auf, ein Control auch dann mit Mausrad bedienen zu wollen wenn die Maus nicht drauf steht.

Wie das geht ist simpel: Die Mausrad-Events gehen an das Parent-Control und werden dort ggf. an das Control weitergeleitet, das gerade den Focus hat. Hier kann man also eingreifen und die Mausrad-Events immer an ein bestimmtes Control durchreichen.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz