Entwickler-Ecke

Sonstiges (Delphi) - Maus in der mitte, aber wie ?


mimi - So 05.10.03 12:15
Titel: Maus in der mitte, aber wie ?
Hallo,
ich möchte das die maus meiner anwendung immer in der MITTE ist, aber wie geht das ?


Raphael O. - So 05.10.03 12:25

ich poste dir einfach mal den Wuelltext aus meinem Programm dafür...
du kannst duie Maus nicht immer ganz genau in der Mitte festhalten, kansnt aber einen Bereich einschränken, in den sie hineindarf ;)
alelrdings musst du beachten, das man das Programm dann nicht mehr mit der Maus beenden kann (alternativ: ALt+F4)...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: integer);
var
  NeueMausPos: TPoint;
begin
  NeueMausPos := Mouse.CursorPos;
  if altemauspos.X < neuemauspos.X then
    yrot := yrot - Abs(altemauspos.X - neuemauspos.X) ;
  if altemauspos.X > neuemauspos.X then
    yrot := yrot + Abs(altemauspos.X - neuemauspos.X);
  if (altemauspos.Y > neuemauspos.Y) {and (xrot>-60)} then
    xrot := xrot - Abs(altemauspos.Y - neuemauspos.Y) ;
  if (altemauspos.Y < neuemauspos.Y) {and (xrot<60) } then
    xrot := xrot + Abs(altemauspos.Y - neuemauspos.Y);
  altemauspos := neuemauspos;
  if neuemauspos.X < (Left + 10then SetCursorPos(Left + ClientWidth - 11, neuemauspos.Y);
  if neuemauspos.X >= (Left + ClientWidth - 10then
    SetCursorPos(Left + 11, neuemauspos.Y);
  if neuemauspos.Y < (Top + 80then SetCursorPos(neuemauspos.X, Top + ClientHeight - 11);
  if neuemauspos.Y >= (Top + ClientHeight - 10then
    SetCursorPos(neuemauspos.X, Top + 81);
  neuemauspos := Mouse.CursorPos;
  altemauspos := neuemauspos;
end;

btw: hier siehst du auch gleich, wei ich den yrot-Wert verändere...
die Maus ist bei meinem Quelltext nicht näher als 10px am Rand, aber die Entfernung kannst du ja leicht variieren...

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


matze - So 05.10.03 12:31

also den haufen quelltext kannste dir auch sparen. das geht so viel einfacher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
var
  Rec: TRect;
begin
  Rec.Left := Left;
  Rec.Top := Top;
  Rec.Right := Left + Width;
  Rec.Bottom := Top + Height;
  ClipCursor(@Rec);
end;

Um den alten Mausbereich wiederherzustellen genügt:

Delphi-Quelltext
1:
ClipCursor(nil);                    


Raphael O. - So 05.10.03 12:35

:lol:
na gut, ich gebe mich gelschlagen *g*
aber nicht umsonst steht in meiner Signatur:
Zitat:
Warum einfach, wenns auch kompliziert geht???

:mrgreen:


mimi - So 05.10.03 12:38

ne so habe ich mir das nicht vorgestellt :(
ich wollte gerne das die MAUS IMMER in der mitte ist und dann auch nicht mehr weg kann.


Raphael O. - So 05.10.03 12:44

wofür brauchst du das denn??
außerdem:
stell doch einfach das Rect so ein, das die Maus nur 1 Pixel in der Mitte des Bildschirms hat...


Delete - So 05.10.03 12:45

Und was hindert dich daran den Code von matze zu nehmen? Der macht genau das,was du willst, die Maus einsperren.


mimi - So 05.10.03 12:45

währe eine lösung.
ich brauche es für ein spiel. was ich mit GLScene mache

@Luckie
ich will die maus nicht einspren, das nützt mir nichts, ich will das sich die maus pos ändern und zwar sich ständig in der mittte aufhält und nirgendswo andres


Raphael O. - So 05.10.03 12:50

hab ichs mir doch gedacht ;)
allerdings ist es dafür doch unsinnig, die Maus immer auf einem Pixel in der Mitte fetzuhalten...
selbst bei z.B. CS ist das nciht der Fall :D
als Fadenkreuz solltest du die Maus allerdings auf KEINEN Fall benutzen...


mimi - So 05.10.03 12:56

gut, ich will einfach nu verhinder das die maus erstes das forum verläst und zweitens soll die maus immer an der gleichen pos stehen.

und warum soll ich die maus nicht als Fadenkreuz verwenden ?


Terra23 - So 05.10.03 14:09

Du könntest doch die Bildschirmbreite und -höhe auslesen und dann dividieren und die Mausposition festlegen:

So definieren:


Delphi-Quelltext
1:
2:
3:
Var
 AngLeft: Integer;
 AngTop: Integer;


So festlegen:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
AngLeft:=Screen.Width DIV 2;
AngTop:=Screen.Height DIV 2;
end;



Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Timer1OnTimer(Sender: TObject);
begin
SetCursorPos(AngLeft, AngTop);
end;


Wenn ich nichts vergessen habe, müßte das so funktionieren. Probier's mal aus und teile mir mal mit, wo ggf. die Fehler liegen..


mimi - So 05.10.03 14:49

leider ist die maus noch nicht ganz in der mitte, aber vom prinzip her funktoniert es danke.


Terra23 - So 05.10.03 16:09

... kein Problem. Man hilft, wo man kann..


Raphael O. - So 05.10.03 18:21

das die Maus nicht ganz in der Mitte ist liegt wahrscheinlich an der Taskleiste :/

du solltest die Maus nicht als Fadenkreuz verwenden, weil man die Position nicht 100% fixieren kann und der Cursor außerdem sehr unflexibel ist...
->deshalb zeichne dir selber in die Mitte des Bildschirms ein Fadenkreuz, blende die Maus auch...
dann kannst du auch z.B. die Form und größe des Fadenkreuz immer verändern...


mimi - So 05.10.03 19:05

das ist wohl die einfachste möglichkeit.
mal sehen, ich wollte ja erstmal nur das die maus an einer festen position es, weil das ganze soll in ein paar jahren mal ein 3D Ego shooter der ersten klasse werden *G*


Delete - So 05.10.03 19:59

In ein paar Jahren? Wenn du soweit bist gibt es keine Win32API mehr.


mimi - So 05.10.03 20:55

meinst du ?
kann ich mir nicht vorstellen, naja ein paar jahren war viliecht übertrieben *G*


Delete - So 05.10.03 23:59

Stimmt, Jahrzehnte dürfte eher hinkommen.


simplex3 - Mi 16.02.05 16:52

matze hat folgendes geschrieben:
also den haufen quelltext kannste dir auch sparen. das geht so viel einfacher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
var
  Rec: TRect;
begin
  Rec.Left := Left;
  Rec.Top := Top;
  Rec.Right := Left + Width;
  Rec.Bottom := Top + Height;
  ClipCursor(@Rec);
end;

Um den alten Mausbereich wiederherzustellen genügt:

Delphi-Quelltext
1:
ClipCursor(nil);                    


Also bei mir klappt das nicht. Die Maus kann ohne Probleme aus dem Form heraus bewegt werden..


delfiphan - Mi 16.02.05 18:38

Probier's hiermit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
// (...)

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FRect : TRect;
    procedure ActivateApp(Sender : TObject);
    procedure DeactivateApp(Sender : TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnActivate := ActivateApp;
 Application.OnDeactivate := DeactivateApp;
 FRect := Rect(Screen.Width div 2, Screen.Height div 2,
               Screen.Width div 2, Screen.Height div 2);
end;

procedure TForm1.ActivateApp(Sender: TObject);
begin
 ClipCursor(@FRect);
end;

procedure TForm1.DeactivateApp(Sender: TObject);
begin
 ClipCursor(nil);
end;

// (...)