المشاركات : 12
المواضيع 4
الإنتساب : Jan 2016
السمعة :
0
الشكر: 12
تم شكره 12 مرات في 6 مشاركات
تحية طيبة لكم
استكمال لسؤوال سابق لي في هذا المنتدى الموفق اود التكرم بالحصول على اجابة لما يلي
اريد كود او طريقة لتغير اي مربع نص في الفورم عندما يتم تنشيطة ويكون جاهز للكتابة
جربت طريقة ان اقوم بوضع الكود لكل اداة في حدث عند الدخول والخروج ولكن اصبح ذلك شاق
فهل من طريقة افضل
وفق الله الجميع
المشاركات : 137
المواضيع 2
الإنتساب : Dec 2017
السمعة :
40
الشكر: 45
تم شكره 384 مرات في 134 مشاركات
ضع تايمر
وفي حدث الــ Load للفورم
وفي حدث الـــ 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 ...... وجمعها جميعا في حدث واحد
المشاركات : 662
المواضيع 39
الإنتساب : Feb 2014
السمعة :
195
الشكر: 1474
تم شكره 1740 مرات في 622 مشاركات
السلام عليكم و رحمة الله و بركاته
افضل الحلول لهكذا عقبات , هي باعادة تصميم الكائن و فرض التغيرات في المناطق التي نريدها
و هي هنا عند التركيز و فقد التركيز
انشأ مشروع جديد و سميه مثلاً MyTextBox
اضف له كلاس باسم 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
اعمل Build للمشروع , سيندرج لك عنصر جديد في قائمة الادوات باسم MyTextBox .
الان اسحبه الى المشروع و تمتع بخصائصه الجديدة
انتبه الى الحدثين OnGotFocus , OnLostFoucs
قمنا بتغير لون الخلفية الى اللون الذي نريد , غيرها لما تحب
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 12
المواضيع 4
الإنتساب : Jan 2016
السمعة :
0
الشكر: 12
تم شكره 12 مرات في 6 مشاركات
26-04-20, 12:53 AM
(آخر تعديل لهذه المشاركة : 26-04-20, 12:54 AM {2} بواسطة سمير1404.)
(25-04-20, 11:40 PM)ابو ليلى كتب : السلام عليكم و رحمة الله و بركاته
افضل الحلول لهكذا عقبات , هي باعادة تصميم الكائن و فرض التغيرات في المناطق التي نريدها
و هي هنا عند التركيز و فقد التركيز
انشأ مشروع جديد و سميه مثلاً MyTextBox
اضف له كلاس باسم 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
اعمل Build للمشروع , سيندرج لك عنصر جديد في قائمة الادوات باسم MyTextBox .
الان اسحبه الى المشروع و تمتع بخصائصه الجديدة
انتبه الى الحدثين OnGotFocus , OnLostFoucs
قمنا بتغير لون الخلفية الى اللون الذي نريد , غيرها لما تحب
شكر الله لك ضبط معي الله يبارك فيك
(25-04-20, 10:34 PM)سامي محمد كتب : ضع تايمر
وفي حدث الــ Load للفورم
وفي حدث الـــ 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 ...... وجمعها جميعا في حدث واحد
الشكر ايضا موصول لك اخوي سامي
المشاركات : 531
المواضيع 37
الإنتساب : Oct 2019
السمعة :
219
الشكر: 609
تم شكره 1654 مرات في 584 مشاركات
26-04-20, 06:07 AM
اخي يمكنك فعل هذا باكثر من طريقة بالاضافة الى ماذكره الاخوان قبلي
1- اختر حدث Enter لاي تكست بوكس تريد تغيير لون خلفيته عندما يكون نشطا
وقم باضافة فاصلة بعد Handles TextBox1.Enter ثم اسم التكست بوكس الثاني وحدث Enter ,وفاصلة وهكذا الى ان تكمل اختيار كل التكست بوكس المطلوب تغيير لون خلفيتها
مثال:
كود :
Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
2- الطريقة الثانية هي تحديد جميع التكست بوكس التي تريد ان تغير لون خلفيتها على نموذج التصميم ثم من نافذة الخصائص اضغط على الزر الذي يحمل صورة برق
واختر حدث Enter ,وضع فيه الكود التالي
كود :
sender.backcolor = Color.AliceBlue
الكود السابق يحول لون التكست بوكس النشط الى اللون المذكور
و قم بفعل نفس الطريقة لكود حدث Leave
ليكون الكود لديك كالتالي:
كود :
Private Sub TextBox1_Enter(sender As System.Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
sender.backcolor = Color.AliceBlue
End Sub
Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
sender.backcolor = Color.White
End Sub
المشاركات : 137
المواضيع 2
الإنتساب : Dec 2017
السمعة :
40
الشكر: 45
تم شكره 384 مرات في 134 مشاركات
بصرحة الطريقة الافضل هي طريقةة أبو ليلي ... طبعا اذا كان كل الــ Textybox التي في المشروع يستخدم لها نفس الطريقة
-----
ولكن لا ادري لماذا ابو ليلى استخدم هذه الطريقة الطويلة مع وجود طرق اسهل بكثير لانشاء الخصائص داخل الاداة
|