- 題名: パネル上のコントロール制御
- 日時: 2003/09/03 18:48:33
- ID: 566
- この記事の返信元:
- (なし)
- この記事への返信:
- [577] Re[1]: パネル上のコントロール制御2003/09/04 22:46:53
- ツリーを表示
こんばんは、えびせんさん。ピラルクです。
> 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
VB6.0からVB.NETへの移行作業を行っているのですが
VB.NETではパネルコントロールのEnabled=Falseにすると
パネル上のコントロールもEnabled=Falseの状態(表示がグレー)
になってしまいますが、VB6.0のFRAMEコントロールではFRAME上
のコントロールの表示はそのままでした。
パネル上のコントロールの表示はそのままでEnabled=Falseの状態に
したいのですが何かよい方法はないでしょうか。
APIのEnableWindowを使用すれば同様の事は行えるのですが、FORMのEnabledをTRUEにするとEnableWindowの設定が解除されてしまいます。