Cursor richtig über Steuerelement positionieren



  • Hallo zusammen!
    Ich würde gerne Hint des Steuerelementes anzeigen lassen. Leider bekomme ich ein Problem wenn sich das Steuerelement in einer ScrollBox befindet. Die eigentliche Problematik ist in der Positionierung des Cursors über der Edit1 wenn die HorzScrollBar der ScrollBox eine Laufleiste anzeigt.

    void __fastcall TForm1::DoHint(TControl *Control)
    {
        if(!Control)
            return;
        Application->HintPause      = 0;
        Application->HintHidePause  = 30000;
        Application->HintShortPause = 0;
        TPoint pt;
        pt = Control->ClientToScreen(Point(1,1)) ;
        SetCursorPos(pt.x , pt.y) ;
        Application->ActivateHint(pt);
    }
    
    void __fastcall TForm1::Edit1Enter(TObject *Sender)
    {
        DoHint(Edit1);
    }
    

    Hat jemand eine Idee wie ich den Cursor doch noch richtig über die Edit1 positionieren kann?



  • coder24h schrieb:

    Die eigentliche Problematik ist in der Positionierung des Cursors über der Edit1 wenn die HorzScrollBar der ScrollBox eine Laufleiste anzeigt.

    Wieso, wo landet denn der Cursor nach der Positionierung?

    Sehe ich das richtig: Wenn der Mauszeiger Edit1 "betritt", soll er an eine von dir bestimmte Position gestellt werden. Edit1 befindet sich in einer ScrollBox. Wenn die ScrollBox einen horizontalen Scrollbalken enthält, ist der Cursor nach der Positionierung an einer falschen Position (welche?)!?



  • Danke Kolumbus für deine Antwort und sry dass ich erst jetzt antworten kann.
    Wenn du die Sourcen übersetzt kannst du sehen wo der Cursor landet.

    // Cpp-Datei
    // Auf dem Formular liegt eine ScrollBox
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        randomize();
        ObjectList = new TObjectList();
    
        for(int i=0; i<100;i++)
        {
            TEdit* NewEdit = new TEdit(this);
            if(NewEdit)
            {
                NewEdit->Left = rand()%1000 + 1;
                NewEdit->Top = rand()%1000 + 1;
                NewEdit->Parent = this;
                NewEdit->Hint = "Edit"+AnsiString(i);
                NewEdit->ShowHint = true;
                NewEdit->OnEnter = DoHint;
    
                ObjectList->Add(NewEdit);
            }
        }
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::~TForm1()
    {
        if(ObjectList)
            delete ObjectList;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::DoHint(TObject *Sender)
    {
         TControl *Edit = dynamic_cast<TControl*>((TObject*)Sender);
         if(!Edit)
            return;
    
        Application->HintPause      = 0;       A
        Application->HintHidePause  = 30000;
        Application->HintShortPause = 0;
        TPoint pt;
        pt = Edit->ClientToScreen(Point(1,1)) ;
        SetCursorPos(pt.x , pt.y) ;
        Application->ActivateHint(pt);
    }
    
    // h-Datei
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:
        TScrollBox *ScrollBox1;
    private:
        TObjectList *ObjectList;
        void __fastcall DoHint(TObject *Sender);
    public:
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Man könnte die ScrollBox1->HorzScrollBar->Position und ScrollBox1->VertScrollBar->Position für die Umrechnung verwenden, wie würde das Ganze aber bei einer Anwendung mit mehreren ScrollingWinControls die in einander verschachtelt sind aussehen? Hat wer eine Idee?


Anmelden zum Antworten