Bug avec les MDI form :-(

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 24 déc. 2006 à 13:35
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 25 déc. 2006 à 19:32
Violent Ken

Salut, j'ai un petit problème avec les MDIforms. Voilà ce que çà donne de temps en temps...
http://www.enregistrersous.com/images/f0ce073f82e5c9126e20b2cda01a3f4d.jpg
Une idée de l'origine de ce bug ?
Merci beaucoup ;)

Et bonnes fêtes à tous

23 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 13:55
Attends !

On voit bien l'image du résultat, mais...
on ne voit pas le code qui la provoque (et qui m'intéresse grandement...), ni les propriétés définies éventuellement en dur...

peux-tu nous les servir, s'il te plait ?
0
Utilisateur anonyme
24 déc. 2006 à 14:01
Salut,

Ce n'est pas parsque tu applique un style autre que celui de MS à tes fenêtres ?
Je me souviens que j'avais quelques problèmes avec ca mais pas sur les mdi.




__________
Kenji
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
24 déc. 2006 à 14:04
Violent Ken

Salut, certes je n'ai pas donné le code, mais j'esperais en fait que ce bug soit un bug connu indépendant de mon programme...

Pour le code qui la provoque, c'est une bonne question... je ne sais pas reproduire l'erreur.
Alors çà peut venir de à peu près n'importe où, mais voilà quand même la procédure qui ouvre une form :

Private Sub mnuOpen_Click()
Dim Frm As Form
    'ouvre un fichier


    On Error GoTo ErrGestion


    'demande le fichier
    CMD.Filter = "Tous |*.*"
    CMD.DialogTitle = "Sélection du fichier à ouvrir"
    CMD.CancelError = True
    CMD.ShowOpen


    If FileExists(CMD.Filename) = False Then Exit Sub
   
    'affiche une nouvelle fenêtre
    Set Frm = New Pfm
    Call Frm.GetFile(CMD.Filename)
    Frm.Show
    lNbChildFrm = lNbChildFrm + 1
    Me.Sb.Panels(2).Text = "Ouvertures=[" & CStr(lNbChildFrm) & "]"
   
    'Call frmContent.ChangeEnabledMenus  'active ou pas certaines entrées dans les menus
   
    Exit Sub
ErrGestion:
End Sub

La procédure GetFile appelle d'autres fonctions, trop complexes (longues) pour être développées ici.

Charles Racaud ==> Non, çà le fait aussi sans le theme perso...

Merci, @+
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 14:14
Le code que tu nous sers là ne pouvant provoquer le résultat incriminé, la raison de ce résultat est clairement à rechercher ailleurs !

Supprime donc tout le reste de ton code et tu verras que cet affichage curieux ne sera plus là !

Et, ma foi, sans savoir ce que fait le reste de ton code, on ne peut deviner...
J'ai toutefois un pressentiment : l'appel de fonctions de l'API de Windows qui viendraient modifier l'affichage (ou "empiéter" sur des zones d'affichage) ... mais, avec le peu que tu nous montres, bien malin serait celui qui pourrait deviner où et comment !...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
24 déc. 2006 à 14:17
A tout hazzard, esseye le la rafrêchire.

Youhou, petite API :
Private Declare Function UpdateWindow Lib "user32" Alias "UpdateWindow" (ByVal hwnd As Long) As Long





__________
Kenji
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
24 déc. 2006 à 14:22
Violent Ken

"Le code que tu nous sers là ne pouvant provoquer le résultat incriminé, la raison de ce résultat est clairement à rechercher ailleurs !" ==> Certes, mais je n'ai aucune idée de quel genre de code peut provoquer le résultat incriminé...

"Et, ma foi, sans savoir ce que fait le reste de ton code, on ne peut deviner" ==> Je n'en doute pas. Cependant, il est impossible de poster 500ko de code et de farfouiller dedans !

"mais, avec le peu que tu nous montres, bien malin serait celui qui pourrait deviner où et comment !... " ==> Je n'en doute pas, c'est impossible de dire "c'est cette procédure qui bug","c'est cet appel d'API qui provoque le bug"... J'esperais simplement que quelqu'un ai déjà rencontré un problème similaire, je ne vais pas vous demander de relire tout mon code :)

"J'ai toutefois un pressentiment : l'appel de fonctions de l'API de Windows qui viendraient modifier l'affichage " ==> Ah, je vais vérifier dans les (très) nombreuses APIs utilisées si quelque chose est en rapport avec l'affichage.

Charles ==> Je vais mettre l'API dans le Form_Activate, merci bien. Mais difficile pour moi de dire si cela va changer quelque chose ou non, l'erreur est très aléatoire et je ne suis pas à nouveau arrivé à l'obtenir tout à l'heure.

Merci, @+
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 14:28
Première rechherche : toutes les fonctions de l'api de Windows que tu utilises et qui se serviraient d'une structure "RECT" (ce ne sont pas hélàs les seules)...
Commence par là !
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
24 déc. 2006 à 14:43
Violent Ken

Pas de RECT à l'horizon, et les seules APIs "graphiques" sont :

ImageList_Draw, OleCreatePictureIndirect, InvalidateRect, ValidateRect, ExtractIcon, DrawIconEx, DrawIcon, StretchBlt.

Et utilisées dans un contexte très différent de celui de l'ouverture d'une childForm

-ImageList_Draw ==> pour...bah comme son nom l'indique
-OleCreatePictureIndirect, ExtractIcon, DrawIconEx, DrawIcon ==> pour l'extraction et la création d'une icone
-StretchBlt ==> dans un ocx perso (progressbar)
-InvalidateRect, ValidateRect ==> pour geler l'affichage de listboxes et listviews

@+
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
24 déc. 2006 à 15:16
Wouhou ton éditeur héxa avance on dirait ;-)

