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

Windows Forms Discussion :

[VB.NET]Ma Form entre une toplevel Form et une topMost popup


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut [VB.NET]Ma Form entre une toplevel Form et une topMost popup
    Bonjour,

    J'ai un problème et je n'arrive pas tous seul à bout de celui-ci!
    J'ai besoin d'aide:

    J'ai une Form qui ne m'appartient pas, que je n'ai pas créé. Je connais son Handle.
    Maintenant j'ouvre une WinForm, que j'ai créé moi. Et j'aimerai la placer tout le temps devant la premiere!

    j'ai essayer un "SetParent". Ca marche, elle est devant la premiere, mais par contre, elle n'est plus dessiné! elle est tout beige. J'ai pu observer que cette fonction à l'inconvénient que quand on clique sur la fênetre mère, celle-ci étant repeinte, la "fille" ne l'est pas! Donc devient soit transparent, soit pas jolie.

    Si je fais un simple focus, ok, ça passe devant, mais si je clique sur la "mere" ben la "fille" repasse derriere.

    Enfin je ne désire pas, surtout pas la mettre en TopMost. Car les popups du programme mère que je ne controle pas sont en topmost, et doivent le rester! ma form doit s'intercaler entre la fênetre principal du programme en question, et ses popups

    L'idéal aurait été de réglé un ZOrder (la popup en 1, ma Form en 2, et la fenetre principale du programme en 3). Mais j'ai essayé l'API SetWindowPosition, permettant de choisir devant quelle Form ma Form doit apparaitre. Elle apparait bien devant la Form principal du programme, et derriere ses popups. MAIS si je clique sur le programme, Ma Form disparait et passe derriere tout.

    En gros je ne m'en sors pas

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Une solution serait de "surcharger" "effacer et corriger" je sais pas comment la propriété "CanFocus" de ma popup!!

    Ainsi je met ma Form en "TopMost=True", je fais un focus sur les popups existantes du programme mère.
    Et si je clique sur ma Form, elle ne se met pas en focus!!

    Il faudrait que j'arrive àa faire celà! j'ai essayé celà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Overrides ReadOnly Property CanFocus As Boolean
    	        Get
    	            CanFocus = False
    	            Return CanFocus
    	        End Get
    	    End Property
    Mais ça ne marche pas car la propriété "CanFocus" nest pas déclaré "Overridable"

    Comment dois je faire :

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Erreur, ceci concerne les contrôles, et pas les Forms, et peut de toute façon être utilisé en méthode pour un controle pour interdire son focus


    Mais comment interdit on le focus d'une fênetre????

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    C'est pourtant simple, je veux afficher MA form devant UNE form, et qu'elle reste toujours devant cette derniere, même si LA form prend le focus. Celà, sans que MA form soit en TopMost activé.

  5. #5
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Lut,

    Petit Message : Et tu peut pas la mettre en TopMost et après t'arranger avec les popups de l'autre form autrement ?!
    PS : Je connais à peine le VB.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Merci ArHacKnIdE pour ta réponse!

    En fait il s'agit du logiciel Meedio. C'est un logiciel media center. Ses popups son réglé en "TopMost" bien sûr. Quand je clique avec la souris sur Meedio, il se met en "TopLevel" poour passer par dessus troutes les fênetres de Windows, saus ses popups qui sont en "TopMost".
    Donc ma Form à moi, qui doit s'intercaler entre les deux. Si je la met en TopMost, et que j'ouvre en premier ma Form, et apres la popup de Meedio. La popup est bien par dessus ma form. Mais si jamais je clique sur ma form, celle-ci passe en premier plan, et la popup derriere.

    En fait ma Form devrait être en "TopMost-1" Ou en "TopMost derriere ma Popup". Je suis étonné qu'il n'existe aucune façon de régler les couches fênetres précisement! le "ZORDER" pour les forms quoi! Tres tres étonné qu'il n'existe aucune réponse simple!!

    Alors j'ai peut-être une solution mais je peux pas la tester là je suis pas chez moi:

    Je met ma Form en TopMost et je l'affiche. Ensuite j'affiche ma popup (qui est par default en topmost, et je peux pas le changer, c est meedio qui le controle), qui va se mettre par-dessus ma form donc. Et je fais en sorte que dès que la souris survole ma Form, ma form se règle en "TopMost=False". Et quand la souris sort de ma Form, ça remet "TopMost=true". Ainsi si je clique sur ma Form, elle resterai derriere la popup de meedio.
    Et si je clique sur Meedio (sur sa fênetre principale), ma form étant en "topmost" meedio ne devrait pas passer devant!

    Ma seule inquiétude, est que peut-être qu'en faisant un "topmost=true" apres un "topmost=false" ma Form va passer automatiquement devant la popup de Meedio. J'espere que non, vue que "TopMost" est une propriété, pas une action!

    Voilà! Me tarde de tester

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Regardez ce que j'ai trouvé ici: http://msdn.microsoft.com/library/de...tewindowex.asp

    WS_EX_NOACTIVATE
    Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.

    To activate the window, use the SetActiveWindow or SetForegroundWindow function.

    The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
    C'est exactement ce qui me faut je crois!!!

    Ainsi si je clique sur ma FOrm, elle n'ira pas se mettre devant la popup de Meedio, mais restera bien derriere!! Excelentissime! Il me tarde de pouvoir le tester en rentrant chez moii

  8. #8
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Salut,

    Bien essayes de voir ce que tu peux faire avec ça, parce que, là, moi, je suis à court de ressource, en fait je n'ai jamais traité d'un problème comme le tien, j'espère que qqun d'autre pourra t'éclairer un peu plus si tu n'y arrives pas.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Bon je n'y arrive pas! J'ai veritablement besoin d'aide

    J'ai mis ce bout de code dans la class de ma Form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Protected Overrides ReadOnly Property CreateParams() As Windows.Forms.CreateParams
    		    Get
    		        Dim cp As CreateParams = MyBase.CreateParams
    		        cp.ExStyle = cp.ExStyle Or WS_EX_NOACTIVATE
    		        Return cp
    		    End Get
    		End Property
    C'est terrible au sens où quand je clique sur ma Form, elle ne se met pas en foreground! C'est parfait celà!
    Donc là j'ai Meedio en "toplevel" quand je clique sur sa fênetre principale, mais comme ma Form est en topmost, celle-ci reste devant Meedio. Et la popup de Meedio étant en topmost, j'affiche en premier ma Form, puis la popup de meedio, et j ai bien ma form intercalé entre Meedio et la Popup de Meedio!

    MAIIISSSSS si je clique sur Meedio, ma Form passe devant la popup de Meedio Et si j appuie sur la touche "window" de mon clavier, c'est pareil...
    En fait ma Form ne fait pas partis du tout du processus de meedio. C'est pas génial, trop bricole, pas propre, et surtout ça ne marche pas!!

    Bon alors je reviens sur l'API "SetParent". Celle-ci semble être la seule solution claire à mon problème!
    Sur le chargement de ma form, j'ai mis celà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetParent(Me.Handle,New IntPtr(MainHandle))
    messageBox.Show(ME.IsMdiChild)
    "MainHandle" est le handle (en integer) de la fênetre principale de Meedio. Je sais que la fonction n'a pas échoué, car là cette fois ci tout marche au niveau "couche des forms!" J'ai bien ma Form qui s'intercale, et bouge plus de là, entre la popup de meedio et meedio. Même mieux, si je minimize Meedio, ma form se minimze aussi, elle fait partie integrante de Meedio.
    Par contre, le messageBox que j affiche m'indique que ma Form n'est pas une fênetre fille! et surtout elle devient toute beige comme ceci: (ici on ne voit pas la popup):



    Voilà, donc il y a manifestement un problème.

    -Comment utiliser l'API "SetParent" proprement?
    - Comment faire en sorte que ma Form est une nature "MDIChild" à "true"?
    - Pourquoi elle est toute "beigé"?


    MErci pour votre aide!

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Bon ben ça commence à devenir franchement dur tout celà!

    En fait je ne pourrai pas mettre ma Form en "children" de Meedio.
    Car ça n'est pas une form classique. Il s'agit d'une forme utilisant un "alpha-blend" comme le font les widget (pour plus de détails allez voir celà: http://www.developpez.net/forums/vie...light=#2630772).
    En effet j'ai essayé avec une Form classique, tout marche bien. L'affichage ne devient pas tout beige. C'est donc particulier à ma form.

    Eh ben les mecs il ne me reste plus qu'une seule solution:
    "les HOOKS"....
    Rha làlà! J'y ai jamais rien compris à ce truc! Va falloir que je m'y fasse

    Donc ma piste est de:
    laisser ma Form indpendante Meedio, pour pouvoir concerver ces nuances de transparences, la mettre en topmost, lui mettre la proriété "WS_NOACTIVATE" décrite précédement, et à ajouter: intercepter tout les messages "foreground" sur ma Form grâce aux messages de Windows, et les annihiler.

  11. #11
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Bien, bon courage

  12. #12
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Bon ben les mecs (ou plutôt LE mec ). J'y suis arrivé! Je suis trop fier de moi!

    J'ai procédé différement! J'ai en fait appliqué l'alpha-blending directement à une popup de Meedio!
    Donc en fait j'ouvre DEUX popups, la premiere ouverte est celle transformée en "PNG&ses nuances de transparences" (correspondant exactement à ce que j avais fait dans ma Form) et la seconde s'ouvre par-dessus la premiere, et est la popup désirée de Meedio.

    En fait j'ai créé un moteur de popup pour le logiciel media center meedio.La popup de meedio peut avoir une couleur killée, et un alpha de transparence, ça rien de très compliqué en utilisant l'API "SetLayeredWindowAttributes" sur la Form de la popup. Et si on lui attache une image PNG, une deuxieme popup est ouverte derriere la premiere, je lui applique un alpha-blending en correspondance avec la PNG utilisé. L'effet est garantie!
    Regardez:



    Vous voyez bien sur cette image les deux popups! La premiere ne possede que le numéro du volume, et le slider. Car j'ai mis un fond noir à la popup et ai "killé" le noir. La deuxieme popup est derriere la premiere, et je l'ai transformé en une Form avec un alpha-blending, en utilisant l'API "UpdateLayeredWindow". Pour plus de détails sur ce sujet (c'est comme celà que sont affiché les widget sur window xp), allez voir ce lien: http://www.developpez.net/forums/vie...light=#2630772.

    La problème qui restait, et qui interessant pour le forum, était que quand je cliquait sur la popup Rose, ça me l a m étais en front of! Il fallait absolument qu'elle ne se mette pas en foreground lorsque je cliquais dessus!
    Il existe une propriété de EXSTYLE pour les Form, permettant celà! Il s'agit de WS_EX_NOACTIVATE. Mais voilà, elle marchait sur une Form créée par mes soins, mais pas sur la popup de Meedio .
    Alors [b] ce qui faut savoir, pour que la form ne s'active pas lors d'un click sur celle-ci, c'est que cette propriété WS_EX_NOACTIVATE doit être aloué à ses propriétés EXSTYLE, mais aussi, pour une Form qui est la children d'une form parent, elle doit ABSOLUMENT avoir comme propriété STYLE la constante WS_CHILD[b]. Ainsi, avec ces deux propriétés mis sur la popup de meedio, elle n'est plus active lors d'un click sur celle ci!
    C'est très interessant à savoir!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	    Private Const WS_EX_NOACTIVATE As Integer = &H8000000
    	    Private Const GWL_EXSTYLE = (-20)
    	    Private Const WS_CHILD = &H40000000
    	Private Const GWL_STYLE = (-16)
    	Private Const WS_EX_LAYERED = &H80000
    ...
    ...
    Dim ParamEx As Long
    			Dim Param As Long
    	    	ParamEx = GetWindowLong(PopupScreen.WindowHandle, GWL_EXSTYLE)
    	    	Param = GetWindowLong(PopupScreen.WindowHandle, GWL_STYLE)
    	    	Call SetWindowLong(PopupScreen.WindowHandle, GWL_EXSTYLE, ParamEx Or WS_EX_LAYERED Or WS_EX_NOACTIVATE)
    	    	Call SetWindowLong(PopupScreen.WindowHandle,GWL_STYLE,PAram or WS_CHILD)
    Donc tout marche, et sans passer par des hooks OUUFfff
    Merci à ArHacKnIdE pour son soutien
    Et j'espere que ces indications serviront à d'autres developpeurs au hasard de recherches sur google! Car je n'ai trouvé celà nulle part ailleurs, à dire vrai, j'essayais des combinaisons de propriétés totalement au hasard et ça a finit par payer!
    Je vous conseille de regarder le code sur l'alpha-blending en VB.NEt, c'est le seul qui est en ligne, et c'est superbement utile je pense pour afficher des splashscreens magnifiques par exemple, ou pour des widgets sur windowXP.

  13. #13
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Bien voilà tu as tout gagner,
    si il y avait un prix du meilleur auto-répondeur,
    je crois que tu gagnerai

  14. #14
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Mais au fait c'était dans quel but sans indiscrètions ?

  15. #15
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par ArHacKnIdE
    Bien voilà tu as tout gagner,
    si il y avait un prix du meilleur auto-répondeur,
    je crois que tu gagnerai
    Héhé, clair

    Mais au fait c'était dans quel but sans indiscrètions ?
    Exactement ce que j'ai décrit dans mon dernier post au-dessus: permettre d'avoir des popups avec des dégradés/nuances de transparences dans meedio

  16. #16
    Membre extrêmement actif
    Avatar de ArHacKnIdE
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 947
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 947
    Points : 1 921
    Points
    1 921
    Par défaut
    Oui c'est un projet comme un autre (enfin),
    mais le tien il t'as donné du fil à retordre

    @ ciAOo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/02/2010, 12h39
  2. Execution d'une fonction à partir d'une 2ème forme
    Par abbd dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/02/2008, 11h10
  3. Comment partager une même form entre 2 projets ?
    Par WebPac dans le forum Windows Forms
    Réponses: 5
    Dernier message: 31/12/2007, 16h17
  4. Gérer une table volumineuse dans une seule forme
    Par lolo_momo dans le forum VB.NET
    Réponses: 5
    Dernier message: 03/07/2007, 11h55
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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