IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[VC2005] Prise en compte du layout RTL aléatoire sur des combobox


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut [VC2005] Prise en compte du layout RTL aléatoire sur des combobox
    Bonjour à toutes et à tous,

    Je travaille sur une application multilingue et devant gérer l'arabe et par conséquent s'affichant de droite à gauche.

    J'ai déjà réussi à effectuer l'effet miroir sur le positionnement des contrôles mais je suis confronté à un problème qui concerne la prise en compte du style WS_EX_LAYOUTRTL au niveau de certaines combobox.

    Voici ce que je fait :
    * lorsque je veux afficher une fenêtre, je récupère son HANDLE et parcours tous ses fils en utilisant la méthode EnumChildWindows
    * pour chaque fils, je récupère le style en utilisant GetWindowLong, j'ajoute le flag WS_EX_LAYOUTRTL et réinitialise le style en utilisant SetWindowLong

    Voici ce que je constate à l'affichage pour certaine combobox :
    * dans la zone d'édition de la combo, lorsque j'ai positionné le flag WS_EX_LAYOUTRTL, le texte est toujours aligné à droite (c'est parfait)
    * dans certains cas, lorsque j'affiche la liste déroulante, le texte est aligné à droite (c'est parfait) et parfois à gauche (ça par contre ce n'est pas le résultat attendu)

    Afin de vérifier que les différents flags sont bien positionnés, j'ai utilisé l'outil Spy++ livré avec VisualStudio. Dans tous les cas les styles sont bien positionnés mais j'ai l'impression que dans certains cas il n'est pas correctement pris en compte par la listebox associée à la combobox.

    En guise de test, voici ce que j'ai implémenté. J'intercepte le message envoyé à la combobox (de mémoire je ne sais plus duquel il s'agit) l'informant que la listebox doit être effacée (WM_CTLCOLOR je crois, en tout cas c'est celui qu'on intercepte généralement pour subclasser la listbox). Lorsque je reçoit ce message, je positionne systématiquement le flag WS_EX_LAYOUTRTL sur la listbox et là ... dans les cas où le texte n'était pas bien aligné dans les listbox je constate que :
    * au premier affichage, le texte n'est toujours pas bien aligné
    * lorsqu'on passe le curseur de la souris sur les différents items, le dessin de l'item est mis à jour et prend en compte le flag WS_EX_LAYOUTRTL
    * aux affichages suivants (tant qu'on ne ferme pas / détruit pas la fenêtre) le flag est bien pris en compte et l'affichage est conforme (alignement à droite des items de la listbox)

    Je tiens à préciser que les combo sont en OwnerDraw et que le code appelé pour afficher les items de la liste déroulante est le même systématiquement.

    Je ne parviens pas à déterminer avec exactitude la source du problème et par conséquent le juste traitement à appliquer pour corriger mon problème (le subclassing systématique des listbox des combobox peut être envisagé mais dans la mesure où dans certains cas la combobox et sa listbox s'affiche correctement, je n'ai pas envie d'ajouter du code supplémentaire à mon application déjà conséquente).

    D'avance merci pour vos réponses.

    Bonne journée à toutes et à tous.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Bonjour à toutes et à tous,

    J'ai finalement trouvé une solution à mon problème, la voici.

    Concernant le positionnementdu style WS_EX_LAYOUTRTL de la LISTBOX associée à ma COMBOBOX, je ne le fais plus lors de l'interception du message WM_CTLCOLOR mais autrement.

    Dans un premier temps, dans la méthode DrawItem, j'efface la zone associée à l'item. Ensuite je récupère les informations associées à la COMBOBOX pour obtenir le HANDLE de la LISTBOX. Si cette dernière n'a pas le style WS_EX_LAYOUTRTL je le force.

    Au final, l'affichage est maintenant systématiquement conforme à mes attentes.

    En espérant que les éléments de réponses servent à quelqu'un(e).

    Bonne journée à toutes et à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retract aléatoire sur des prédicats (dynamic)
    Par je®ome dans le forum Prolog
    Réponses: 2
    Dernier message: 07/01/2007, 13h45
  2. Prise en compte des virgules aléatoire selon le type de curseur ?
    Par mosquitout dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/07/2006, 19h48
  3. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h57
  4. Prise en compte des contraintes
    Par potanie dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/11/2004, 10h00
  5. [MFC]: prise en compte du clavier
    Par ben_iap dans le forum MFC
    Réponses: 8
    Dernier message: 20/01/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo