Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Combobox disabilitata

Ciao a tutti,
ho una form che contiene una serie di combobox che però sono tutte
disabilitate e risultano poco leggibili. La mia idea era quella di
creare un componente personalizzato con un colore di sfondo diverso al
momento del paint se una proprietà da me creata (es. readonly boolean)
è true. I problema è che bisognerebbe anche non far reagire la combo
ad un evento click  o ad un'azione di edit.
Ho fatto molti tentativi ma non riesco a cavare un ragno dal buco...
Qualche buon'anima mi può dare qualche idea per procedere?
Grazie, Michele
 

 ha scritto nel messaggio
news:t46r4050o9tt4pjal...@4ax.com...


 forse il mio aiuto sarą superluo, ma Perchč non crei un OCX???
ehm...
č esattamente quello che sta cercando di fare...
solo che probabilmente non riesce a farlo funzionare come vuole.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 solo che probabilmente non riesce a farlo funzionare come vuole.
potrebbe sempre utilizzare le property.
secondo te?!?!?!


 secondo te?!?!?!
può darsi.
non ho riflettuto sul problema di michele, anche perchè non ho una soluzione
pronta e non potrei testare le eventuali idee che potrebbero venirmi.
con il mio post di prima, e mi scuso con te se il tono ti può essere
sembrato di eccessivo dileggio nei tuoi confronti, volevo solo farti notare
che l'abbozzo di soluzione da te ipotizzato era, a mio avviso, lo stesso
utilizzato dall'op.
anche se non mi ricordo se in .net si parla di ocx... in questo caso si fa
una classe che eredita dal combobox.


 Sergio
Ciao  Cerberus



Il componente personalizzato in .NET è una classe che eredita da
un'altra. In questo caso particolare dalla windows.forms.combobox.
Grazie, Michele

 è true.
2 idee:
1) Crea una classe, parti con Inherits ComboBox e fai l'override
dell'OnPaint così:
Mybase.OnPaint(e)
Me.ScriviCaption()
Dove in scrivi caption metti la tua routine che con GDI+ (credimi, mezza
giornata e le hai capite le GDI+) disegna il tuo testo...
2) Controllo personalizzato con una checkBox e una label...
    Ciao
        Allanon
-- 
- SPAMKILLER
 lasciate il NOSPAM nell'indirizzo: 
itlangv...@michele.sytes.net
 e lasciate la parola SPAMKILLER nel corpo dell'email


Grazie pe ril consiglio, ora provo a studiarmi le GDI+. Fino a dora mi
ero intestardito a voler far apparire una textbox senza bordi sopra
alla combo ma non ne avevo risolto nulla in quanto, essendo un
controllo, se mettevo enabled=false alla combo, mi diventava
disabilitata pure la textbox!
Non riesco a capire cosa intendi  con la seconda idea....
Ciao e grazie, Michele

 disabilitata pure la textbox!
