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);