Fenêtres et controle tout moches [Résolu]

Signaler
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013
-
 yoyo269 -
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
115
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
19 décembre 2008
1
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
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
<!--
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ben montre moi un programme ou il y a ce problème, juste histoire de vérifier

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
<?
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
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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é !!!