Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Problema nello spostare un label in base alla posizione del mouse (c# windows forms)

    Problema nello spostare un label in base alla posizione del mouse


    Ciao, vorrei creare un label che mi mostri le coordinate X e Y di un grafico in tempo reale in base alla posizione del mouse. Quindi voglio che il text del label sia aggiornato mostrando i valori x e y, inoltre voglio anche che il label si sposti continuamente, in modo da seguire la posizione del mouse. Per fare ció pensavo di usare l'evento MouseMove, e a dire il vero ci sono anche riuscito. In pratica se muovo il mouse lentamente funziona tutto alla perfezione, il problema si verifica quando muovo il mouse velocemente (o meglio non lentamente, anche muovendolo normalmente dá problemi). Questo é il problema: (vedi allegati)

    Come si vede se muovo il mouse velocemente rimane solo il bordo del label e viene mostrato lungo tutta la traiettoria fatta dal mouse. Quando poi mi fermo con il mouse, allora la grafica si aggiorna in modo corretto, quindi sembra proprio un problema di aggiornamento della grafica che non é abbastanza veloce.
    Consigli?
    Immagini allegate Immagini allegate
    Ultima modifica di Edoardo998; 04-05-2023 a 00:07

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Come hai disegnato il grafico su cui si muove la Label?
    E perché non includere l'informazione direttamente nel grafico, disegnandola come il resto invece di usare la Label?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    In che senso come ho disegnato... il grafico é un controllo "chart" di windows forms, e il grafico l'ho realizzato per punti da codice andando ad inserire i punti uno ad uno (quindi chart1.series........AddXY(...)). Voglio creare un pannello (label) che segua il mouse in tempo reale e mi mostri le coordinate X e Y su cui si trova il mouse in quel momento. Il problema é che si crea quel brutto effetto muovendo il mouse velocemente.
    Lo so che potrei mettere un label fisso da qualche parte, ma voglio che insegua il mouse perché mi sembra piú carino.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Quote Originariamente inviata da Edoardo998 Visualizza il messaggio
    In che senso come ho disegnato... il grafico é un controllo "chart" di windows forms, e il grafico l'ho realizzato per punti da codice andando ad inserire i punti uno ad uno (quindi chart1.series........AddXY(...)).
    Ecco, questo era il senso.
    Scusa, ma non era né automatico né scontato, seppur probabile, quindi meglio appurarlo.

    Quote Originariamente inviata da Edoardo998 Visualizza il messaggio
    Voglio creare un pannello (label) che segua il mouse in tempo reale e mi mostri le coordinate X e Y su cui si trova il mouse in quel momento. Il problema é che si crea quel brutto effetto muovendo il mouse velocemente.
    Lo so che potrei mettere un label fisso da qualche parte, ma voglio che insegua il mouse perché mi sembra piú carino.
    Il problema è legato al fatto che il controllo del grafico non si ridisegna al passaggio della Label su di esso, e quindi lascia "sporco" la rappresentazione sottostante, fino a quando non viene detto a Windows (o il SO non stabilisce) che deve essere ridisegnata.

    Prova a chiamare il metodo Invalidate() del grafico quando sposti la Label, in modo da scatenare il ridisegno.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Quote Originariamente inviata da Edoardo998 Visualizza il messaggio
    In che senso come ho disegnato... il grafico é un controllo "chart" di windows forms, e il grafico l'ho realizzato per punti da codice andando ad inserire i punti uno ad uno (quindi chart1.series........AddXY(...)). Voglio creare un pannello (label) che segua il mouse in tempo reale e mi mostri le coordinate X e Y su cui si trova il mouse in quel momento. Il problema é che si crea quel brutto effetto muovendo il mouse velocemente.
    Lo so che potrei mettere un label fisso da qualche parte, ma voglio che insegua il mouse perché mi sembra piú carino.
    Quote Originariamente inviata da alka Visualizza il messaggio
    Ecco, questo era il senso.
    Scusa, ma non era né automatico né scontato, seppur probabile, quindi meglio appurarlo.


    Il problema è legato al fatto che il controllo del grafico non si ridisegna al passaggio della Label su di esso, e quindi lascia "sporco" la rappresentazione sottostante, fino a quando non viene detto a Windows (o il SO non stabilisce) che deve essere ridisegnata.

    Prova a chiamare il metodo Invalidate() del grafico quando sposti la Label, in modo da scatenare il ridisegno.
    Ok grazie, cosí funziona. Ho provato ad usare Invalidate() e dopo Update(). Tuttavia mi chiedevo, c'é un modo per evitare di ridisegnare tutto il grafico, e ridisegnare solo il label? Perché essendoci tanti punti, ridisegnare ogni volta tutto crea lag.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Quote Originariamente inviata da Edoardo998 Visualizza il messaggio
    Tuttavia mi chiedevo, c'é un modo per evitare di ridisegnare tutto il grafico, e ridisegnare solo il label?
    Se non ridisegni il grafico, rimane l'effetto "sporco" sul video: questo viene "cancellato" proprio grazie al fatto che il ridisegno del grafico traccia lo sfondo e il resto degli elementi, eliminando il "residuo" della Label.

    Per fare tutto in modo più efficiente, non si dovrebbe usare la Label.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Quote Originariamente inviata da alka Visualizza il messaggio

    Per fare tutto in modo più efficiente, non si dovrebbe usare la Label.
    E come bisognerebbe fare allora?

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Quote Originariamente inviata da Edoardo998 Visualizza il messaggio
    E come bisognerebbe fare allora?
    Studia come implementare in generale il disegno all'interno dei controlli visuali, ad esempio partendo da questa documentazione, poi prova a disegnare nel controllo sfruttando gli eventi PrePaint e PostPaint del controllo Chart.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Quote Originariamente inviata da alka Visualizza il messaggio
    Studia come implementare in generale il disegno all'interno dei controlli visuali, ad esempio partendo da questa documentazione, poi prova a disegnare nel controllo sfruttando gli eventi PrePaint e PostPaint del controllo Chart.

    Ciao!
    Alla fine ho risolto in un altro modo. In pratica prendo il controllo padre dentro al quale é contenuto il grafico tramite "chart1.Parent". A quel punto aggiungo il label all'interno del controllo padre e lo porto in primo piano (in modo da mettere il label sopra il grafico). A questo punto invece di ridisegnare il grafico, ridisegno il controllo padre, che é molto piú leggero da ridisegnare. In pratica il label non l'ho messo dentro al grafico ma sopra in modo da ridisegnare il controllo padre che é piú leggero.

    Qui il codice, magari puó tornare utile a qualcuno:

    Control controllo = chart1.Parent;


    if (controllo.Controls.Contains(label))
    {
    controllo.Controls.Remove(label);
    }



    HitTestResult result2 = chart1.HitTest(e.X, e.Y);




    if (result2.ChartElementType == ChartElementType.DataPoint)
    {
    var serie = result2.Series;
    double valore = 0;
    dynamic data;


    DataPoint dp = serie.Points[result2.PointIndex];


    if (serie.XValueType == ChartValueType.DateTime)
    {
    data = (DateTime.FromOADate(dp.XValue));
    }
    else
    {
    data = Math.Round(dp.XValue, 2);
    }


    if (chartarea.AxisY.IsLogarithmic == true)
    {
    valore = Math.Round(Math.Pow(10, chartarea.AxisY.PixelPositionToValue(e.Location.Y) ), 2);
    }
    else
    {
    valore = Math.Round(chartarea.AxisY.PixelPositionToValue(e. Location.Y), 2);
    }



    label.Text = "X: " + Convert.ToString(data) + "\n" + "Y: " + Convert.ToString(valore);




    var coordinate = new Point(e.X + 20, e.Y + 20);
    coordinate = chart1.PointToScreen(coordinate);
    coordinate = controllo.PointToClient(coordinate);


    label.Location = coordinate;

    controllo.Controls.Add(label);


    label.BringToFront();


    controllo.Invalidate(); //ridisegna il grafico
    controllo.Update();
    }
    Ultima modifica di Edoardo998; 16-05-2023 a 18:46

  10. #10
    Quote Originariamente inviata da alka Visualizza il messaggio
    Studia come implementare in generale il disegno all'interno dei controlli visuali, ad esempio partendo da questa documentazione, poi prova a disegnare nel controllo sfruttando gli eventi PrePaint e PostPaint del controllo Chart.

    Ciao!
    Peró una domanda te la voglio fare, perché state qui a risolvere i problemi della gente gratis? Chi ve lo fa fare? Non che mi dispiaccia eh intendiamoci ahah.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.