Oppure

Loading
06/02/18 20:47
nightwolf1
Buona sera a tutti, avrei bisogno del vostro aiuto su di un progetto che sto creando. Il progetto consiste nell utulizzo di arduino uno e vb.net. il progetto consisye nel collegare arduino uno e farlo funzionare tramite vb.net, in tutto questo ho creato un form che sarebbe il monitor seriale per ricevere le informazioni, ah, insieme ad arduino è collegato anche un ethernet shield, adesso io avrei bisogno che quando ricevo una determinata scritta nella richtextbox cambiasse un immagine tipo un puntino da rosso a verde e viceversa, come posso fare? Grazie mille a tutti
aaa
07/02/18 8:52
Thejuster
Crea un nuova classe vuota chiamata esempio

RichTextBoxSignal ereditando il controllo RichTextBox

C'è un piccolo particolare però.
Lo dico anche per chi legge il topic.

Diversamente dagli altri controlli, che basta impostare il DrawMode su Variable o Fixed
il RichTextBox funziona in maniera differente.

Impostando anche esempio

SetStyle(ControlStyles.UserPaint, true);


Abilitiamo si la possibilità di fare un override al metodo paint,
Ma le coordinate sono relative al Cursor e non al controllo stesso.
Quindi dà un bel pò di noie.
La soluzione e andare direttamente sul WndProc

Per questo motivo ho deciso di scriverti completamente il codice altrimenti non ne vieni a capo.



 class RichTextBoxSignal : RichTextBox
    {

        public enum SIGNAL { ON, OFF, NULL };

        private SIGNAL sign = SIGNAL.NULL;
        

        [Browsable(true),Category("Setting"),Description("Imposta segnalino colorato")]
        public SIGNAL SIGNALS
        {
            get { return sign; }
            set { sign = value; }
        }



         protected override void WndProc(ref Message m)
         {
              if (m.Msg == 15) // 15 significa WM_PAINT
             {
                 this.Invalidate();
                 base.WndProc(ref m);
                 using (Graphics g = Graphics.FromHwnd(this.Handle))
                 {
                     //Metodo Paint
                     switch (SIGNALS)
                     {
                         case SIGNAL.NULL:
                             break;
                         case SIGNAL.ON:
                             g.FillRectangle(Brushes.Green, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
                             break;
                         case SIGNAL.OFF:
                             g.FillRectangle(Brushes.Red, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
                             break;
                     }
                 }


             }
             else
             {
                 base.WndProc(ref m);
             }
           
         }




Inserendo nel tuo form questo controllo e non il RichTextBox standar,
Andando sulle proprietà troverai un campo chiamato SIGNALS
Impostandolo su true, ottieni un rettangolino verde in basso a sinistra, False uno rosso.

Ho disegnato un rettangolo ma puoi mettere quello che ti grada.
anche un immagine volendo.


Se invece volevi far lampeggiare anche l'indicatore basta aggiungere qualche riga
eccoti il codice completo con il rettangolo che lampeggia


 public class RichTextBoxSignal : RichTextBox
    {


        public enum SIGNAL { ON, OFF, NULL };
        private Thread thread;
        private SIGNAL sign = SIGNAL.NULL;
        

        [Browsable(true),Category("Setting"),Description("Imposta segnalino colorato")]
        public SIGNAL SIGNALS
        {
            get { return sign; }
            set { sign = value; }
        }


        [Browsable(true),Category("Setting"),Description("Avvia il Lampeggio")]
        public bool Lampeggio { get; set; }



        /// <summary>
        /// Consente di stabilire il lampeggio del segnalino
        /// </summary>
        /// <param name="lampeggio">Valore booleano</param>
        public void SignalFlash(bool lampeggio)
        {
            if (lampeggio)
            {
                thread = new Thread(_Lampeggio);
                thread.IsBackground = true;
                thread.Start();
            }
            else
            {
                thread.Abort();
            }
        }


         protected override void WndProc(ref Message m)
         {
              if (m.Msg == 15) // 15 significa WM_PAINT
             {
                 this.Invalidate();
                 base.WndProc(ref m);
                 using (Graphics g = Graphics.FromHwnd(this.Handle))
                 {
                     switch (SIGNALS)
                     {
                         case SIGNAL.NULL:
                             break;
                         case SIGNAL.ON:
                             g.FillRectangle(Brushes.Green, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
                             break;
                         case SIGNAL.OFF:
                             g.FillRectangle(Brushes.Red, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
                             break;
                     }
                 }


             }
             else
             {
                 base.WndProc(ref m);
             }
           
         }


         private void _Lampeggio()
         {
             Action azione = () =>
             {
                 while (true)
                 {
                     SIGNAL old = SIGNALS;

                     if (SIGNALS != SIGNAL.NULL)
                     {
                         SIGNALS = SIGNAL.NULL;
                         this.Invalidate();
                         Thread.Sleep(1000);
                         SIGNALS = old;
                         this.Invalidate();
                         Thread.Sleep(1000);

                     }
                     else
                     {

                     }
                                      
                 }
             };

             azione.Invoke();
         }


    }



basta semplicemente eseguire un void nel controllo
per farlo lampeggiare quando vuoi


  this.richTextBoxSignal1.SignalFlash(true);

Ultima modifica effettuata da Thejuster 07/02/18 9:17
mire.forumfree.it/ - Mire Engine
C# UI Designer
07/02/18 10:52
nightwolf1
grazie mille per tutto quanto, però oltre a non aver capito niente non so se fa a caso mio, nel senso, come mostra l'immagine io avrei bisogno di far camiare l immagine della picturebox2 da led_off a led_on, quando nella richtextbox si riceve il comando "GET /?light2on HTTP/1.1" il led diventa verde e quando riceve il comando "GET /?light2off HTTP/1.1 il led diventa rosso.
aaa
07/02/18 10:53
nightwolf1
ps. tutto il codice in vb.net è scritto in visual basic no in c#
aaa
07/02/18 11:19
Thejuster
per quanto riguarda la conversione,

usa questo sito converter.telerik.com/

a sinistra metti il codice C# a destra lo converte in vb.net

Per quanto riguarda il resto, se spiegavi correttamente,
mi evitavi un inutile fatica....

Non hai scritto che hai bisogno di interpretare una stringa
ma di accendere un segnalino cosa al quanto differente...

Non si può interpretare una spiegazione criptata.
Ma sarebbe utile se quando si chiede supporto su un determinato problema
venisse spiegato tutto il più chiaro possibile.


Buona sera a tutti, avrei bisogno del vostro aiuto su di un progetto che sto creando. Il progetto consiste nell utulizzo di arduino uno e vb.net. il progetto consisye nel collegare arduino uno e farlo funzionare tramite vb.net, in tutto questo ho creato un form che sarebbe il monitor seriale per ricevere le informazioni, ah, insieme ad arduino è collegato anche un ethernet shield, adesso io avrei bisogno che quando ricevo una determinata scritta nella richtextbox cambiasse un immagine tipo un puntino da rosso a verde e viceversa, come posso fare? Grazie mille a tutti



Cmq eccoti la soluzione.


Private input As String = "GET /?light2off HTTP/1.1"

Private split As String() = Regex.Split(input, "GET /\?light2")

Private s1 As String() = split(1).Split()

Private valore As String = s1(0)

if valore = "off" then

'è off

else

'è on

endif



spero solo di aver convertito bene.

la stringa input rappresenta il comando ricevuto da arduino ovvero il GET
che successivamente vai ad estrarre il risultato contenuto nella stringa
Ultima modifica effettuata da Thejuster 07/02/18 13:46
mire.forumfree.it/ - Mire Engine
C# UI Designer
07/02/18 12:20
nightwolf1
mi dispiace se non si è capito ma io ho scritto che ho creato un form che farebbe da monitor seriale e che al ricevere di una determinata scritta nella richtextbox dovrebbe cambiarmi un immagine tipo un puntino da rosso a vede e viceversa, cmq
grazie mille
aaa