[vb6] mdi child toujours visible, c impossible???

mdi child toujours visible, c impossible??? [vb6] - VB/VBA/VBS - Programmation

Marsh Posté le 10-08-2003 à 01:31:37    

j'ai dans un feuille mdi
 
- une form qui prend tout la largeur & longeur
- et un petit form de 100x100
 
je voudrai que la petite form soit toujours visible dans la feuille mdi meme si on clic sur la grande form
 
j'ai mis ca dans un module :  
 

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)


 
et ca dans la form parent
 
 

Form1.Show
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
SetWindowPos Form1.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW


 
mais ca marche pas et ca fait 8 heure que je suis dessus est ce que qq1 peut me depanner ca m'aiderai vraiment
 
merci

Reply

Marsh Posté le 10-08-2003 à 01:31:37   

Reply

Marsh Posté le 10-08-2003 à 03:49:17    

C'est normal ... tu passe l'hWnd de la grande feuille. Il faut que tu récuperes l'hWnd des feuilles fille (via FindWindow, par exemple) et tu passes l'hWnd retourné à SetWindowPos.

Reply

Marsh Posté le 10-08-2003 à 04:16:42    

tu veu parler de Form1.hWnd? paske Form1 c le nom de la ptite mdi child

Reply

Marsh Posté le 10-08-2003 à 04:23:22    

Tu es sur ?? bizarre ... je n'ai jamais fait d'application MDI mais bon, je ne vois pas pourquoi ca ne s'appliquerais pas dans ce contexte [:anne-sophie]
 
MAJ : ca vient peut etre de ton flag, je fais pour ma part
 
SetWindowPos Form1.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE


Message édité par karlkox le 10-08-2003 à 04:27:50
Reply

Marsh Posté le 10-08-2003 à 11:55:52    


Fonction SetWindowPos


 

Code :
  1. Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" ( _
  2.                  ByVal hwnd As Long, _
  3.                  ByVal hWndInsertAfter As Long, _
  4.                  ByVal x As Long, _
  5.                  ByVal y As Long, _
  6.                  ByVal cx As Long, _
  7.                  ByVal cy As Long, _
  8.                  ByVal wFlags As Long) As Long


 
 


Cette API permet d'afficher la fenêtre où bon vous semble sur  
l'écran en exécutant une méthode du type move avec la possibilité de laisser la feuille toujours au premier plan d'affichage.  
hwnd est le handle de la feuille,  
hWndInsertAfter est une des contantes définies ci-dessous,  
X, Y, cx et cy sont respectivement les coordonnées et les dimensions de l'image.  
wFlags est une combinaison de constantes ci-dessous.  
 
 
HWND_BOTTOM 1 -->Place la fenêtre en dessous de toutes les autres.  
HWND_NOTOPMOST -2 --> Place la fenêtre au dessus de toutes les fenêtres qui n'ont pas l'attribut "TOPMOST" (et en dessous de ces dernières).  
HWND_TOP 0 --> Place la fenêtre au premier niveau.  
HWND_TOPMOST -1 --> Place la fenêtre au premier niveau, celle-ci conserve cet attribut même lorsqu'elle perd le focus.  
SWP_HIDEWINDOW &H80 --> Cache la fenêtre.  
SWP_NOACTIVATE &H10 --> N'active pas la fenêtre.  
SWP_NOMOVE &H2 --> Garde la même position (les paramètres X et Y ne sont pas pris en compte).  
SWP_NOSIZE &H1 --> Conserve les dimensions courantes (paramètres cx et cy pas pris en compte).  
SWP_SHOWWINDOW &H40 --> Affiche la fenêtre.  


 

Code :
  1. Exemple d'utilisation :
  2. ' Cette fonction vous permet de créer des boîtes à outils (Toolbox).
  3. Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
  4.         ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
  5.         ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
  6. Private Const HWND_TOPMOST = -1
  7. Private Const HWND_NOTOPMOST = -2
  8. Private Function PositionForm(ByVal Feuille As Form, Optional PrePlan As Boolean = True) As Long
  9. Dim lgConst As Long
  10. If PrePlan Then
  11.     lgConst = HWND_TOPMOST
  12. Else
  13.     lgConst = HWND_NOTOPMOST
  14. End If
  15. PositionForm = SetWindowPos(Feuille.hwnd, lgConst, _
  16.                 Feuille.Left \ Screen.TwipsPerPixelX, _
  17.                 Feuille.Top \ Screen.TwipsPerPixelY, _
  18.                 Feuille.Width \ Screen.TwipsPerPixelX, _
  19.                 Feuille.Height \ Screen.TwipsPerPixelY, 0)
  20. End Function
  21. Private Sub Form_Load()
  22. ' Pour mettre une Feuille au premier plan, il suffit alors d'ajouter le code suivant:
  23. PositionForm Form1
  24. ' Pour qu'elle retrouve un comportement normal:
  25. PositionForm Form1, False
  26. End Sub


 
va sur ma signature API WINDOWS. sa vient de là. Les constantes comme les fonctions se déclare dans les modules en mode public ou en private avant le code à proprement dit, comme montré dans l'exemple. Les constantes n'ont rien à faire dans la code....comme je le vois. Tu mets juste leur valeur et uniquement !


Message édité par cvb le 10-08-2003 à 11:56:55
Reply

Marsh Posté le 10-08-2003 à 13:33:13    

Je ne pense pas que ca vienne de la, tu peux tres bien déclarer les constantes dans le bloc de la fonction PositionForm. Non, je pense que ca vient de son hWnd, il doit croire que le form1.hWnd correspond a celui de sa fenêtre MDI mais chaque fenêtre fille à son propre hWnd ...

Reply

Marsh Posté le 10-08-2003 à 15:41:22    

karlkox a écrit :

Je ne pense pas que ca vienne de la, tu peux tres bien déclarer les constantes dans le bloc de la fonction PositionForm. Non, je pense que ca vient de son hWnd, il doit croire que le form1.hWnd correspond a celui de sa fenêtre MDI mais chaque fenêtre fille à son propre hWnd ...


 
je pense également, mais quand je vois des constantes déclarés, comme il le fait dans son code, sa fait bizarre ! [:athlonmp]

Reply

Marsh Posté le 17-08-2003 à 16:30:24    

merci pour toute vos reponses mais j'ai toujours ce probleme, voila ce que je fait et ca marche pas http://kabee.free.fr/contacts_spac [...] ditest.zip
 
ya forcement quelque chose que je fait pas correctement mais koi :??:  
 
dans mon exemple au dessus je voudrait juste que form2 soit toujours visible
 
 :jap:

Reply

Marsh Posté le 17-08-2003 à 18:06:58    

up

Reply

Marsh Posté le 17-08-2003 à 20:00:20    

Je viens de regarder mais tu ne peux pas mêttre que la form2 visible, il faut que la form mère (MDIform) le soit aussi.

Reply

Marsh Posté le 17-08-2003 à 20:00:20   

Reply

Marsh Posté le 17-08-2003 à 22:42:12    

c a dire?
 
je veut que la 2 soit "superieur" à la 1 et 3

Reply

Marsh Posté le 18-08-2003 à 12:12:05    

tu auras une feuille qui saura toujours au dessus d'une autre ! c'est quelques choses d'évident ! Si tu veux afficher la feuille trois, pour y faire des manip, tu ne peux pas demander à la deux d'être au premier plan, c'est pas jouable et inversement! Et ce quels soient au des fenêtres filles MDI ou "normal"...
 
Aprés si tu veux afficher ta feuille 2 au premier plan, pour une raison quelconque, tu peux le faire avec l'API windows.  
 
Personellement, - je n'ai pas essayé avec les feuilles fille MDI - je l'ai fais avec des feuilles normal et le code vérifier et revéfifier, n'as jamais fonctionner, sauf dans le cas d'un projet avec uniquement deux feuilles...j'avais toujours la feuille que je voulais mettre au premier plan, en arrière plan, ou dans la barre des tâches. Elle ne prenait pas la priorité sur une application X, comme Word ou quelques choses comme ça. C'est peut-être VB qui ne digère pas cette API windows dans certains des cas. Il faut vérifier.


Message édité par cvb le 18-08-2003 à 12:23:46
Reply

Marsh Posté le 22-08-2003 à 18:46:07    

cvb a écrit :

tu auras une feuille qui saura toujours au dessus d'une autre ! c'est quelques choses d'évident ! Si tu veux afficher la feuille trois, pour y faire des manip, tu ne peux pas demander à la deux d'être au premier plan, c'est pas jouable et inversement! Et ce quels soient au des fenêtres filles MDI ou "normal"...
 
Aprés si tu veux afficher ta feuille 2 au premier plan, pour une raison quelconque, tu peux le faire avec l'API windows.  
 
Personellement, - je n'ai pas essayé avec les feuilles fille MDI - je l'ai fais avec des feuilles normal et le code vérifier et revéfifier, n'as jamais fonctionner, sauf dans le cas d'un projet avec uniquement deux feuilles...j'avais toujours la feuille que je voulais mettre au premier plan, en arrière plan, ou dans la barre des tâches. Elle ne prenait pas la priorité sur une application X, comme Word ou quelques choses comme ça. C'est peut-être VB qui ne digère pas cette API windows dans certains des cas. Il faut vérifier.


 
mais pourtant j'ai deja vu des appli vb avec des mdi dont une été toujours visible quand l'utilisateur le désirai donc je c'est que c'est possible. C'est forcement moi qui utilise mal l'api windows.

Reply

Marsh Posté le 22-08-2003 à 19:47:42    

fils_de_la_lumiere a écrit :


 
mais pourtant j'ai deja vu des appli vb avec des mdi dont une été toujours visible quand l'utilisateur le désirai donc je c'est que c'est possible. C'est forcement moi qui utilise mal l'api windows.


 
ne confonds tu pas avec avec les feuilles modal et non modal, dans ce cas là c'est trés simple, la feuille en arrière plan n'est pas accessible et le code est trés simple :
 
load form1
form1.show 1
 
@+

Reply

Marsh Posté le 22-08-2003 à 21:07:11    

cvb a écrit :


 
ne confonds tu pas avec avec les feuilles modal et non modal, dans ce cas là c'est trés simple, la feuille en arrière plan n'est pas accessible et le code est trés simple :
 
load form1
form1.show 1
 
@+


 
lorsque que je lui dit ça il me répond assez explicitement :D :
 
Les feuilles MDI filles ne peuvent pas être affichées modalement. Mais bon c form1.show 1 qui renvoie cette erreur, je suis casi sur qu'avec une api bien faite on peut faire afficher une mdi fille toujours visible par rapport aux autres MDI fille

Reply

Marsh Posté le 22-08-2003 à 22:22:43    

fils_de_la_lumiere a écrit :


 
lorsque que je lui dit ça il me répond assez explicitement :D :
 
Les feuilles MDI filles ne peuvent pas être affichées modalement. Mais bon c form1.show 1 qui renvoie cette erreur, je suis casi sur qu'avec une api bien faite on peut faire afficher une mdi fille toujours visible par rapport aux autres MDI fille


 
Personellement, je n'en connais pas. Essaye sur http://www.mentalis.org/ tu as + de 900 API windows à feuilleté !  [:ddr555]  si tu as des problème avec ta connection, aucun problème, tu peux télécharger une application, qui fonctionne trés bien !  :D  
 
Ensuite concernant l'erreur, je parlais pour des feuilles non MDI qui elle peuvent être modal ! Aprés concernant. Si tu trouves n'hésite pas à nous fournir la solution, sa fera avancé les choses. Perso, sa m'interesse !


Message édité par cvb le 22-08-2003 à 22:23:28
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed