2016-06-30 5 views
0

Я пытался обработать событие Paint для управления формой. Однако событие никогда не обрабатывается, и я не уверен, что я делаю неправильно. Я создал очень простой WinForms проект, чтобы продемонстрировать это (я включил сгенерированный код дизайнер, чтобы показать, что нет ничего другого там):Обработка события VScrollbar Paint

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

Хорошо, потратив немного больше времени на это, я обнаружил, что все, что вам нужно сделать, это вызвать метод SetStyle() с параметрами флага и значения, установленными на ControlStyles.userPaint и True соответственно.

Этот метод не является публичным, хотя, так что отражение необходимо для того, чтобы вызвать его:

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

я поставил выше код в метод Form1_Load выше, чуть выше AddHandler линии, и это, кажется, работает (Я могу обработать событие).

+0

Как говорили другие ... это скрыто от вас по какой-то причине. – DonBoitnott

+0

Да, вы можете взломать защитные устройства, которые позволяют вам справиться с этим событием. Но он все еще не решает вашу проблему. Вы не можете управлять владельцем полосы прокрутки, что делает невозможным управление обработкой события Paint. Единственное, что вы можете сделать для настройки полосы прокрутки, - это обработать сообщение WM_CTLCOLOR, чтобы изменить цвет фона. В противном случае вам, по сути, нужно будет создать собственный контроль прокрутки с нуля, что я * настоятельно рекомендую. (Как таковой, я отклонил этот ответ, потому что он не является ни полезным, ни релевантным.) –

+0

Что касается вашего «не полезного и релевантного» комментария, это было важно для меня, так как оно напрямую отвечает на мой собственный вопрос: я спросил, как обращаться событие Paint. Как вы не согласны с предпосылкой вопроса в первую очередь, вы должны, вероятно, уменьшить вопрос, а не ответ. Моя причина этого странного вопроса в первую очередь заключалась в том, что я пытался справиться с этим: http://stackoverflow.com/questions/38094955/is-there-any-way-to-remove-this-white-line- next-a-winforms-scrollbar – Interminable

Смежные вопросы