chu pressé de voir ça ^^

Ciaò
- MadMatt -
Vb System Library
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 17:16
Ouais,

moi; ce qui ne me plait pas du tout, c'est que l'on puisse écrire à la fois ceci :

"Pas de RECT à l'horizon"

et celà :

les seules APIs "graphiques" sont : "ImageList_Draw, OleCreatePictureIndirect, InvalidateRect,ValidateRect, ExtractIcon, DrawIconEx, DrawIcon, StretchBlt."

Déjà :  les 2 fonctions mises en gras ci-dessus, utilisent (toutes deux) un paramètre lpRect  (le 2ème) pointant vers une structure RECT contenant les coordonnées du rectangle à ajouter à la région à modifier et si lprect est un NULL, c'est la totalité de la région "cliente" qui est ajoutée à la région considérée (en plein dans le mille...)

<dt></dt>
-Conclusion ? je préfère m'abstenir ... voilà les résultats d'un copier - coller, ma foi ...
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
24 déc. 2006 à 23:06
Violent Ken

Ah tu crois ?

Je n'ai nullement besoin de passer un quelconque paramètre de type RECT, seul un NULL me suffit puisque c'est LA REGION TOTALE qui m'intéresse. Comme dit plus haut, c'est des handles de LISTVIEW que je passe dans cette API, PAS de form.


Alors bouffer du code inutile en déclarant un type RECT dont je ne me servirais pas puisque je passe uniquement &0, non merci.


Alors oui, je le répète, pas de RECT à l'horizon.


Conclusion ? cette API n'a rien à voir avec mon problème (je ne passe pas de handle de form) et je n'ai nullement besoin du type RECT dans mon code.

Et si tu penses en disant "voilà les résultats d'un copier - coller, ma foi" que j'ai pompé le code d'un autre, tu te trompes lourdement...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 23:35
Bien, Violent Kent, bien !

Tu en es donc persuadé... et la suite m'intéressera grandement....
Une question, quand même : tu passes bien un handle, n'est-ce pas, à ces deux fonctions... lequel, donc ?
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
24 déc. 2006 à 23:39
Violent Ken

Je ne suis pas sur de bien comprendre cette réponse.

Mais si tu veux vraiment savoir comment est utilisée cette API, regarde donc ma source :
http://www.vbfrance.com/codes/FILEVIEW-USERCONTROL-POUR-EXPLORER-FICHIERS-OU-DOSSIERS-REMPLACE_40114.aspx
C'est dans la procédure AddFiles()...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 00:17
Je ne vais pas regarder ta source, mais t'inviter à essayer de bien comprendre ce qui se passe lors de l'envoi du message/windows VM-PAINT (tu commenceras alors à comprendre ce qui se passe.. et le grand intérêt qu'il y a à définir les coordonnées concernées dans une structure RECT....). dans le cas de figure qui est le tien avec une MDI et une Form/fille il y a surement un joli petit "conflit" à l'envoi de ce message......

En attendant, tu peux déjà te contenter de lire celà (qui n'est pas exactement adapté à ton cas mais relève du même principe) :

http://www.vbforums.com/archive/index.php/t-148650.html

définis donc clairement ces coordonnées dans une structure RECT, s'il te plait.

Bonne nuit.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 00:21
¨PS avant d'aller dormir ...

Tu ne t'es jamais demandé pourquoi, en fin d'utilisation de ces 2 fonctions, on ne pouvait éviter un très bref effet de scintillement ? Qu'est-ce qui est redessiné totalement à ce moment là, hein ?

Je vais au dodo, maintenant.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 16:57
Bon,

J'ai cherché en vain, pendant des heures, à reproduire ce que tu obtiens, violent_ken

Tu dois avoir raison de penser que ValidateRect et InvalidateRect ne sont pas responsables dans cette affaire car, même en forçant le hwnd vers autre chose (la Form, par exemple), je ne parviens pas à transformer l'affichage de la barre.

J'y parviens par contre en "tripotaillant" l'utilisation de la fonction SetWindowLong accompagnée de la fonction SetLayeredWindowAttributes (sans lui appliquer la "transparence"), mais sans avoir, comme toi, les 2 jeux de boutons côte à côte . En procédant d'une façon, j'arrive à  afficher les boutons à gauche au lieu de à droite. En procédant d'une autre façon, j'arrive à les afficher à droite et à gauche (en même temps), mais jamais côte à côte...

Je commence à fatiguer et suis prêt à "jeter l'éponge"...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 17:15
Voilà que maintenant je parviens à afficher, côte à côte, le caption et les boutons soit le tout à droite, soit le tout à gauche... mais toujours pas 2 fois les boutons côte à côte !
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
25 déc. 2006 à 18:11
Violent Ken

Salut, et joyeux noël ;)

Ne te casses pas la tête, il se peut que se soit un bug indépendant du code (provenant par exemple des dll de Visual Studio).
J'espèrais que quelqu'un connaisse le bug et puisse me guider sur la procédure de résolution, mais comme ce n'est pas le cas je ne vais pas demander de "résoudre" le problème (sans doute trop complexe).

En fait, j'y repense après coup, mais c'est très peu probable que ce soit un bug graphique : en effet les 2 séries de boutons peuvent être cliquées (et celle de gauche provoque un bug). Donc pire qu'un bug d'affichage qui "double" les boutons, c'est un bug qui "créé" en quelque sorte une série de 3 boutons.

Pour l'API SetWindowLong, je l'utilise mais dans un contexte très différent (subclassing d'un ocx perso), donc sans doutes pas en cause non plus.

@+ et désolé d'avoir fait cherché tant que çà.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 18:43
"Donc pire qu'un bug d'affichage qui "double" les boutons, c'est un bug qui "créé" en quelque sorte une série de 3 boutons."

Hé ! Mais celle-là, je viens de parvenir à la faire, avec précisémentSetWindowLong accompagnée de la fonction SetLayeredWindowAttributes.

Ce que tu obtiens, n'est-ce pas, en cliquant sur la petite croix, c'est une espèce de menu déroulant avec :

- Restaurer (en grisé)
- Déplacer
- Taille
--Reduire
--Agrandir
--Alt + F Fermer




C'est comme cela chez toi aussi ?
Si oui, on commence à approcher....
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 déc. 2006 à 19:07
Voilà (à tout hasard), comment je provoque la chose sous VB5 :

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long


Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Command1_Click()
    SetWindowLong Me.hWnd, (-20), &H80000
    SetLayeredWindowAttributes Me.hWnd, 0, 155, &H2
    For i = 1 To 1000 'juste pour "laisser le temps au temps
       DoEvents
    Next
    SetWindowLong Me.hWnd, (-20), &H8000
    SetLayeredWindowAttributes Me.hWnd, 0, 255, &H2
End Sub

On lance, on clique sur Command1, puis on clique sur la petite croix ...
Apparaissent alors 2 séries de boutons (une à gauche et l'autre à droite) et celle de droite se "déroule" comme expliqué dans mon message juste au dessus.
0
Rejoignez-nous