Fenêtres et controle tout moches

Résolu
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 - 31 août 2006 à 11:59
 yoyo269 - 31 août 2006 à 17:56
Salut tout le monde.
J'ai un problème que je ne comprend pas trop. J'utilise VS2005 Pro.
Mon problème se situe dans la création d'interface. Quand j'utilise l'editeur de ressources il m'affiche une belle fenetre avec des bouttons au style XP (coins arrondis, couleurs bleue/oranges, ... bref, le style XP quoi).
Seulement quand je compile et lance mon programme, mes controles sont aux style w95 (tout carré, police toute moche, ...)
Et ca me le fais aussi bien en MFC que en API(CreateWindow/CreateWindowEx).
D'ailleur en API  c'est encore pire, si par exemple je pose un premier boutton à la position (5, 5) et que je lui attribut la taille (50, 20). Puis un second à la position (5, 30) avec la même taille. En toute logique je devrait avoir 5pixel au dessu du premier boutton et 5 autres pixel séparant les deux bouttons, et bien pas du tout.

Tout ceci m'amène à la question : comment faire pour que l'interface ait bien la même gueule que dans l'éditeur de ressource ?
Ah oui, je ne souhaite pas du tout utiliser le .Net, les managés ou je ne sais quoi d'autre. Je veux rester en API Win32 ou au pire en MFC.

Merci de votre aide !

Le travail c'est la santé, ne rien faire c'est la préservé !!!

28 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 17:29
J'ai réussi a faire marcher ton projet:

1) Il faut enlever l'option /MANIFEST du linker
2) Il faut remplacer l'option /MD du compilo par ./MT

Jette un oeil là-dessus pour la suite : http://www.cppfrance.com/code.aspx?ID=36940
_____________________________________
Un éditeur de ressources gratuit pour Windows
3
cs_saifer Messages postés 115 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 décembre 2008 1
31 août 2006 à 12:31
Salut,
Pour ce qui est du style xp la réponse se trouve ici, c'est ce que j'utilise, ca marche à merveille : http://www.cppfrance.com/codes/UTILISATION-STYLES-XP-AVEC-GCC-DEV-CPLUSPLUS-BCC_10904.aspx.
Pour le reste, je n'en ai aucune idée, mais c'est vrai que moi aussi j'ai remarqué qu'il y avait une différence entre les tailles indiquées dans l'éditeur de VS et la réalité ! si quelqu'un à la réponse..

-{ Saifer }-
<hr size="2" width="100%" />http://sypher.fr.nf
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
31 août 2006 à 14:10
Techniquement, sous VC2005, tu n'as pas besoin de faire quoi que ce soit sauf configurer les options de compilation pour avoir le style XP. Aussi, si tu n'utilise pas les thèmes sous ton Windows, il est tout à fait logique que tu ne vois que des boutons standards. Pour les espacements et les positionnements avec l'API directement, c'est normal. Je ne peux pas t'expliquer pourquoi mais il y en un décalage.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
<!--
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 14:13
Salut !
Oui je me disais bien que sous VC2005 je n'avais pas a incorporer le manisfeste puisqu'il le génère tout seul. J'utilise les styles XP sur mon PC, mais j'ai trouver aucune options de compilation qui permettrait d'utilise un theme quelconque.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 14:27
Pour les différences de taille, c'est tout a fait normal. Les tailles et les positions dans l'éditeur de ressources sont exprimées en Dialog Unit et non en pixel. Cela dépend en fait de la police utilisée. Pour s'en convaincre, il suffit d'utiliser une police plus grande, et on voit bien qu'un controle de même taille (en dlg unit) est visuelle plus grand.
Pour la gestion des manifest, je trouve qu'elle est mal intégrée à VS2005, et je continue pour ma part a faire ca à la main quand j'en ai besoin

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 14:33
Concernant les différences de tailles je ne trouve pas ca normal moi. Parce que quand je spécifie les tailles et positions via la fonction CreateWindow ca ne correspond pas non plus. De plus, quelque soit l'echelle utilisée, je reprend mon calcul pour exemple
Si le premier objet est à 5 unité du bord supérieur et mesure 20 unité de hauteur, le second objet doit être positionner à 30 unité du bord supérieur afin de laisser 5 unité entre les deux objets. Que cette unité soit des pixel, des dialog unit, ou encore des clown sur des planches de surf, ca reste pareil.

Pour le manifest, j'ai jamais rien comprit à ce truc du manifeste moi. Je n'ai jamais réussit à en créer un qui soit accepté par le compilateur.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 14:39
Le compilateur ne fait rien avec le manifest, il faut juste le mettre en ressource d'ID 1 et de type RT_MANIFEST
Concernant ces "problèmes" de tailles, tu peux regarder MapDialogRect par exemple. Essaie de te rensigner un peu avant de dire n'importe quoi

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 14:48
Hop hop hop ! Pas la peine de t'ennerver !
Je me suis renseigner et je ne vois pas où j'ai dit n'importe quoi.
J'ai dit que je comprennais rien aux manifeste, j'ai donc toujours fait sans.
J'ai également dis que les tailles et positions déliraient un peu quand j'utilisait les fonction CreateWindow.
Et j'ai dit que l'unité importe peu puisque c'est la même pour toutes les mesure. Chaque controle étant en soit également une fenêtre.
Je pense que vous m'avez mal comprit quand je parlait de problème de taille. Cela ne me dérange pas que quand je place un controle à la position (5, 5) ce ne soit pas des pixels. Ce qui me dérange c'est que si je place le premier à cette position et le second à la position (5, 30), il devrait y avoir systématiquement 5 unitée qui séparent ces deux controle. Que ce soit des cm, des pixel ou autre. Il doit y avoir le même espace entre ces deux controles que l'espace entre le premier controle et le bord de la fenetre. Et ce n'est pas le cas. C'est ce problème qui me dérange.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 14:56
Désolé d'avoir dit ca, je voyais pas ce que des "clown sur des planches de surf" venaient faire la dedans
Les unités sont en coordonnées client, on ne tient donc pas compte des bordures de la fenêtre (impossible de créer un controles en dehors de la zone client, même avec CreateWindow)
Par ailleurs, les unités de dialogue verticales et horizontales ne sont pas les mêmes

