2016-06-30 8 views
0

フォーム上のコントロールに対してPaintイベントを処理しようとしました。しかし、イベントは決して処理されません。私は何が間違っているのか分かりません。私はこれを実証するための非常にシンプルなのWinFormsプロジェクトを作成しました(私は他にあり何もありませんことを示すために生成されたデザイナーのコードを含めました):VScrollbarペイントイベントの処理

Form1.vbを

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     AddHandler VScrollBar1.Paint, AddressOf VScrollBar1_Paint 
    End Sub 

    Private Sub VScrollBar1_Paint (ByVal sender As Object, ByVal e As PaintEventArgs) 
     Dim str As String = "test" 
     System.Windows.Forms.MessageBox.Show(str) 
    End Sub        
End Class 

Form1.Designer.vb

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class Form1 
    Inherits System.Windows.Forms.Form 

    'Form overrides dispose to clean up the component list. 
    <System.Diagnostics.DebuggerNonUserCode()> _ 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     Try 
      If disposing AndAlso components IsNot Nothing Then 
       components.Dispose() 
      End If 
     Finally 
      MyBase.Dispose(disposing) 
     End Try 
    End Sub 

    'Required by the Windows Form Designer 
    Private components As System.ComponentModel.IContainer 

    'NOTE: The following procedure is required by the Windows Form Designer 
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor. 
    <System.Diagnostics.DebuggerStepThrough()> _ 
    Private Sub InitializeComponent() 
     Me.VScrollBar1 = New System.Windows.Forms.VScrollBar() 
     Me.SuspendLayout 
     ' 
     'VScrollBar1 
     ' 
     Me.VScrollBar1.Location = New System.Drawing.Point(26, 56) 
     Me.VScrollBar1.Name = "VScrollBar1" 
     Me.VScrollBar1.Size = New System.Drawing.Size(17, 80) 
     Me.VScrollBar1.TabIndex = 0 
     ' 
     'Form1 
     ' 
     Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!) 
     Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 
     Me.ClientSize = New System.Drawing.Size(284, 261) 
     Me.Controls.Add(Me.VScrollBar1) 
     Me.Name = "Form1" 
     Me.Text = "Form1" 
     Me.ResumeLayout(false) 

    End Sub 
     Friend WithEvents VScrollBar1 As System.Windows.Forms.VScrollBar 

End Class 

イベントは決して処理されませんが、コントロールは正しく描画されます。私は何が欠けていますか?

+0

スクロールバーはペイントイベントを発生させません。それらはシステムによって内部的に描画されます。オーナー描画のための施設はありません。スクロールバーを尋ねると、スクロールバーが表示されます。標準的なシステムの外観をオーバーライドするのは、決してよい理由ではありません。 –

+0

コントロールのイベントリストを開くと、ペイントイベントは表示されません。あなたは混乱するようなものではないものを扱おうとしています。 – Plutonix

答えて

-1

もう少し時間をかけて、フラグと値のパラメータをそれぞれControlStyles.userPaintTrueに設定して、SetStyle()メソッドを呼び出す必要があることを発見しました。

この方法はしかし、公共ではないので、反射が、それを呼び出すために必要とされている:

Dim methodInfo As System.Reflection.MethodInfo = VScrollBar1.GetType().GetMethod("SetStyle", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic) 
methodInfo.Invoke(VScrollBar1, {ControlStyles.UserPaint, True}) 

私はちょうどAddHandler線の上、上記Form1_Loadメソッドに上記のコードを入れて、動作するように表示されます(私はイベントを処理することができます)。

+0

他の人が言ったように...それはあなたの理由から隠されています。 – DonBoitnott

+0

はい、自分でイベントを処理できるように、保護された場所をハックすることができます。しかしそれでもあなたの問題は解決しません。スクロールバーコントロールを所有者が描画することはできません.Paintイベントを完全に無意味に扱うことができます。スクロールバーをカスタマイズするためにできる唯一のことは、WM_CTLCOLORメッセージを処理して背景色を変更することです。それ以外の場合は、基本的に独自のスクロールバーコントロールを最初から構築する必要があります。これは強く推奨されています。 –

+0

あなたの「有用でも関連性のある」コメントに関しては、それは私自身の質問に直接答えるので、私には関係していました。私はどのように対処するか尋ねましたペイントイベント。 最初に質問の前提に同意しないので、答えではなく疑問をdownvoteする必要があります。最初の場所でこの奇妙な質問の私の理由は、私はこれに対処しようとしていたためだった:http://stackoverflow.com/questions/38094955/is-there-any-way-to-remove-this-white-line- next-to-a-winforms-scrollbar – Interminable

関連する問題