none
Déterminer le contrôle qui avait le focus RRS feed

  • Question

  • Bonjour,

    Dans une form sans bordure, j'ai mis un bouton btnMinimize pour minimiser la form. 

    Dans l'événement qui gère btnMinimize.Click, je veux mettre en variable le contrôle qui avait le focus tout juste avant le clic sur le bouton btnMinimize. Comment identifier ce contrôle?

    Merci!

    mercredi 9 octobre 2013 19:52

Réponses

  • Bonjour,

    J'ai réglé mon problème.

    Dans le gestionnaire d'événement de btnMinimize.Click, j'ai mis les lignes :

    dernierContrôleActif.Focus
    Me.Windowstate = FormWindowState.Minimized

    En ajoutant la ligne dernierContrôleActif.Focus avant de minimiser la fenêtre, j'obtiens le résultat que je veux.

    Merci pour vos suggestions.

    lundi 21 octobre 2013 19:49

Toutes les réponses

  • Bonjour,

    Il suffira de faire une boucle sur les contrôles et de faire un simple If Focus ?

    exemple :

    Public Class Form1
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button1.Click
            For Each ctr As Control In Me.Controls
                If ctr.Focused = True Then
                    MsgBox(ctr.Name)
                End If
            Next
        End Sub
    End Class


    Cordialement,

    mercredi 9 octobre 2013 20:39
    Auteur de réponse
  • Bonjour,

    La classe Form (qui est votre fenêtre) contient une propriété ActiveControl qui représente le contrôle actuellement activé sur votre Form :

    MsgBox(Me.ActiveControl.Name)
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 9 octobre 2013 21:28
    Modérateur
  • Effectivement c'est plus simple :)

    Cordialement,
    Xav


    Cordialement,

    jeudi 10 octobre 2013 07:10
    Auteur de réponse
  • Bonjour à Troxsa et Gilles,

    Merci d'avoir pris la peine de répondre. Malheureusement, ça ne convient pas.

    Vos solutions donnent comme résultat que c'est le bouton btnMinimize qui a le focus alors que je veux savoir quel est le contrôle qui avait le focus avant le clic sur le bouton btnMinimize.

    Quand on clique sur le bouton de l'application dans la barre des tâches pour ramener à l'écran une fenêtre qui avait été minimisée, quel est l'événement de cette fenêtre qui s'exécute lorsque la fenêtre revient à l'écran?

    Merci!

    vendredi 11 octobre 2013 14:26
  • Bonjour,

    Si vous voulez récupérer l'avant dernier contrôle vous pouvez faire un système de pool de contrôle :

    exemple : 

    Public Class Form1
    
        Dim tt As New Stack(Of Control)
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button1.Click
    
            tt.Push(CType(sender, Button))
    
            If tt.Count = 2 Then
                MsgBox(tt.Pop().ToString)
            End If
    
        End Sub
    End Class


    Cordialement,

    vendredi 11 octobre 2013 20:25
    Auteur de réponse
  • Bonjour,

    Voilà un petit bout de code qui contient dans la classe de la fenêtre un champ (variable) "dernierContrôleActif" qui représente le dernier contrôle actif. Le principe ici est de s'abonner dans le Load de la fenêtre à l'événement LostFocus de tous les contrôles.

    Public Class Form1
    
        Private dernierContrôleActif As Control
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            AbonnerLostFocus(Me.Controls)
        End Sub
    
        Private Sub AbonnerLostFocus(controls As Control.ControlCollection)
            For Each control As Control In controls
                AddHandler control.LostFocus, AddressOf OnDernierContrôlePerdFocus
    
                AbonnerLostFocus(control.Controls)
            Next
        End Sub
    
        Private Sub OnDernierContrôlePerdFocus(sender As Object, e As EventArgs)
            Me.dernierContrôleActif = sender
        End Sub
    End Class
    Est-ce que cela répond à votre besoin ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 14 octobre 2013 20:55
    Modérateur
  • Bonjour Troxsa et Gilles,

    Merci d'avoir répondu.

    J'ai réussi à mettre dans la variable ctrlLastControl le contrôle qui avait le focus. Le problème n'est plus là.

    Ma form contient un bouton btnMinimize qui comporte seulement une image. Lorsque je clique sur ce bouton, un cadre apparaît automatiquement autour de l'image pour indiquer que le bouton a reçu le focus, puis la fenêtre se minimise. Lorsque la fenêtre revient à sa taille normale, le cadre est encore visible sur le bouton parce qu'il a encore le focus.

    Je veux que ce cadre disparaisse automatiquement lorsque le fenêtre reprend sa taille normale, et que le focus revienne sur le contrôle qui avait le focus avant.

    Je veux mettre la commande ctrlLast Control.Focus dans un événement qui s'exécute au retour de la fenêtre à sa taille normale mais ça ne fonctionne pas. J'ai beau essayé de mettre cette commande dans tous les gestionnaires d'événements qui me semblent concerner l'affichage de la fenêtre, rien n'y fait. Quel est la chaîne d'événements, dans l'ordre, qui s'exécutent lorsque la fenêtre reprend sa taille normale?

    Tous les contrôles de la fenêtre sont de type LinkLabel, à l'exeption des boutons btnMinimize et btnClose. Se peut-il que les contrôles LinkLabel aient un comportement particulier avec la méthode Focus?

    Merci.
    vendredi 18 octobre 2013 14:03
  • Bonjour,

    Dans votre cas, il semblerait que vous souhaitez pas que dans votre variable ctrlLast figure votre bouton.

    Dans ce cas, ignorez l'abonnement à l'événement LostFocus pour votre bouton "btnMinimize" :

     
        Private Sub AbonnerLostFocus(controls As Control.ControlCollection)
            For Each control As Control In controls
                If control <> btnMinimize Then
                    AddHandler control.LostFocus, AddressOf OnDernierContrôlePerdFocus
    
                    AbonnerLostFocus(control.Controls)
                End If
            Next
        End Sub

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    dimanche 20 octobre 2013 12:23
    Modérateur
  • Bonjour Gilles,

    Dans votre dernière proposition, la ligne If control <> btnMinimize génère une erreur :

    "L'opérateur '<>' n'est pas défini pour les types 'System.Windows.Forms.Control' et 'System.Windows.Forms.Button'.

    J'ai remplacé '<>' par 'IsNot', il n'y a plus de message d'erreur et mon application fonctionne.

    Le problème, c'est que je n'obtiens pas le résultat escompté.

    Voir ci-dessous une image de ma form.

    Quand on clique sur un élément dans la colonne de gauche, une liste d'éléments apparaît dans la colonne du centre. Quand on clique sur un élément de la colonne du centre, une liste d'éléments apparaît dans la colonne de droite. Quand on clique sur un élément de la colonne de droite, l'action associée à cet élément s'exécute. Vous remarquerez le bouton ayant la forme d'un trait horizontal en haut à droite. C'est le bouton btnMinimize qui a reçu le focus. Ce que vous voyez, c'est la fenêtre revenue à sa taille normale après avoir été minimisée. Le focus est encore sur le bouton btnMinimize, c'est pourquoi on voit un cadre autour de ce bouton. 

    Je souhaite que le cadre soit autour de l'élément 'Cartes de membres et reçus', parce que c'est cet élément qui avait le focus avant de minimiser la fenêtre. Je repose ma question précédente:

    Quel est la chaîne d'événements de Form, dans l'ordre, qui s'exécutent lorsque la fenêtre reprend sa taille normale?

    Merci!


    lundi 21 octobre 2013 15:18
  • Bonjour,

    J'ai réglé mon problème.

    Dans le gestionnaire d'événement de btnMinimize.Click, j'ai mis les lignes :

    dernierContrôleActif.Focus
    Me.Windowstate = FormWindowState.Minimized

    En ajoutant la ligne dernierContrôleActif.Focus avant de minimiser la fenêtre, j'obtiens le résultat que je veux.

    Merci pour vos suggestions.

    lundi 21 octobre 2013 19:49