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

EDI Delphi Discussion :

[XE2] Vcl.themes et PageControl.OnDrawTab


Sujet :

EDI Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut [XE2] Vcl.themes et PageControl.OnDrawTab
    Bonjour,

    Je migre une appli de Delphi 2009 à Delphi XE2, jusque là pas de soucis. J'ai voulu tester la nouveauté des thèmes d'apparence, et là mon soucis est que lorsqu'un thème autre que Windows est activé, l'événement OnDrawTab de mon PageControl n'est plus déclenché (alors que OwnerDraw reste à true).
    J'utilise le OnDrawTab pour dessiner des petits boutons de fermeture à droite de chaque onglet (un peu comme dans Firefox).

    Y-a-t-il un moyen de récupérer l'exécution de OnDrawTab tout en gardant les thèmes ? Ou comment redessiner les onglets sans passer par le OnDrawTab sachant que j'ai besoin des paramètres qu'il donne (TabIndex, Rect, Active) ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 737
    Points : 25 654
    Points
    25 654
    Par défaut
    Une solution serait de redéfinir la méthode protégée DrawTab via un héritage du TPageControl,
    soit via un vrai composant et donc un package (pénible)
    soit via une petite arnaque locale genre TPageControl = class(ComCtrls.TPageControl), moche mais rapide !

    Voir ce qui est possible aussi via CNDrawItem et CN_DRAWITEM
    Il doit être possible de changer la TTabControlStyleHook qui gère le Paint via RegisterStyleHook

    Tu devrais voir le Gestionnaire de Style , tu dois pouvoir configurer des choses
    C'est vrai que le bouton façon FireFox, c'est un classique !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Une solution serait de redéfinir la méthode protégée DrawTab via un héritage du TPageControl
    Je n'avais pas pensé à ça mais effectivement je vais regarder du coté de la surcharge du DrawTab car je ne pense pas pouvoir faire ce que je veux avec le gestionnaire de style, c-a-d les boutons que je dessine ne sont que des images que je dessine directement dans le canevas dont je retiens les Rect pour vérifier sur OnMouseMove si la souris passe au-dessus (dans ce cas je change dynamiquement l'image du bouton pour donner un aspect actif).

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Après tests, l'arnaque local ne suffit pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TPageControl = class(Vcl.ComCtrls.TPageControl) //Je ne savais même pas qu'on pouvait faire ça avec le même nom !!! Sûr c'est dégueux
      protected
        procedure DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean); override;
      public
        ImageListTabs: TImageList;
      end;
    Tout comme l'événement OnDrawTab, la proc DrawTab n'est appelé QUE si le thème actif est windows.

    Voir ce qui est possible aussi via CNDrawItem et CN_DRAWITEM
    Il doit être possible de changer la TTabControlStyleHook qui gère le Paint via RegisterStyleHook
    Je vais voir ce que je peux faire de ce coté là, il va falloir d'abord que je trouve un peu de doc (tout lien est le bienvenue ) car je n'ai jamais touché au composant à ce niveau là et je ne connais pas cette classe (TTabControlStyleHook ) et ni RegisterStyleHook.

Discussions similaires

  1. XE2 : CREATION D'UN VCL QRCODE
    Par megs dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/11/2014, 14h35
  2. Réponses: 1
    Dernier message: 20/02/2014, 18h22
  3. XE2 et XP theme affichage incomplet des objets visuels
    Par alheuredudejeuner dans le forum Composants VCL
    Réponses: 1
    Dernier message: 30/03/2013, 13h05
  4. [VCL][TListView]Montrer une ligne à l'écran
    Par ptitbob dans le forum Delphi
    Réponses: 4
    Dernier message: 23/07/2007, 17h35

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