begin process at 2010 02 10 07:39:52
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Débutant Date de création :23/07/2004 Vu :16 154

Auteur : Scorpio93

Ecrire un message privé
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



 Sources du même auteur

Source avec Zip MODIFIER LES PROPRIÈTÉS D'UNE BASE ACCESS AVEC VB6

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) FAIRE LA DIFFÉRENCE ENTRE UNE ADRESSE EMAIL QUI EXISTE D'UNE... par lesinfosdugeek
ENVOYER UN MESSAGE SUR SON COMPTE TWITTER par lesinfosdugeek
Source avec Zip Source avec une capture TROUVER LES CLÉS DE REGISTRE QUI CHANGENT par Flocreate
Source avec Zip IP_PUBLIQUE_INTERNETGETCONNECTEDSTATE par marco62118
Source avec Zip TOUTES LES RÉSOLUTIONS D'ÉCRAN ET TAILLE MAXI DE LA FORM AUD... par marco62118

Commentaires et avis

Commentaire de Tilois le 24/07/2004 10:25:53

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

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...

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.

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.

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.

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 :)

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

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

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

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

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

Commentaire de big_S le 19/05/2006 02:53:29

impec c est ce ke je cherchais merci pr ton code

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 ;)

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?

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales