2009-12-22 12 views

risposta

11

See: How to change the font color of a disabled TextBox?

[Edit - codice di esempio aggiunto]

richTextBox.TabStop = false; 
richTextBox.ReadOnly = true; 
richTextBox.BackColor = Color.DimGray; 
richTextBox.Cursor = Cursors.Arrow; 
richTextBox.Enter += richTextBox_Enter; 

private void richTextBox_Enter(object sender, EventArgs e) 
{ 
    // you need to set the focus somewhere else. Eg a label. 
    SomeOtherControl.Focus(); 
} 

o come en metodo di estensione (ho capito che non c'è bisogno di metterla in sola lettura in quanto l'evento Enter cattura qualsiasi ingresso):

public static class MyExtensions 
{ 
    public static void Disable(this Control control, Control focusTarget) 
    { 
     control.TabStop = false; 
     control.BackColor = Color.DimGray; 
     control.Cursor = Cursors.Arrow; 
     control.Enter += delegate { focusTarget.Focus(); }; 
    } 
} 
+0

non è la cosa che ho chiesto! – Badr

+0

@moon: Sì, lo è. –

+3

@moon: Sì, è necessario impostare il controllo in sola lettura e impostare i colori manualmente anziché disabilitarlo. La disattivazione di un controllo utilizzerà le impostazioni del sistema operativo per il modo in cui viene eseguito il rendering. –

3

Creare un Richtextbox personalizzato come di seguito Ciò produrrà un Richtextbox con un Backcolor trasparente. È quindi possibile posizionare questo controllo su un pannello opportunamente colorato.

Public Class MyRichTextBox 
Inherits RichTextBox 
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _ 
Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr 
End Function 
Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams 
    Get 
     Dim prams As CreateParams = MyBase.CreateParams 
     If LoadLibrary("msftedit.dll") <> IntPtr.Zero Then 
      prams.ExStyle = prams.ExStyle Or &H20 'Makes Transparent 
      prams.ClassName = "RICHEDIT50W" 
     End If 
     Return prams 
    End Get 
End Property 
3

della sua fine, ma il suo non è un brutto modo,

private void richTextBox1_ReadOnlyChanged(object sender, EventArgs e) 
    { 
     //just here instead of White select your color 

     richTextBox1.BackColor = Color.White; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     richTextBox1.ReadOnly = true; 
    } 
3

Impostare la proprietà BackColor per il colore desiderato e quindi impostare la RichTextBox a sola lettura.

Es:

richTextBox.BackColor = Color.White; 
richTextBox.ReadOnly = true; 
+0

Non funziona lo stesso, readonly consente ancora selezione, scorrimento, ecc. –

+0

+1 perché nella mia situazione il comportamento di abilitazione/disabilitazione sembrava inaffidabile quando ShowSelectionMargin era impostato su True. –

4

ho appena trovato un ottimo modo per farlo. Dovrebbe funzionare con qualsiasi controllo:

public class DisabledRichTextBox : System.Windows.Forms.RichTextBox 
{ 
    // See: http://wiki.winehq.org/List_Of_Windows_Messages 

    private const int WM_SETFOCUS = 0x07; 
    private const int WM_ENABLE  = 0x0A; 
    private const int WM_SETCURSOR = 0x20; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (!(m.Msg == WM_SETFOCUS || m.Msg == WM_ENABLE || m.Msg == WM_SETCURSOR)) 
      base.WndProc(ref m); 
    } 
} 

Si può tranquillamente impostare Enabled = true e ReadOnly = false, e si comporterà come un marchio, impedendo messa a fuoco, l'input dell'utente, il cambiamento del cursore, senza essere in realtà disabilitato.

Vedere se funziona per voi. Saluti

Problemi correlati