In effetti quello che proponevo io era abbastanza simile.
Premetto che mi vergogno di me stesso per un consiglio così poco OOP e che
caldeggio fortemente la, seppure un po' più lunga versione tramite GDI+.
...comunque eccoti un breve (anche se non sembrerebbe esempietto di quello
che intendevo: copia e incolla in un file .vb:
P.S. Ovviamente così perdi il polimorfismo e ti devo "portare fuori" tutte
le proprietà che ti interessano a mano!
Public Class MkCheck
  Inherits System.Windows.Forms.UserControl
  Private m_ReadOnly As Boolean
#Region " Codice generato da Progettazione Windows Form "
  Public Sub New()
    MyBase.New()
    'Chiamata richiesta da Progettazione Windows Form.
    InitializeComponent()
    'Aggiungere le eventuali istruzioni di inizializzazione dopo la
chiamata a InitializeComponent()
  End Sub
  'UserControl esegue l'override del metodo Dispose per pulire l'elenco dei
componenti.
  Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
      If Not (components Is Nothing) Then
        components.Dispose()
      End If
    End If
    MyBase.Dispose(disposing)
  End Sub
  'Richiesto da Progettazione Windows Form
  Private components As System.ComponentModel.IContainer
  'NOTA: la procedura che segue è richiesta da Progettazione Windows Form.
  'Può essere modificata in Progettazione Windows Form.  
  'Non modificarla nell'editor del codice.
  Friend WithEvents chk As System.Windows.Forms.CheckBox
  Friend WithEvents lbl As System.Windows.Forms.Label
  <System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
    Me.chk = New System.Windows.Forms.CheckBox
    Me.lbl = New System.Windows.Forms.Label
    Me.SuspendLayout()
    '
    'chk
    '
    Me.chk.Dock = System.Windows.Forms.DockStyle.Left
    Me.chk.Location = New System.Drawing.Point(0, 0)
 
Me.chk.Name
 = "chk"
    Me.chk.Size = New System.Drawing.Size(16, 16)
    Me.chk.TabIndex = 0
    '
    'lbl
    '
    Me.lbl.Dock = System.Windows.Forms.DockStyle.Fill
    Me.lbl.Location = New System.Drawing.Point(16, 0)
 
Me.lbl.Name
 = "lbl"
    Me.lbl.Size = New System.Drawing.Size(84, 16)
    Me.lbl.TabIndex = 1
    Me.lbl.Text = "CheckText"
    Me.lbl.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
    '
    'MkCheck
    '
    Me.Controls.Add(Me.lbl)
    Me.Controls.Add(Me.chk)
    Me.Name = "MkCheck"
    Me.Size = New System.Drawing.Size(100, 16)
    Me.ResumeLayout(False)
  End Sub
#End Region
  <System.ComponentModel.Browsable(True)> _
  Public Overrides Property Text() As String
    Get
      Return lbl.Text
    End Get
    Set(ByVal Value As String)
      lbl.Text = Value
    End Set
  End Property
  Private Sub MkCheck_EnabledChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.EnabledChanged
    lbl.Enabled = Me.Enabled
    chk.Enabled = Me.Enabled AndAlso Not Me.ReadOnly
  End Sub
  <System.ComponentModel.DefaultValue(False)> _
  Public Overridable Property [ReadOnly]() As Boolean
    Get
      Return m_ReadOnly
    End Get
    Set(ByVal Value As Boolean)
      m_ReadOnly = Value
      MkCheck_EnabledChanged(Me, System.EventArgs.Empty)
    End Set
  End Property
  Public Overridable Property Checked() As Boolean
    Get
      Return chk.Checked
    End Get
    Set(ByVal Value As Boolean)
      chk.Checked = Value
    End Set
  End Property
  Private Sub lbl_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles lbl.Click
    If chk.Enabled Then
      chk.Checked = Not chk.Checked
    End If
  End Sub
End Class


le proprietà che ti interessano a mano!
Purtroppo pur essendomi studiato le GDI+ e aver impiegato tutto il
pomeriggio su quella maledetta combo non sono riuscito a risolvere il
problema: ho ancora diversi problemi di refresh. 
Mi sa che purtroppo, anche se non sarà la soluzione migliore, dovrò
adattarmi ad una soluzione intermedia tipo la tua. Ma non mi arrendo.
Sull' MSDN compare testualmente ".NET framework consente di sviluppare
facilmente controlli personalizzati."... è una certezza!
Grazie dell'esempio! 
Michele

 facilmente controlli personalizzati."... è una certezza!
Beh... vorrei confermare
Guarda, é brutale anche questo, ma leggermente meglio e ti può dare un idea
delle GDI+:
Public Class MkCheck2
  Inherits System.Windows.Forms.CheckBox
  Protected Overrides Sub OnPaint(ByVal pevent As
System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(pevent)
    Select Case MyBase.CheckAlign
      Case ContentAlignment.MiddleLeft
        Select Case MyBase.TextAlign
          Case ContentAlignment.MiddleLeft
            'Cancello lo sfondo usando il backcolor
            Dim BackBrush As New SolidBrush(Me.BackColor)
            pevent.Graphics.FillRectangle(BackBrush, pevent.ClipRectangle.X
+ 16, pevent.ClipRectangle.Y, pevent.ClipRectangle.Width -
pevent.ClipRectangle.X - 16, pevent.ClipRectangle.Height -
pevent.ClipRectangle.Y)
            BackBrush.Dispose()
            'Disegno il nuovo testo
            Dim MyBrush As New SolidBrush(Me.ForeColor)
            pevent.Graphics.DrawString(Me.Text, Me.Font, MyBrush,
pevent.ClipRectangle.X + 16, pevent.ClipRectangle.Y +
(pevent.ClipRectangle.Height - Me.Font.Height) \ 2)
            MyBrush.Dispose()
        End Select
    End Select
  End Sub
End Class
Più che altro ci vorrebbe un modo per conoscere esattamente dove disegnare
il testo (o se preferisci dove trovare la posizione del quadratino di
check... Oppure ridisegnare anche il quadratino e la spunta di check...
