AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welcher Cursor ist gerade aktiv

Ein Thema von EWeiss · begonnen am 18. Jun 2007 · letzter Beitrag vom 22. Jun 2007
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 10:33
Hi Emil,

Ach, es war nur sehr früh heute und irgendwo meinte ich, 10 pixel gesehen zu haben. Ist ja auch egal, jedenfalls ist 10 die Granularität, mit der die Größe in X- bzw. Y-Richtung verändert werden soll.
Zitat von EWeiss:
Zitat von alzaimar:
Würde es nicht reichen, im OnMouseMove (wenn die Form vergrößert wird) einfach das hier zu machen:

Delphi-Quellcode:
  Width := 10 * ((Mouse.X-Left) Div 10);
  Height:= 10 * ((Mouse.Y-Top) Div 10);
A...
Weiss jetzt nicht genau was du meinst und an welcher stelle....
Ich auch nicht

Aber hier mal ein Beispiel, wie ich das eigentlich dachte.
Delphi-Quellcode:
Unit Unit1;

Interface

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

Type
  THitTest = (htMove, htSizeGrip, htNone);

  TForm1 = Class(TForm)
    Shape: TShape;
    lbInfo: TLabel;
    Procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    Procedure ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure FormCreate(Sender: TObject);
  private
    fDragHitTest: THitTest;
    fDragStartX, fDragStartY: Integer;
    Function GetHitTest(aPt: TPoint): THitTest;
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

Const
  ccGap = 4; // Hot Zone Rahmen
  ccHorzGranulation = 21;
  ccVertGranulation = 29;

Function TForm1.GetHitTest(aPt: TPoint): THitTest;
  Function Between(a, b, c: Integer): Boolean; // True, wenn a zwischen b und c liegt
  Begin
    Result := (a >= b) And (a <= c)
  End;

Begin
// untere rechte Ecke (Kann man natürlich besser definieren)
  If Between(aPt.X, Width - ccGap + 1, Width) And Between(aPt.Y, Height - ccGap + 1, Height) Then
    Result := htSizeGrip
// Sonst irgendwo am Rand (geht auch besser)
  Else If Between(aPt.X, 0, ccGap) Or Between(aPt.X, Width - ccGap + 1, Width)
    Or Between(aPt.Y, 0, ccGap) Or Between(aPt.Y, Height - ccGap + 1, Height) Then
    Result := htMove
  Else
    Result := htNone
End;

Procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:
  Integer);
Begin
  fDragHitTest := GetHitTest(Point(X, Y));
  fDragStartX := X;
  fDragStartY := Y;
End;

Procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
  P: TPoint;
Begin
  P := ClientToScreen(Point(X, Y));
  Case fDragHitTest Of
    htMove: Begin
        Left := P.X - fDragStartX;
        Top := P.Y - fDragStartY;
      End;
    htSizeGrip: Begin
        Width := (1 + X Div ccVertGranulation) * ccVertGranulation; // Hier, das meinte ich in
        Height := (1 + Y Div ccHorzGranulation) * ccHorzGranulation; // meiner Schlaftrunkenheit
      End;
  End;
End;

Procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  fDragHitTest := htNone;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  fDragHitTest := htNone;
  Shape.Pen.Width := ccGap;
End;

End.
Das simuliert in etwa WinAmp. Man muss aber unten rechts sehr genau zielen, damit man den kleinen 4x4pxl großen Bereich trifft, der die Größe verändert.. das kann man bestimmt besser machen
Angehängte Dateien
Dateityp: rar movablesizableform_103.rar (167,4 KB, 7x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 17:38
@alzaimar

Zitat:
Das simuliert in etwa WinAmp.
Man muss aber unten rechts sehr genau zielen, damit man den kleinen 4x4pxl großen Bereich trifft, der die Größe verändert.. das kann man bestimmt besser machen
Ja nicht schlecht
Hmm mußte aber wie du schon sagtest eine Lupe nehme um da etwas zu treffen.

Hätte mein teil auch in eine Klasse packen können.
Aber letztendlich kommt es darauf an das es funktioniert.

Das geht bei meinen Source eigentlich sehr gut.
Aber als ansatz wie man es besser machen könnte ist dein Beispiel nicht schlecht.

EDIT:
Dafür gibt es ja den Greifer als PicResize damit man nicht nach 4x4 suchen muss.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 20:33
@alzaimar

Habe deine variante nochmal genau analysiert.
Definitiv geht es so nicht wenn du unten in der Ecke einen Skin(PicBox, panel) oder
was auch immer einfügst und diesen als Greifer zum vergrößern der Form verwendest.

Wie würdest du das machen das es funktioniert?
Ansonsten ist der Code schön klein.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

Re: Welcher Cursor ist gerade aktiv

  Alt 22. Jun 2007, 17:56
Hätte immer noch interesse an einer optimierten Variante meines Schnipsel
Die muss aber funktionstüchtig sein mit aufgesetzer PicBox.


gruss Emil
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Welcher Cursor ist gerade aktiv

  Alt 22. Jun 2007, 18:55
Hi Emil

eigentlich ganz einfach. Auch ein TImage hat OnMouseXXXXX-Ereignisse. Du musst dann meinen Code nur etwas modifizieren, sodaß die Mauskoordinaten immer relativ zur Form sind. Das geht mit ClientToScreen und ScreenToClient recht einfach.

Dann würde alle ShapeMouse-Ereignisse auch dem Size Grip Image zuweisen.

Zum Schluss prüfe ich im OnMouseDown-Ereignis, ob der Sender zufällig das Sizegrip-Image ist (über den Komponenten-Namen). Wenn ja, dann spare ich mir die Prüfung, ob die Maus am Rand ist.

Prinzipiell kannst Du mit allen Gadgets (sprich: Images) so verfahren. Ich würde, glaube ich, nur eine zentrale Mausauswerte routine schreiben. Dann ist alles zentral und es ist übersichtlicher.
Angehängte Dateien
Dateityp: rar movablesizablewithsizegripformdemo_154.rar (172,7 KB, 3x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

Re: Welcher Cursor ist gerade aktiv

  Alt 22. Jun 2007, 19:22
Zitat von alzaimar:
Hi Emil

eigentlich ganz einfach. Auch ein TImage hat OnMouseXXXXX-Ereignisse. Du musst dann meinen Code nur etwas modifizieren, sodaß die Mauskoordinaten immer relativ zur Form sind. Das geht mit ClientToScreen und ScreenToClient recht einfach.

Dann würde alle ShapeMouse-Ereignisse auch dem Size Grip Image zuweisen.

Zum Schluss prüfe ich im OnMouseDown-Ereignis, ob der Sender zufällig das Sizegrip-Image ist (über den Komponenten-Namen). Wenn ja, dann spare ich mir die Prüfung, ob die Maus am Rand ist.

Prinzipiell kannst Du mit allen Gadgets (sprich: Images) so verfahren. Ich würde, glaube ich, nur eine zentrale Mausauswerte routine schreiben. Dann ist alles zentral und es ist übersichtlicher.
Danke für deine mühe
Werde mir das in ruhe anschaun.

Gruss Emil
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:08 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