Cursor nicht aus dem TPanel lassen



  • Find ich jetzt war selber doof von mir, dass ich schon wieder lästig werde. Aber ich brauche ne Lösungmöglichkeit.

    Ich mache das so, über einen Click in das Panel, wird der bool Wert "drin" zu true. Weiß ich, dass ich mich nun sozusagen im Panel befinde. Dort werden die Mausbewegungen aufgezeichnet, protokuliert.
    Der Benutzer soll dabei aber nicht mehr rauskommen. Es soll nicht möglich sein, die Maus einfach aus dem Panel rausschieben zu können. Ich habe da schon einen Versuch gestartet, nur funktioniert dieser äußerst unzufridenstellend.
    Durch eine schnelle Mausbewegung ist man dennoch draußen. Und das ermittelte Screen->Top wird verfälscht ausgelesen (bei mir läuft z.B. noch sowas wie eine SideBar - genauer, die StatBar). Diese "frisst" einige Pixel des Top's.
    Vielleicht kennt ihr ja sowas.

    Es wäre schön, wenn es da irgendetwas nicht so abhängiges geben würde.
    Ich bin über JEDEN Tip glücklich. Also bitte, schreibt eure Ideen. Vielleicht hat ja sogar der ein oder andere das ja schonmal verwirklicht.

    Über das "ausklinken", also das beabsichtigte rauskommen müsst ihr euch keine Gedanken machen. Das kriege ich hin.

    Danke euch allen



  • Such mal unter Thema 'Capture' o. ä.
    Da kannste Mausereignisse auf dem Control 'halte', auch wenn Maus ausserhalb ist.



  • Danke vorerst mal

    habe gesucht, so richitg gefunden hab ich noch nichts. Habe sowas auch noch nie gemacht, bzw nichtmal nährungsweise damit was gemacht.
    Dein oder so, hilft _mir_ net so, denn ich hab kein Plan wonach ich suchen soll. Nach 'Capture' hab ich gesucht. Aber naja, noch verstehe ich net wie das funzen soll.

    Bitte um weitere Hilfestellung



  • Probier das mal aus:

    In Formular 'Form1'
    setzt Du 3 x Label: 'MX','MY' und 'CL'
    und ein Panel 'ImgPanel'

    Definiere die Globale Variable 'Captured'

    Die Methoden OnMouseMove und OnClick des Panels definierst Du wie folgt:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Boolean Captured=false;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ImgPanelClick(TObject *Sender)
    { if (!Captured)
      { SetCapture(ImgPanel->Handle);
      }
      else
      { ReleaseCapture();
      }
      Captured=!Captured;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ImgPanelMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    { MX->Caption=X;
      MY->Caption=Y;
      CL->Caption=Captured ? "Captured" : "Not Captured";
      if (Captured)
      { if (X<0)
          MX->Caption=0;
        if (X>ImgPanel->Width)
          MX->Caption=ImgPanel->Width;
        if (Y<0)
          MY->Caption=0;
        if (Y>ImgPanel->Height)
          MY->Caption=ImgPanel->Height;
      }
      if ((X!=MX->Caption.ToInt())||(Y!=MY->Caption.ToInt()))
        Mouse->CursorPos=ImgPanel->ClientToScreen(Point(MX->Caption.ToInt(),MY->Caption.ToInt()));
    }
    //---------------------------------------------------------------------------
    

    Starte das Programm und wundere Dich! :p



  • Ahhhh

    ich verstehe deinen Quellcode. Vielen dank für die Mühe. Das "Starten" des Programms hat dann das ganze auch gut gezeigt, welche Auswirkungen das hat.

    Das ist aber nicht das was ich gesucht habe. Ich glaube, das hätte ich dann mit vie Geplänkel auch geschafft, aber bei weitem nicht so rafiniert wie du umgesetzt 🙂

    Ich möchte es mal so ausdrücken: Wenn man auf diesen Panel klickt. Dann ist man drin. Drin bedeutet, dass es für die Maus kein entkommen gibt. Sie kommt nicht mehr aus dem Panel heraus. Bildlich vorgestellt = das Panel ist die neue Auflösung des Monitors. Nur darin soll sich die Maus bewegen können. An den Wänden des Panels, soll die Maus nicht rauskönnen. Genauso wenig, wie die Maus aus dem Bildschirm verschwinden kann. 😉

    Danke dir DerAltenburger, du machst echt große Mühe.



  • Dividator schrieb:

    ...
    Das ist aber nicht das was ich gesucht habe.
    ...
    Nur darin soll sich die Maus bewegen können. An den Wänden des Panels, soll die Maus nicht rauskönnen.

    😕 😕 😕

    Genau das macht doch mein Code- Speibiel! 😕 😕



  • DAS GEHT GANZ EINFACH MIT DER WINAPI FUNKTION

    ClipCursor



  • DerAltenburger schrieb:

    Genau das macht doch mein Code- Speibiel! 😕 😕

    Okay, ich habe das nun mal unter WindowsXP gestet. Da tut das tatsächlich wunderbar!! Windows 2000 ist davon unbeeindruckt.

    Wink noch an den "SCHREIHALS", deinem Tipp bin ich nachgegangen. ClipCursor() machte meine Maus aber unsichtbar.

    👍



  • Dividator schrieb:

    DerAltenburger schrieb:

    Genau das macht doch mein Code- Speibiel! 😕 😕

    Okay, ich habe das nun mal unter WindowsXP gestet. Da tut das tatsächlich wunderbar!! Windows 2000 ist davon unbeeindruckt.

    Komisch ist das!!!

    Ich hab' Win2k prof., da geht das prima!
    Hab' BCB 4.0 Standard! Vielleicht liegts daran, dass das bei mir klappt?



  • ClipCursor() machte meine Maus aber unsichtbar.

    Gerade ausprobiert. Bei mir wird sie *nicht* unsichtbar.


Log in to reply