Mais si CreateWindow ne créait pas les fenêtres aux bonnes positions, cela se saurait!

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 15:12
Les "clown sur des planches de surf" c'était juste pour imager.
Je sais bien que les coordonées sont ralative à la zone client. Zone. Je sais également que la bordure ne fait pas parti de cette zone.
Je me doute aussi que si la fonction CreateWindow délirai ca se saurait.

J'ai cependant relus la documentation de CreateWindow. Il semblerait que la position (x, y) soit en unité d'ecran (pixel) alors que les tailles (w, h) sont en device unit. Ce qui explique le décalage puisque ca voudrait dire que les unités de tailles ne sont pas les même que les unité de position. C'est celà que tu voulais me faire comprendre ? Je n'ai pas tilter avec la fonction MapDialogRect car rien n'indique cette différence d'unité dans la documentation de cette fonction, elle semble convertir toutes les valeurs, or si la position effectivement en pixel, seul les dimension sont à convertir.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 15:16
Avec CreateWindow, tout est en pixel. Mais fais gaffe si tu as une ListBox par exemple, la taille n'est pas forcément celle désirée (selon que LBS_NOINTEGRALHEIGHT est présent ou pas)

Montre donc un petit programme ou le résultat te semblerait bizarre

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 15:24
Oué ca je savait pour les controles commes la liste box.
Mais si position et taille sont en pixel, comment explique tu la différence d'écart ?

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 15:25
Ben montre moi un programme ou il y a ce problème, juste histoire de vérifier

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 15:35
Humm, j'ai delete toutes mes sources ya pas longtemps, je crer un truc en speed pour te montrer.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 août 2006 à 16:07
Salut,
Personnellement, j'utilise beaucoup CreateWindow() et je n'ai jamais remaqué de problème de position ni de taille des controles. Ces derniers apparaissent toujours aux bonnes positions avec les bonnes dimensions, toutes en pixels. J'aimerais bien voir ton code.
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 16:15
Tin j'arrive pas à reproduire le problème. Ca voudrais dire que j'était
bourré quand me l'a fait ? Ou alors que j'avais fait n'importe quoi ?
j'en c rien. Sur mon test j'ai seulement mis en evidence le changement
d'unité entre la création d'une fenetre et la création d'un élément de
cette fenêtre (largeur de la fenetre : 300, largeur du controle 290, et
le controle apparait plus grand que la fenetre).

Mais mes écarts sont bon ...

Si le problème se repose je te ferais suivre, la je n'est pas le temps
de m'amuser à créer des controles partout pour reproduire mon problème.
Et aussi bien c'est moi qui calculait mal mes coordonnées, mais ca me
surprendrait quand même dans la mesure où j'ai eu le problème
plusieures fois même après avoir fait des crobards sur papier pour
trouver les coordonnées... Enfin bon, désolé de t'avoir embêté avec un
problème qui finalement semble venir d'une mauvaise utilisation du
machin que j'ai entre les deux oreilles...


Quoi qu'il en soit, le truc que je voulais surtout régler, c'était comment avoir les styles XP sur ces controles...

Mon code ? ben c'est tout con :

    HWND b1 = CreateWindow    (
                                "BUTTON",
                                "Bouton 1",
                                WS_CHILD | WS_VISIBLE,
                                5, 5,
                                290, 20,
                                hWndParent,
                                0,
                                hInst,
                                0
                            );
    HWND b2 = CreateWindow    (
                                "BUTTON",
                                "Bouton 2",
                                WS_CHILD | WS_VISIBLE,
                                5, 30,
                                290, 20,
                                hWndParent,
                                0,
                                hInst,
                                0
                            );
........
Ensuite j'utilise souvent une boucle pour attribuer un ID à chacun de mes controles.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 16:18
Le paramètre hmenu de CreateWindow sert justement à attribuer les ID
Pour les style:
-un fichier manifest.xml (le même pour tous les projets)
-en ressource: 1 RT_MANIFEST "manifest.xml"
-et dans ton code: appeler InitCommonControls();

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 16:22
Ah tien, j'avais jamais fait gaffe que hMenu définissait l'ID pours les fenetres qui définissent WS_CHILD, ca va me simplifier la vie ca, merci.
Et dans manifest.xml je met quoi ?

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
31 août 2006 à 16:29
<?
xml


version
=
"1.0"encoding="UTF-8"standalone="yes"?>





<
assembly


xmlns
=
"urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0">






  <
dependency
>






    <
dependentAssembly
>






      <
assemblyIdentity


type
=
"win32"name="Microsoft.Windows.Common-Controls"






                                  

version
=
"6.0.0.0"processorArchitecture="X86"






                               

publicKeyToken
=
"6595b64144ccf1df"language="*"/>






   

</
dependentAssembly
>






  </
dependency
>





</
assembly
>






_____________________________________
Un éditeur de ressources gratuit pour Windows
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 août 2006 à 16:42
Bon ben j'ai fait tout ce que tu m'a dit mais rien n'y fait, j'ai toujours des bouton carrés. Même avec une pplication MFC qui inclus par défaut les manifest et appels à InitCommonControls.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
Rejoignez-nous