7
votes

Comment changer la légende du CDOCKADEPANE

Comment puis-je forcer une rafraîchissement de la légende d'un CDOCKADPANE dans le pack de fonctionnalités MFC? Je travaille avec l'exemple de style Visual Studio d'onglets, et je veux modifier les légendes des onglets.

Ceux-ci semblent être mis en cache quelque part, comme lorsque je passe des valeurs par défaut, il utilise ce que l'application utilisée sur elle est précédente. Je ne trouve rien dans le registre relatif à cela.

Je modifie la table String IDS_FILE_VIEW et IDS_CLASS_VIEW pour définir les nouvelles légendes. J'ai marché sur la méthode CDOCKAdPane :: CreateEex et le paramètre LpszCaption contiennent la nouvelle légende, mais l'ancienne légende est toujours utilisée.

Les nouvelles légendes ne semblent pas charger que le volet ne soit caché et à nouveau. Cela devrait être un indice, mais je ne peux pas comprendre.

Pourquoi ne pas simplement utiliser ce que je passe comme la légende à CreateEx ???


0 commentaires

6 Réponses :


6
votes

En bref, il s'agit d'un bogue dans le pack de fonctions MFC - en fait dans la bibliothèque de logiciels BCG. Le bogue est que vous ne pouvez pas modifier ces légendes de manière dynamique. Leur réponse est "Pourquoi voudriez-vous faire cela?"

Les légendes pour les vitres à tabouilles dans le volet dotée sont stockées dans le registre. Les légendes utilisées à la création ne sont pas utilisées si les légendes existent déjà dans le registre.

Donc, la première fois que vous exécutez votre application, il utilisera les légendes de la table à cordes. Après cela, il utilise les légendes du registre.

Utilisation des paramètres créés par AppWizard, les paramètres de registre sont à: xxx

La valeur stockée dans cette touche est essentiellement un fichier binaire qui est sérialisé dans les vitres au démarrage par le gestionnaire d'accueil. Le contenu n'est pas documenté mais vous pouvez voir ce que fait le code dans AFXDockablePanePane.cpp.

J'espère que cela aide quelqu'un d'autre qui appartient à ce problème.


3 commentaires

Grande réponse thx. Ma réponse à «Pourquoi voudriez-vous faire cela?» ... Hmmm ... internationalisation (désolé BCG ... L'anglais n'est pas parlé partout). Ridicule.


Wow c'est tellement absolument ridicule. Je cherchais la raison pour laquelle nos vitres se traduisaient de manière incorrecte pendant environ une heure jusqu'à ce que je sois trébuché sur cette réponse. Merci beaucoup.


Merci pour ce conseil. Après avoir modifié la ressource de chaîne et ne pas avoir de changement dans le titre de l'onglet, je me suis interdit si j'avais la bonne chaîne. Curieusement, l'indice qui se présente lorsque la souris est placée sur la languette utilise la nouvelle chaîne!



2
votes

hmmm, baybe j'ai mal compris, mais je viens d'appeler "Setwindowtext" sur une instance de CDOCKADPANE. La légende de cela passe à ce que je passe à 'SetWindowtext' ...


1 commentaires

Oui, SetWindowtext fonctionne, mais pas vraiment comme prévu. Vous devez appeler SetWindowtext à un moment donné après que Create est appelée, et cela ne peut pas être le prochain appel après la création. Par exemple, l'exemple VS a une fonction appelée crédikingwindows. Ajout d'un appel à SetWindowtext dans cette fonction (après la création appropriée) ne fonctionne pas. Le point de mon message d'origine était que la fonction Create prend un paramètre de légende complètement ignoré.



0
votes

Le nom de la fenêtre est sérialisé à la Chargard (). Supprimer toutes les informations de registre associées aux positions de la fenêtre dans votre application. Dans mon cas, c'était chez HKCU \ Software \ Mon nom de l'application.


0 commentaires

0
votes

J'ai rencontré le même problème, mais comme je ne veux pas que l'une des solutions proposées ici, je suis allé plus loin et que vous avez constaté que vous pouvez facilement désactiver le chargement de l'état du registre en vous référant au CDockingManager et invoquer la méthode de la méthode désablerestoredockstate


0 commentaires

0
votes

Étant donné que le texte de l'onglet est stocké à l'intérieur du registre, et que le code pour le faire est assez bien caché et non documenté, j'ai trouvé une façon méchante de faire ce que vous voulez.

changer la table des cordes dans votre. Fichier RC à ce que vous voulez, par exemple, j'ai changé la classeView en Layerview ici: p> xxx pré>

dans votre classe de mainframe Ajouter cet appel: P>

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    BOOL bNameValid;

    // set the visual manager and style based on persisted value
    OnApplicationLook(theApp.m_nAppLook);

    GetDockingManager()->DisableRestoreDockState(TRUE); // <-- THIS CALL


0 commentaires

1
votes

J'ai eu un problème similaire qu'après la première fermeture de l'application, deux panes ont le même nom. J'ai supprimé les clés de registre, au premier démarrage tout allait bien, sur la seconde, je me suis retrouvé le même bug. Setwindowtext ("mypane"); Dans la nervation OnSize du volet a fait le saleté. Ce n'est pas le meilleur endroit pour définir la légende de Windows, mais comme l'indique Colerman, Setwindowstext ne fonctionne pas toujours comme cela devrait.

Quoi qu'il en soit, lorsque l'application est démarrée, le processus de pose du volet Appelez toujours OnSize après Création du volet est terminé, donc pour moi, ce sillon sale fait le tour.


0 commentaires