Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Cambiare immagine con richtextbox
Forum - C# / VB.NET - Cambiare immagine con richtextbox

Avatar
nightwolf1 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/02/2018

Segnala al moderatore
Postato alle 21:47
Martedì, 06/02/2018
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

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:52
Mercoledì, 07/02/2018
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

Codice sorgente - presumibilmente Plain Text

  1. 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.


Codice sorgente - presumibilmente VB.NET

  1. class RichTextBoxSignal : RichTextBox
  2.     {
  3.  
  4.         public enum SIGNAL { ON, OFF, NULL };
  5.  
  6.         private SIGNAL sign = SIGNAL.NULL;
  7.        
  8.  
  9.         [Browsable(true),Category("Setting"),Description("Imposta segnalino colorato")]
  10.         public SIGNAL SIGNALS
  11.         {
  12.             get { return sign; }
  13.             set { sign = value; }
  14.         }
  15.  
  16.  
  17.  
  18.          protected override void WndProc(ref Message m)
  19.          {
  20.               if (m.Msg == 15) // 15 significa WM_PAINT
  21.              {
  22.                  this.Invalidate();
  23.                  base.WndProc(ref m);
  24.                  using (Graphics g = Graphics.FromHwnd(this.Handle))
  25.                  {
  26.                      //Metodo Paint
  27.                      switch (SIGNALS)
  28.                      {
  29.                          case SIGNAL.NULL:
  30.                              break;
  31.                          case SIGNAL.ON:
  32.                              g.FillRectangle(Brushes.Green, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
  33.                              break;
  34.                          case SIGNAL.OFF:
  35.                              g.FillRectangle(Brushes.Red, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
  36.                              break;
  37.                      }
  38.                  }
  39.  
  40.  
  41.              }
  42.              else
  43.              {
  44.                  base.WndProc(ref m);
  45.              }
  46.            
  47.          }




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

Codice sorgente - presumibilmente VB.NET

  1. public class RichTextBoxSignal : RichTextBox
  2.     {
  3.  
  4.  
  5.         public enum SIGNAL { ON, OFF, NULL };
  6.         private Thread thread;
  7.         private SIGNAL sign = SIGNAL.NULL;
  8.        
  9.  
  10.         [Browsable(true),Category("Setting"),Description("Imposta segnalino colorato")]
  11.         public SIGNAL SIGNALS
  12.         {
  13.             get { return sign; }
  14.             set { sign = value; }
  15.         }
  16.  
  17.  
  18.         [Browsable(true),Category("Setting"),Description("Avvia il Lampeggio")]
  19.         public bool Lampeggio { get; set; }
  20.  
  21.  
  22.  
  23.         /// <summary>
  24.         /// Consente di stabilire il lampeggio del segnalino
  25.         /// </summary>
  26.         /// <param name="lampeggio">Valore booleano</param>
  27.         public void SignalFlash(bool lampeggio)
  28.         {
  29.             if (lampeggio)
  30.             {
  31.                 thread = new Thread(_Lampeggio);
  32.                 thread.IsBackground = true;
  33.                 thread.Start();
  34.             }
  35.             else
  36.             {
  37.                 thread.Abort();
  38.             }
  39.         }
  40.  
  41.  
  42.          protected override void WndProc(ref Message m)
  43.          {
  44.               if (m.Msg == 15) // 15 significa WM_PAINT
  45.              {
  46.                  this.Invalidate();
  47.                  base.WndProc(ref m);
  48.                  using (Graphics g = Graphics.FromHwnd(this.Handle))
  49.                  {
  50.                      switch (SIGNALS)
  51.                      {
  52.                          case SIGNAL.NULL:
  53.                              break;
  54.                          case SIGNAL.ON:
  55.                              g.FillRectangle(Brushes.Green, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
  56.                              break;
  57.                          case SIGNAL.OFF:
  58.                              g.FillRectangle(Brushes.Red, new Rectangle(5, ClientRectangle.Height - 25, 20, 20));
  59.                              break;
  60.                      }
  61.                  }
  62.  
  63.  
  64.              }
  65.              else
  66.              {
  67.                  base.WndProc(ref m);
  68.              }
  69.            
  70.          }
  71.  
  72.  
  73.          private void _Lampeggio()
  74.          {
  75.              Action azione = () =>
  76.              {
  77.                  while (true)
  78.                  {
  79.                      SIGNAL old = SIGNALS;
  80.  
  81.                      if (SIGNALS != SIGNAL.NULL)
  82.                      {
  83.                          SIGNALS = SIGNAL.NULL;
  84.                          this.Invalidate();
  85.                          Thread.Sleep(1000);
  86.                          SIGNALS = old;
  87.                          this.Invalidate();
  88.                          Thread.Sleep(1000);
  89.  
  90.                      }
  91.                      else
  92.                      {
  93.  
  94.                      }
  95.                                      
  96.                  }
  97.              };
  98.  
  99.              azione.Invoke();
  100.          }
  101.  
  102.  
  103.     }



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

Codice sorgente - presumibilmente Plain Text

  1. this.richTextBoxSignal1.SignalFlash(true);


Ultima modifica effettuata da Thejuster il 07/02/2018 alle 10:17


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nightwolf1 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/02/2018

Segnala al moderatore
Postato alle 11:52
Mercoledì, 07/02/2018
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.


nightwolf1 ha allegato un file: Immagine.jpg (120269 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
nightwolf1 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/02/2018

Segnala al moderatore
Postato alle 11:53
Mercoledì, 07/02/2018
ps. tutto il codice in vb.net è scritto in visual basic no in c#

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:19
Mercoledì, 07/02/2018
per quanto riguarda la conversione,

usa questo sito  http://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.


Testo quotato


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.

Codice sorgente - presumibilmente VB.NET

  1. Private input As String = "GET /?light2off HTTP/1.1"
  2.  
  3. Private split As String() = Regex.Split(input, "GET /\?light2")
  4.  
  5. Private s1 As String() = split(1).Split()
  6.  
  7. Private valore As String = s1(0)
  8.  
  9. if valore = "off" then
  10.  
  11. 'è off
  12.  
  13. else
  14.  
  15. 'è on
  16.  
  17. 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 il 07/02/2018 alle 14:46


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nightwolf1 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/02/2018

Segnala al moderatore
Postato alle 13:20
Mercoledì, 07/02/2018
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

PM Quote