تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[سؤال] تغيير لون خلفية textbox عند انتقال المؤشر داخل الاداة
#1
تحية طيبة لكم 
استكمال لسؤوال سابق لي في هذا المنتدى الموفق اود التكرم بالحصول على اجابة لما يلي 

اريد كود او طريقة لتغير اي مربع نص في الفورم عندما يتم تنشيطة ويكون جاهز للكتابة 

جربت طريقة ان اقوم بوضع الكود لكل اداة في حدث عند الدخول والخروج ولكن اصبح ذلك شاق 
فهل من طريقة افضل 
وفق الله الجميع
الرد
تم الشكر بواسطة: ابو ليلى , asemshahen5
#2
ضع تايمر 


وفي حدث الــ 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 ...... وجمعها جميعا في حدث واحد
الرد
#3
السلام عليكم و رحمة الله و بركاته
افضل الحلول لهكذا عقبات , هي باعادة تصميم الكائن و فرض التغيرات في المناطق التي نريدها
و هي هنا عند التركيز و فقد التركيز
انشأ مشروع جديد و سميه مثلاً 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 IntPtrByVal hDC As IntPtr) As Boolean
    End 
Function

 
   <DllImport("user32.dll")>
 
   Private Shared Function RedrawWindow(hWnd As IntPtrlprcUpdate As IntPtrhrgnUpdate As IntPtrflags As RedrawWindowFlags) As Boolean
    End 
Function

 
   Public Sub New()
 
       MyBase.BorderStyle Windows.Forms.BorderStyle.Fixed3D
    End Sub

    Protected Overrides Sub OnResize
(As System.EventArgs)
 
       MyBase.OnResize(e)
 
       RedrawWindow(Me.HandleIntPtr.ZeroIntPtr.ZeroRedrawWindowFlags.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(00Me.Width 1Me.Height 1))
 
               Else
                    g
.DrawRectangle(Pens.Gainsboro, New Rectangle(00Me.Width 1Me.Height 1))
 
               End If
 
               g.DrawRectangle(SystemPens.Window, New Rectangle(11Me.Width 3Me.Height 3))
 
           End Using
            ReleaseDC
(m.HWndhDC)
 
       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
قمنا بتغير لون الخلفية الى اللون الذي نريد  , غيرها لما تحب
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
#4
(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 IntPtrByVal hDC As IntPtr) As Boolean
    End 
Function

 
   <DllImport("user32.dll")>
 
   Private Shared Function RedrawWindow(hWnd As IntPtrlprcUpdate As IntPtrhrgnUpdate As IntPtrflags As RedrawWindowFlags) As Boolean
    End 
Function

 
   Public Sub New()
 
       MyBase.BorderStyle Windows.Forms.BorderStyle.Fixed3D
    End Sub

    Protected Overrides Sub OnResize
(As System.EventArgs)
 
       MyBase.OnResize(e)
 
       RedrawWindow(Me.HandleIntPtr.ZeroIntPtr.ZeroRedrawWindowFlags.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(00Me.Width 1Me.Height 1))
 
               Else
                    g
.DrawRectangle(Pens.Gainsboro, New Rectangle(00Me.Width 1Me.Height 1))
 
               End If
 
               g.DrawRectangle(SystemPens.Window, New Rectangle(11Me.Width 3Me.Height 3))
 
           End Using
            ReleaseDC
(m.HWndhDC)
 
       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 للفورم

كود :
  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 ...... وجمعها جميعا في حدث واحد

الشكر ايضا موصول لك اخوي سامي
الرد
#5
Rainbow 
اخي يمكنك فعل هذا باكثر من طريقة بالاضافة الى ماذكره الاخوان قبلي 

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

   
الرد
#6
بصرحة الطريقة الافضل هي طريقةة أبو ليلي ... طبعا اذا كان كل الــ Textybox  التي في المشروع يستخدم لها نفس الطريقة 
-----
ولكن لا ادري  لماذا  ابو ليلى استخدم هذه الطريقة الطويلة مع وجود طرق اسهل بكثير لانشاء الخصائص داخل الاداة
الرد
تم الشكر بواسطة: asemshahen5 , asemshahen5 , ابو ليلى



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم