- 題名: パネル上のコントロール制御
- 日時: 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の設定が解除されてしまいます。