(25-04-20, 11:40 PM)ابو ليلى كتب : السلام عليكم و رحمة الله و بركاته
افضل الحلول لهكذا عقبات , هي باعادة تصميم الكائن و فرض التغيرات في المناطق التي نريدها
و هي هنا عند التركيز و فقد التركيز
انشأ مشروع جديد و سميه مثلاً MyTextBox
اضف له كلاس باسم MyTextBox , ثم ضع بداخله الكود التالي
اعمل Build للمشروع , سيندرج لك عنصر جديد في قائمة الادوات باسم MyTextBox .PHP كود :
Imports System.Runtime.InteropServices
Public Class MyTextBox : Inherits TextBox
Public Const WM_NCPAINT As Integer = &H85
<Flags()>
Private Enum RedrawWindowFlags As UInteger
Invalidate = &H2
InternalPaint = &H3
[Erase] = &H4
Validate = &H8
NoInternalPaint = &H10
NoErase = &H20
NoChildren = &H40
AllChildren = &H80
UpdateNow = &H100
EraseNow = &H200
Frame = &H400
NoFrame = &H800
End Enum
<DllImport("User32.dll")>
Public Shared Function GetWindowDC(ByVal hWnd As IntPtr) As IntPtr
End Function
<DllImport("user32.dll")>
Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Boolean
End Function
<DllImport("user32.dll")>
Private Shared Function RedrawWindow(hWnd As IntPtr, lprcUpdate As IntPtr, hrgnUpdate As IntPtr, flags As RedrawWindowFlags) As Boolean
End Function
Public Sub New()
MyBase.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
End Sub
Protected Overrides Sub OnResize(e As System.EventArgs)
MyBase.OnResize(e)
RedrawWindow(Me.Handle, IntPtr.Zero, IntPtr.Zero, RedrawWindowFlags.Frame Or RedrawWindowFlags.UpdateNow Or RedrawWindowFlags.Invalidate)
End Sub
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If m.Msg = WM_NCPAINT Then
Dim hDC As IntPtr = GetWindowDC(m.HWnd)
Using g As Graphics = Graphics.FromHdc(hDC)
If Me.Focused Then
g.DrawRectangle(Pens.CornflowerBlue, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
Else
g.DrawRectangle(Pens.Gainsboro, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
End If
g.DrawRectangle(SystemPens.Window, New Rectangle(1, 1, Me.Width - 3, Me.Height - 3))
End Using
ReleaseDC(m.HWnd, hDC)
End If
End Sub
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
MyBase.OnGotFocus(e)
Me.BackColor = Color.Red
End Sub
Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
Me.BackColor = Color.White
MyBase.OnLostFocus(e)
End Sub
End Class
الان اسحبه الى المشروع و تمتع بخصائصه الجديدة
انتبه الى الحدثين OnGotFocus , OnLostFoucs
قمنا بتغير لون الخلفية الى اللون الذي نريد , غيرها لما تحب
شكر الله لك ضبط معي الله يبارك فيك
(25-04-20, 10:34 PM)سامي محمد كتب : ضع تايمر
وفي حدث الــ Load للفورم
كود :
Timer1.Start()
وفي حدث الـــ Tick للتايمر
إقتباس : For Each x As TextBox In Me.Controls.OfType(Of TextBox)
x.BackColor = Color.White
If x.GetHashCode = GetContainerControl.ActiveControl.GetHashCode Then
x.BackColor = Color.Red
End If
Next
سيتم مراقبة النشط من الكنترول لكن من نوع تكست
------
مع ان حدثي الـــ GotFocus والـــ LostFocu ليس صعبا اذا تم تحويل الــ sender من Object إلى Textbox ...... وجمعها جميعا في حدث واحد
الشكر ايضا موصول لك اخوي سامي
