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 :

[MFC] Comment changer la className de la fenetre principale?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut [MFC] Comment changer la className de la fenetre principale?
    Salut,

    Tout est dans le titre.

    Par défaut, pour créer la fenetre Windows attachée a la Main Frame des applications, le Framework crée une classe de fenetre dont le nom est généré par la méthode: CFrameWnd::GetIconWndClass

    Cela donne des noms du genre "Afx:400000:b:10011...."
    Ce que je voudrais faire serait, au lieu d'utiliser ce nom barbare, d'utiliser mon propre nom de classe.

    Le but de la démarche est de pouvoir faire en sorte que la fenetre principale de mon appli puisse facilement etre trouvee par d'autres applis, et que les deux applis puissent ainsi communiquer par l'envoi de messages.

    Si vous avez des idées, merci beaucoup

  2. #2
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Si j'ai bien compris un avec le HWND de ta fenetre devrai marcher, mais si tu a crée un SDI tu peu mettre sur l'ouverture d'un fichier tu peut faire dans ta Mainframe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->GetDocument()->SetPathName(...)
    Pas testé avec un MDI mais ça devrai marcher....

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Merci, mais...

    SetWindowText va changer le titre de l'appli, et non pas le nom de classe généré pour la fenetre.

    Or, je ne cherche pas a changer le titre de l'appli (Qui par défautest "Untiltled...") car ca serait visible par l'utilisateur.

    Je cherche bel et bien a changer le nom de la classe window. (ou alors toute autre astuce pour permettre a deux applis Windows de se reconnaitre...)

    Merci

  4. #4
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Si mes souvenir sont bon le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindWindowEx(NULL, NULL, NULL, "NomDeLaFenetre");
    n'as pas besoin du classename mais juste du nom de la fenêtre, d'où ma réponse précédente....

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Salut,
    pas besoin de changer la classe de la fenêtre (d’ailleurs c’est pas trop conseillé)
    tu repères le programme avec un findwindow par son nom.
    Pour le traitement du message en reception tu interceptes le message WM_SETTEXT sur la mainframe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    	//{{AFX_MSG_MAP(CMainFrame)
    	ON_WM_CREATE()
    	ON_WM_SYSCOMMAND()
    	//}}AFX_MSG_MAP
    	ON_MESSAGE(WM_SETTEXT   ,OnMsgClt) 
    END_MESSAGE_MAP()
    LRESULT CMainFrame::OnMsgClt(UINT wParam, LONG lParam)
    {
    LPCTSTR lpsz;		
    	lpsz=(LPCTSTR)lParam;
                int bResult=0;
    	if(*lpsz!='&') // test arbitraire pour détecter si le message vient bien de l’extérieur
    			// ça veut dire que le premier octet de transmission == ‘&’
    	{
    		return(0);
    	}
    // traitement
     
    return bResult;
    }
    coté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //-------------------------------------------------------------------------
    int SendCmd(int nNoCmd,char *strParams)
    {
    	CString cmd;
    	cmd.Format("&%d:%s",nNoCmd,strParams);	
    	return ::SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)(const char *)cmd);	
    }
    Ou hwnd est trouvé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HWND hWnd=FindWindow(NULL, "monappli");

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos réponses!

    Le probleme, comme je le spécifiais plus haut (a moins que j'ai raté la marche du train?), c'est que le fait de faire un SetWindowText va changer le titre de mon appli, en tout cas du moins si je le fais sur ma MainFrame, ce que bien entendu je ne souhaite pas.

    Peut etre qu'une solution serait de faire un SetWindowText (ou alors d'envoyer un WM_SETTEXT, c'est la meme chose) a ma View lors de l'initilisation de ma View. Ainsi, grace a FindWindowEx, je pourrais mettre la main de l'extérieur sur ma fenetre.

    Mais bon, je ne trouve pas cela d'une élégance a toute épreuve...

    Ou peut etre y a til un concept, une idée a coté duquel je suis en train de passer?

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ça ne changera pas le nom
    puisque tu interceptes le message settext et que tu dois verifier la coherence du message pour savoir si il vient de l''exterieur ou non pour le traiter.
    j'ai deja utilisé cette technique sans trop de pb.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    maitenant pour des echanges de données plus important un fichier mappé en memoire est plus interressant ,
    le sendmessage permettant dans ce cas de gerer l'acces concurrentiel au buffer partagé .
    autre technique plus evoluée utiliser les pipes nommés mais ça ne fonctionne pas sous 95/98/ME .

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    D'accord, je viens de comprendre l'idée (enfin, une partie):
    Je cherche ma fenetre de l'extérieur avec un FindWindow et ensuite, j'envoie le message avec un WM_SETTEXT.

    Si c'est bien ce que j'ai compris alors:
    - Pour mon FindWindow, il me faut bien en parametre soit le nom d'une fenetre, soit le nom de sa classe... Le nom de la fenetre correspond au nom du type (si je ne change rien) "Untitled - Mon Appli", alors que le nom de la classe sera "Afx...". Et c'est ici que ca coince... Je ne peux pas changer (enfin, en plus, tu m'as dit qu'il ne valait mieux pas) changer le nom de la classe principale. Et si on procede en cherchant par nom de fenetre, il me faudrait la aussi changer le "Untitled Mon Appli" par un nom de fenetre plus explicite pour faire la recherche, mais je n'y tiens pas, car c'est le nom que l'utilisateur voit.... Donc...Comment faire pour identifier ma fenetre avec un FindWindow de l'exterieur?
    - Concernant la communication elle meme, que tu proposes de faire soit avec un WM_SETTEXT, soit avec un File Mappting... En fait, j'utilise (et ca marche déja) un WM_COPYDATA. Ca me permetd'envoyer des structures créées en mémoire. Je pense que c'est un tres bpon compromis....

    Voili.

    Donc, il me reste toujours ce probleme d'identification??

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    regarde ce post sur la faq si ça peut convenir:
    http://c.developpez.com/faq/vc/?page...dWindowDesktop


  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    D'accord,

    Donc, on parle bien du "nom d'application" en tant que "nom de fenetre principale" ou "partie du nom de fenetre principale".

    Donc, finalement, voici les deux solutions que j'ai:
    - Soit chercher toutes les Top Level Windows, et regarder le nom de fenetre et faire un Find pour tenter d'extraire une substring correspondant a mon nom d'appli
    - Soit chercher toutes les CHild Windows (mes view en seront) et chercher dans leur WindowText le nom de mon appli ou n'importe quelle chaine spécialisée, vu que de toute maniere, ce WindowText n'apparait pas dans l'appli pour l'utilisateur...

    Je pense que la 2eme solution est plus fiable et plus rapide... (chercher une String complete plutot qu'une substring)

    Finalement, c'est vrai que pour moi, le mieux aurait été de créer un nom de classe spécialisé pour ma MainFrame, mais a priori, ce n'est pas possible, en tout cas pas facilement (je voulais au début redéfinir CFrameWnd::LoadFrame (méthode virtuelle) mais je ne peux pas le faire facilement...

    Merci!

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Arf... Je viens de voir que FindWindowEx ne permettait pas de rechercher dans toutes les Child Windows du systeme, mais seulement de faire une recherche en descendant un seul niveau... Il me faut donc de toute maniere la main sur la fenetre pricnipale de mon appli, donc, je n'ai plus le choix, et je vais faire une recherche de substring sur le nom de l;a fenetre principale....

    Je pense que ca va marcher!

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    eventuellement si c'est acceptable,
    le programme faisant office de serveur peut aussi inscrire le nom a rechercher dans un fichier ini dont le nom est convenu ou base de registre à un emplacement precis.


  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Oui, ce serait acceptable, j'avais pensé a ce fichier ini, mais je préférais largement quelque chose de fait "a la volée"

    J'en reste donc sur la recherche de substring sur les noms de Tolevel Windows...

    Par contre, question subsidiaire.... Pouquoi n'est il pas bon de changer le nom de classe de la fenetre principale??

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Et bien je suis pas allé vérifier ,mais peut on garantir que dans tous les mécanismes utilisés par les mfc sur la création des toolbars ou autre composant du framework ,le nom de classe n’est pas important ?,
    je pense entre autre au mécanisme de rafraîchissement des toolbars ou a l’affectation du nom dans un contexte MDI .
    par mesure de précautions je ne toucherais pas au nom des classes du framework .
    Je préférais faire une fenêtre utilisateur popup cachée par exemple avec un nom de classe spécifique ça d’accord.


  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 79
    Points : 17
    Points
    17
    Par défaut
    Oui, tu as raison dans le fonds! (meme si je n'ai jamais vu de fonctions MFC faisant appel en interne au nom de la classe de la Main Frame)

    Mais si je posais la question, c'est aussi que je constate que dans bons nombres de programmes du commerce, le nom de classe de la fenetre principale n'est jamais "Afx...". Et pourtant, je pense bien que beaucoup de programmes du commerce ont été développés en utilisant le Framework MFC...

    Bref, en tout cas, c'est bon, pour ma part, tout marche bien, et je me base définitivement sur le nom de la fenetre que sur le le nom de classe.

    Merci !

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

Discussions similaires

  1. comment changer le titre de la fenetre GUI
    Par dalilnet dans le forum Débuter
    Réponses: 2
    Dernier message: 21/08/2008, 20h19
  2. comment changer la taille d'une fenetre html
    Par coelho dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/12/2006, 12h48
  3. Réponses: 3
    Dernier message: 16/05/2006, 10h32
  4. Réponses: 1
    Dernier message: 12/05/2006, 09h26
  5. Réponses: 13
    Dernier message: 09/03/2006, 18h17

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