IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[MENU] Probleme avec un menu deroulant et l'option "Checked" pour un AlwaysOnTop


Sujet :

VB 6 et antérieur

  1. #1
    telodo
    Invité(e)
    Par défaut [MENU] Probleme avec un menu deroulant et l'option "Checked" pour un AlwaysOnTop
    Bonjour,


    Eh oui c'est encore moi ! Je souhaite ajouter une option "Always On Top" a mon programme. Disponible via le menu deroulant (MenuEditor) avec une option "coche" et "decoche".

    Dans mon Menu Editor je coche la case "Checked". Afin que mon option 'Always On Top' soit un menu a cocher/decocher.

    Par defaut AlwaysOnTop (nom de mon option) doit etre coche, et ma Form1 doit etre visible au premier plan. Cependant si l'utilisateur ne souhaite pas cette option il peut choisir de la decocher...



    Voici le code pour faire apparaitre une fenetre visible au premier plan :



    Dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
    Global Const HWND_TOPMOST = -1
    Global Const HWND_NOTOPMOST = -2
    Global Const SWP_NOACTIVATE = &H10
    Global Const SWP_SHOWWINDOW = &H40
    Dans mon menu deroulant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub AlwaysOnTop_Click()
     
    If AlwaysOnTop.Checked = True Then
    SetWindowPos Form1.hWnd, HWND_TOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    Else: SetWindowPos Form1.hWnd, HWND_NOTOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    End If
     
    End Sub


    La premiere ligne verifie si ALwaysOnTop est coche, si oui Form1 reste visible au premier plan. Sinon elle ne l'est pas.


    Mon probleme :

    Lorsque je demarre mon programme, l'option de mon menu AlwaysOnTop est coché. Mais ma fenetre ne reste pas visible au premier plan par defaut. Lorsque je clique sur AlwaysOnTop, le menu reste coché et la fenetre reste visible au premier plan.

    Auriez-vous la solution ? J'esperes que vous aurez compris ce que je cherche !

    Menu AlwaysOnTop coche par defaut au demarrage du logiciel et donc fenetre visible toujours au premier plan. Lorsque l'on clique dessus, il se decoche et la fenetre n'a plus l'attribus toujours visible au premier plan.



    Je vous remercie d'avance et vous souhaite une agreable journee !

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    La propriété Checked est un booléen qui ne sert que de marqueur. Quand l'utilisateur clique sur ce menu, tu vérifies l'état de cette propriété pour déterminer l'action à prendre, en l'occurrence faire flotter la fenêtre au dessus des autres ou pas.

    Cette option est toujours disponible par programmation et le fait de cliquer dessus en mode création ne fait que déterminer un sont état par défaut : soit la valeur True. Ça ne permet pas une gestion automatique comme pour un bouton d'option (radio) ou un CheckBox. Tu dois gérer l'état du menu a mano.

  3. #3
    telodo
    Invité(e)
    Par défaut
    Rha je suis desole, mais j'ai du mal a comprendre.

    Checked n'a aucune valeur, c'est juste un marqueur.

    Donc je dois donner a mon menu une valeure, par exemple 1 = Checked et 0 = Non-Checked.

    Ensuite je teste si mon menu = 1 (checked) pour lui donner l'action a effectuer.


    Je suis un peu perdu en fait, que dois-je faire concretement ? Quel genre d'action ?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Le menu coché à une valeur true ou false
    C'est à toi de positionner la valeur suivant tes besoins et effectuer les actions en fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub AlwaysOnTop_Click()
     
    AlwaysOnTop.Checked = Not AlwaysOnTop.Checked ' bascule le menu
    ' affecte les attributs suivant l'état du menu
    If AlwaysOnTop.Checked Then
      SetWindowPos Form1.hWnd, HWND_TOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    Else
      SetWindowPos Form1.hWnd, HWND_NOTOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    End If
    End Sub
     
    'exemple positionnement au démarrage
    Private Sub Form_Load() ' de la fenêtre de test avec le menu
    ' affiche la fenêtre, coche "au dessus" pour le menu, place les attributs
    Form1.Show
    AlwaysOnTop.Checked = True
    SetWindowPos Form1.hWnd, HWND_TOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    End Sub
    Note: lors du basculement à non coché ta fenêtre reste dessus mais quand tu cliques sur l'autre (n'importe ou) elle passe derrière.

    A+, Hervé.

  5. #5
    telodo
    Invité(e)
    Par défaut
    Merci beaucoup Herve, decidement !

    Donc j'avais bien reussi par la suite a affiche en toujours visible au demarrage. Ce n'etait pas un probleme. Par contre le basculement de menu, ca j'avoue que j'etais loin de la solution.

    En revanche dans le Form_Load tu place "Form1.Show", est-ce obligatoire ? Le resultat est le meme, cependant cela evite t'il d'eventuels bug ou autre ?

    J'essaye tout de meme de faire un truc propre... !


    Mille merci !

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    [Edit] correction.
    Il est préférable de le gérer par le show au moment ou on le souhaite.
    [Fin Edit]

    Mais je laisse à d'autres membres le soin d'apporter des informations complémentaires s'il connaissent bien cette api.

    Bonne programmation, A+, Hervé.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonsoir,
    L'api n'agit en rien sur le fait d'afficher la forme, la feuille de démarage est toujours affichées automatiquement sauf commande spéciale dans le code.
    Le fait d'employer l'api pour mettre la feuille en évidence n'est pas éternel, si une autre appli l'emploie également, ta feuille perd cette particularité, pour y remédier j'emploi une deuxième ligne de menu pour rafraîchir la fonction et comme elle peu donc étre appellée plusieurs fois je le fais au moyen d'une sub.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    '
     
    Public Const FLAGS = SWP_NOACTIVATE Or SWP_SHOWWINDOW
     
    'Place une forme en permanence (presque) au dessus du bureau.
    'Mode = true la forme est au dessus du bureau, si False positionnement normal
    '
    Sub PlaceDessus(Fr As Form, Mode As Boolean)
    Dim i As Long
        If Mode Then
             i = SetWindowPos(Fr.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
        Else
             i = SetWindowPos(Fr.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
        End If
    End Sub
    Comme tu peu le voir, les 4 valeurs intermédiares sont à 0, elles ne servent pas quand c'est une forme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dans form_Load
        PlaceDessus Me , True
    Dans menu
    Sub AlwaysOnTop_Click (Index As Integer)
        select case Index
        case X :    AlwaysOnTop(Index).checked = not AlwaysOnTop(Index).checked
                      PlaceDessus Me , AlwaysOnTop(Index).checked
        case X+1:    PlaceDessus Me , AlwaysOnTop(Index-1).checked
    Voila une petite idée supplémentaire.
    A+

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    A LeForestier,
    tout à fait exact, elle s'affichait parcequ'on l'utilisait dans les paramètres de l'api ([EDIT]=>d'une façon particulière => "Form1.Left / 15"), et cela même sans le "Form1.Show".
    Avec 0 pas d'affichage, il faut donc le show.
    Note : ma form principale s'appelle FromTest, form1 est une 2ème form.

    Merci, A+, Hervé.

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    à Hervé,
    Comme stipulé dans mon poste précédant, j'ai supposé que ta forme était la forme principale, Sinon, bien sur qu'il faut la méthode Show.
    A+

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    Bonjour,
    à Hervé,
    Comme stipulé dans mon poste précédant, j'ai supposé que ta forme était la forme principale, Sinon, bien sur qu'il faut la méthode Show.
    A+
    Certe, et je suis d'accord,

    Mais dans mon cas, lors du load de la fenêtre principale (qui s'appelle "frmTest", je ne l'avais pas précisé)
    "form1" étant une 2ème fenêtre (celle que je place au dessus).

    Si l'on écrit (dans le load de "frmTest)"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowPos Form1.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    il faut faire appel à form1.show pour que la fenêtre "form1" s'affiche.

    idem pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowPos Form1.hWnd, HWND_TOPMOST, Form1.Left, Form1.Top , Form1.Width , Form1.Height , SWP_NOACTIVATE Or SWP_SHOWWINDOW
    il faut faire appel à form1.show pour que la fenêtre "form1" s'affiche.


    sauf que dans le cas de ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowPos Form1.hWnd, HWND_TOPMOST, Form1.Left / 15, Form1.Top / 15, Form1.Width / 15, Form1.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
    la "form1" s'affiche sans faire l'appel "form1.show"

    C'est ce qui m'intrigue.

    A+, Hervé

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    C'est en effet intriguant, j'ai testé chez moi, mais quel que soit le mode employé la form2 ne s'affiche pas, même avec les dimentions...
    A+
    Edit: quelques recherches plus tard...
    SWP_SHOWWINDOW
    Displays the window.
    If the SWP_SHOWWINDOW or SWP_HIDEWINDOW flag is set, the window cannot be moved or sized.
    Surement une question de Flags..

    Edit2:
    C'est effectivement une question de Flags , je n'avais pas SWP_SHOWWINDOW sur l'appli et quand je l'ai ajouté la forme 2 s'affiche sans show.

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bien vu
    Je ne m'étais pas soucié des flags.
    L'api peut donc gérer l'affichage suivant les flags.
    Merci.

Discussions similaires

  1. Probleme avec le menu
    Par MayOL69bg dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/03/2007, 14h34
  2. probleme avec struts menu
    Par khaledirb7 dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/03/2007, 12h57
  3. [c#]probleme avec les menu toolStripItem dans une form mdi??
    Par must19 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/11/2006, 23h02
  4. [CSS] Probleme avec mon menu css
    Par otagun dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 13/05/2006, 14h37
  5. Probleme avec un menu déroulant
    Par grumly22 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/05/2006, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo