DOBON.NET DOBON.NETプログラミング掲示板過去ログ

パネル上のコントロール制御

分類:[.NET]

VB6.0からVB.NETへの移行作業を行っているのですが
VB.NETではパネルコントロールのEnabled=Falseにすると
パネル上のコントロールもEnabled=Falseの状態(表示がグレー)
になってしまいますが、VB6.0のFRAMEコントロールではFRAME上
のコントロールの表示はそのままでした。
パネル上のコントロールの表示はそのままでEnabled=Falseの状態に
したいのですが何かよい方法はないでしょうか。
APIのEnableWindowを使用すれば同様の事は行えるのですが、FORMのEnabledをTRUEにするとEnableWindowの設定が解除されてしまいます。
こんばんは、えびせんさん。ピラルクです。

> VB.NETではパネルコントロールのEnabled=Falseにすると
> パネル上のコントロールもEnabled=Falseの状態(表示がグレー)

確かに、PanelはコンテナとしてFrameより格段に進化して
ますね。子ControlのEnabledを制御してもどこかでちゃん
と記憶してあり、コンテナがEnabled=Trueになった時に期
待通りの状態になる。(素晴らしい!!)

で、この進化が邪魔と……。(/_;

> APIのEnableWindowを使用すれば同様の事は行えるのですが

さすがにここでのEnableWindowは、Framework的な整合性を
壊しそうで、リスキーに過ぎると思います。

例えばですが、Enabled=True/Falseの差はTextがエッチング
されるかの差だけなので(Imageは無いと想定)、Disableにな
ってもTextは通常通り描くような継承ボタンにするのはどう
でしょう?

'--------+---------+---------+---------*---------+---------+---------+----
'Disable状態でも見た目はEnabled状態であり続けるボタン
'--------+---------+---------+---------*---------+---------+---------+----
Class Button_AlwaysLookEnabled
  Inherits Button

  Private m_backupText As String = ""

  Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    '    Console.WriteLine("called")
    If Enabled Then
      '凹んだ時にTextもあわせてShiftさせるためEnabled時はNormalな動作に。
      MyBase.OnPaint(e)
    Else
      '初っ端からDisabledの場合に対応
      If Text.Length <> 0 Then
        MyBase_EnabledChanged(Nothing, Nothing)
        Exit Sub
        '(!)Text変更で再描画が走るのでここで抜けて良し
      End If

      '外枠だけMyBaseに描かせてTextは独自に描画
      MyBase.OnPaint(e)
      Dim strFormat As New StringFormat()
      strFormat.Alignment = StringAlignment.Center
      strFormat.LineAlignment = StringAlignment.Center
      e.Graphics.DrawString(m_backupText, Font, _
                            New SolidBrush(ForeColor), _
                            RectangleF.op_Implicit(ClientRectangle), _
                            strFormat)
      '(!)条件=Textは1行で納まる & Image無し & MnemonicNotSupported .etc
    End If
  End Sub

  Private Sub MyBase_EnabledChanged( _
              ByVal sender As Object, _
              ByVal e As System.EventArgs) Handles MyBase.EnabledChanged
    If Enabled And Text.Length = 0 Then
      'EnableになったらTextを元に戻して全くNormalな状態にする
      Text = m_backupText
    ElseIf Not Enabled And Text.Length <> 0 Then
      'DisableになったらTextを""にして、Text文字を描かせないようにする
      m_backupText = Text
      Text = ""
    End If
  End Sub
End Class

DOBON.NET | プログラミング道 | プログラミング掲示板