Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MAINTENIR UNE FENÊTRE NON MODALE AU PREMIER PLAN AVEC L'API SETWINDOWPOS EN 2 LIGNES DE CODE


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 23/07/2004 Vu : 14 503

Note :
6,4 / 10 - par 5 personnes
6,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Permet de maintenir une fenêtre non modale au premier plan quand elle perd le focus
 

Source

  • ' déclaration des constantes et de l'aPI
  • Private Const SWP_NOSIZE = &H1
  • Private Const SWP_NOMOVE = &H2
  • Private Const HWND_TOPMOST = -1
  • Private Declare Function 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) As Long
  • Private Sub PremierPlan(F As Form)
  • ' appel de la fontion
  • Call SetWindowPos(F.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, (SWP_NOSIZE Or SWP_NOMOVE))
  • End Sub
  • Private Sub Form_Load()
  • ' appel de la fontion au chargement de la feuille
  • PremierPlan Me
  • End Sub
' déclaration des constantes et de l'aPI
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_TOPMOST = -1
Private Declare Function 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) As Long

Private Sub PremierPlan(F As Form)
 ' appel de la fontion 
Call SetWindowPos(F.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, (SWP_NOSIZE Or SWP_NOMOVE))
End Sub

Private Sub Form_Load()
 ' appel de la fontion au chargement de la feuille 
PremierPlan Me
End Sub

Commentaires et avis

signaler à un administrateur
Commentaire de Tilois le 24/07/2004 10:25:53

Dit moi, tu as repomper ce code sur le site ou quoi ?

signaler à un administrateur
Commentaire de Golog le 24/07/2004 15:00:56

c kler, y a j'c po cbs d'exemple de ce code sur le site...

signaler à un administrateur
Commentaire de legion91 le 24/07/2004 16:43:25

Deja ton code il y est deja sur le site mais avec une touche de mieux:


Private Declare Function 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) As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Declare Function SetActiveWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hWnd As Long) As Long


Private Sub Timer1_Timer()
SetActiveWindow Me.hWnd
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub

Et dans ce code la oui elle reste au premier plan.

signaler à un administrateur
Commentaire de huelce le 25/07/2004 02:25:00

Heu legion91... quel intérêt d'utiliser un timer ?! C'est pas le genre de chose à dire aux newbies, il vont en mettre partout !
L'appel du topmost (cette source ne parle que de ca)  dans le form.load est très bien comme ça. Ca t'évite un appel inutile à SetActiveWindow si je ne m'abuse.

Ce qui serait mieux c'est de montrer un exemple avec SetWindowLong (et GWL_HWNDPARENT par exemple) pour en plus du topmost, mettre la feuille fille de l'appellante. Cela permet qu'elle reste au dessus de la feuille mère sans pour autant rester au dessus de toutes les autres applications. Et ca a aussi bien d'autres avantages.

signaler à un administrateur
Commentaire de legion91 le 26/07/2004 00:02:06

huelce> c'est vrai que de facon general j'aime pas les timers (pas precis, ...) mais pour laisser une fenetre au premier plan (devant toute les fenetres) et ceux tout le temp ya pas 36façons.

Sinon ce que tu propose (j'ai pas chercher à le faire) c'est de faire une form modal lol, sa peut etre interressant.

signaler à un administrateur
Commentaire de huelce le 26/07/2004 01:50:26

Le but de cette source : maintenir une fenêtre non modale au premier plan quand elle perd le focus.
C'est à dire lui appliquer ce qu'on appelle communément le 'topmost'. Pour cela il suffit d'appeller UNE fois l'api SetWindowPos dans le form.load et c'est régler.

Pour te répondre, ce que je propose, et que j'applique pour toutes mes feuilles type 'boites à outils' n'est pas l'équivalent d'une feuille modale qui t'enpecherait d'utiliser une autre feuille, car qui dit modale dit garde le focus.

Je rééxplique donc, quand tu appliques le topmost à une feuille, c'est à dire quand tu fais :

'délcarations
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, Y, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const HWND_TOPMOST = -1
'Const HWND_NOTOPMOST = -2
Const SWP_NOMOVE = &H2
Const SWP_NOSIZE = &H1
Const TOPMOST_FLAGS = SWP_NOMOVE Or SWP_NOSIZE

'Form.Load()
SetWindowPos Feuille.hwnd, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS

Cette feuille restera en effet au dessus d'une éventuelle feuille mère mais aussi au dessus de toutes les applications ouvertes ! Ce qui peut être très génant...

Prenons l'exemple des boites à outils de photoshop, elles sont topmost à photoshop, mais pas aux autres applications.

De plus, quand tu utilises un topmost pur, quand tu réduit la feuille mère (pour utiliser une autre app), ta boite à outils ne se réduit pas... et reste toujours au dessus des autres apps.

Pour réussir cela, il faut rendre la boite à outils fenetre fille de l'appellante (ou lui indiquer la mère comme parent, ce qui revient au même) avec l'api setwindowlong.
Dans ce cas, inutile d'utiliser le topmost, sauf si la fenêtre mère est aussi topmost au moment de l'ouverture de cette boite à outils.

Hmm j'ai peur de ne pas être clair dans mes explications...

Voici un exemple, pour une fenêtre type boite à outils.

'-- déclarations
'setwindowlong
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
'Constantes 'parent' pour : SetWindowLong
Public Const GWL_HWNDPARENT As Long = -8
'pour SetWindowLong
Private OriginalParentHwnd As Long

'setwindowpos
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, Y, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const HWND_TOPMOST = -1
Const SWP_NOMOVE = &H2
Const SWP_NOSIZE = &H1
Const TOPMOST_FLAGS = SWP_NOMOVE Or SWP_NOSIZE

'-- dans form.load()
'pour rendre Fmain (exemple d'une fenêtre mère nommée fMain) parent
OriginalParentHwnd = SetWindowLong(Me.hwnd, GWL_HWNDPARENT, fMain.hwnd)
'ensuite si fmain est topmost à ce moment là, et uniquement
SetWindowPos me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS

'-- dans le form.unload()
'remet à la normale avant de quitter (sécurité)
Dim R As Long
R = SetWindowLong(Me.hwnd, GWL_HWNDPARENT, OriginalParentHwnd)

Voilà, met ce code dans une fenêtre (ou plusieurs), et ouvre la (les) normalement depuis une fenêtre mère :
FrmFille.show

Résultat : elles seront bien toujours topmost à ta fenêtre mère, mais pas des autres fenêtres de ton bureau !
Réduit ta fenêtre mère et admire :)

signaler à un administrateur
Commentaire de Scorpio93 le 26/07/2004 10:47:57

Tilois je n'ai pas consulter les plus de 11000 codes avant de déposer le mien.
Merci a huelce pour ses explications très claires

signaler à un administrateur
Commentaire de Renfield le 26/07/2004 14:44:42 administrateur CS

une recherche est toujours possible, et filtre un bon paquet de ces 11 000 sources ;)

Renfield - Admin CS

signaler à un administrateur
Commentaire de Silmon le 29/07/2004 17:19:45

Huelce, MERCI!!!

Cela faisait longtemps que je cherchais le moyen, d'utiliser
une form top-most relative.

Et j'en avait besoin justement dans le contexte d'une boite à outil.

J'avais crée un editeur de texte avec une fenetre pour rechercher un texte.
L'api SetWindowPos presentait evidemment ses problemes classiques. Aussi, est-je passé beaucoup de temps en testant avec d'autres parametres, utilisant d'autres moyens et recherchant dans les 11000 sources une solution pour rendre une fenetre topmost relativement a une et une seule autre fenetre.

Ton commentaire m'a grandement depanné. 10/10 rien que pour ça. Merci

signaler à un administrateur
Commentaire de StouffR le 06/01/2005 11:56:24

huelce: Pour moi ton code fait la même chose que le premier avec plus de codes.

Et puis ce genre de code ne permet pas de voir les msgbox :s

signaler à un administrateur
Commentaire de illumen75013 le 17/05/2006 18:29:12

HOURRA!!!!!
Vive lui !!!

des mois, que dis je, des années que je me tulupine le cerveau
à essayer d'avoir une vrai toolbox

fini ma fenetre dependante qui traine en premier plan quand j'ai plusieurs programmes d'ouverts

encore merci

signaler à un administrateur
Commentaire de big_S le 19/05/2006 02:53:29

impec c est ce ke je cherchais merci pr ton code

signaler à un administrateur
Commentaire de huelce le 21/05/2006 19:25:46

lol
voila 2 ans que j'ai posé ce commentaire, et d'un coup je recois dans mon courrier "Vous avez recu un commentaire CodesSources" ?

Ce code, je l'avais cherché TRES longtemps moi aussi, et j'avais trouvé cette solution hyper pratique je sais plus ou...

Tant mieux si elle sert encore !

En attendant, je désactive le suivi de cette conversation !
Adieu donc ;)

signaler à un administrateur
Commentaire de ROOTVL69 le 30/05/2006 16:21:53

C'est vrai que le code produit des effets très sympas, mais la feuille disparait quand par exemple windows media player est en plein écran, ce qui me gene pour un projet en cours...
Quelqu'un a une idée?

signaler à un administrateur
Commentaire de Ouneufe le 18/02/2008 17:18:07

c'est bien cette source, juste ce qu'il me fallait.

Merci.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.