|
■No76024 (魔界の仮面弁士 さん) に返信
非常にご丁寧に解説いただきありがとうございます。 とても浅い理解で進めていたので、とても参考になります。
> 【確認事項:その1】 アンビエントなプロパティの考慮は全くできていませんでした。
> 【確認事項:その2】 その通りでした、OnMouseLeaveの対になる、 もとい理想の動きはOnMouseEnterですね。
> 今回、「色」が変更されるタイミングは 4 種類あるかと思います。 整理できていなかったので、混乱していたようです。 (1)はユーザコントロールクラスのSub New()が動いた時、 (2)はForm1のSub New()が動いた時、 (3)はForm1の任意のコードでユーザコントロールクラスのプロパティ値を指定した時、 (4)はイベント発生時、 という理解でよろしいでしょうか?
例えば(1)でMe.BackColorをMe.OriginalBackColorに取得しても、 Form1のデザイナで指定したBackColorが(2)で反映される前のため、(1)の時点では取得できていない。 都度BackColorは変わっていくので、BackColorの取得元、またOrginalBackColorに取得するタイミングは注意しないといけない。
確認事項1とも関連するのですが、 今回はUI、デザインがかっちり決まっているので、パーツとして使用する色も限られており、開発標準化や今後のメンテナンスも考えて、 白系色ボタン、赤系色ボタンのように色変化パターンも決められたユーザコントロールを各種作り、フォーム側でのプロパティの指定は無視する動きにしたいとも思っています。
いろいろ考えて、以下の様にしています。
【実装】 Public Class Palette Public Shared ReadOnly Ash1 As Color = Color.FromArgb(255, 230, 234, 235) '↑淡 Normal Public Shared ReadOnly Ash2 As Color = Color.FromArgb(255, 213, 220, 222) '↓濃 Hover 'Active、Enable, etc... End Class
Public Class RactangleButton Inherits Windows.Forms.Label Dim _status As String Public Sub New() End Sub Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e) Select Case _status Case "hover" Me.BackColor = Palette.Ash2 Case Else Me.BackColor = Palette.Ash1 End Select End Sub Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs) MyBase.OnMouseEnter(e) _status = "hover" Me.Refresh() End Sub Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs) MyBase.OnMouseLeave(e) _status = "" Me.Refresh() End Sub End Class
|