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] CSplitterWnd et SetFocus


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut [MFC] CSplitterWnd et SetFocus
    Bonjour,

    je bosse en ce moment sur une application SDI splittée en 2 vues

    voir :

    http://schafik.free.fr/img/shot.jpg

    La vue de gauche est une TreeView qui permet de choisir differentes options

    La vue de droite est une vue openGL

    J' ai besoin d' avoir acces au clavier et a la souris dans ma vue openGL , car les fleches du curseur et la souris permettent de deplacer les modeles 3d .

    J' ai donc des fonctions Onchar et OnMouseMove dans la classe de ma vue openGL

    pour la souris , aucun probleme des que la souris est sur la vue openGL , la modele tourne en reponse aux mouvements de souris

    Pour le clavier , pas moyen , on dirait que la fenetre n' a pas le focus et les touches sont ignorées ( OnChar pas appelée )

    J' ai donc bidoulé un SetFocus() dans la fonction OnLButtonDown de ma vue openGL ,

    Ca marche ( vu que j' ai le controle sur la souris sans probleme )mais ca me cré un autre probleme : quand j' essaye de redimensonner le splitter parfois ca plante ( exception sur l' adresse 0x00000001)


    Je pense que tous ca vient d' un probleme de Splitter et de Focus , comment faire pour avoir un systeme propre qui dispatche le focus entre les splitters ? :

  2. #2
    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
    Par défaut
    salut,
    j'utilise aussi des splitters , j'ai pas de pb ,
    pour ton pb sur l'erreur remonte quand la pile d'execution en debug (si c'est possible) .
    ça resemble bien à un pointeur pourri quand meme.

  3. #3
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut
    effectivement je pense aussi que c est a cause d ' un pointeur pourri


    mais lequel ??

    dans ma CMainFrame j' ai bien des pointeurs valide sur ma View openGL et ma tree view

    et c sur que le bug est lié au SetFocus() car sans lui tout va bien (mais je ne peux plus deplacer mes meshes au clavier ...)

    De plus ca ne se produit que dans un cas précis : uniquement au lancement du prog quand on clique une fois sur la fenetre openGL ( un appel a SetFocus ) et qu' on essaye de redimensionner le splitter

    Jamais dans les autres cas ..

  4. #4
    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
    Par défaut
    attention a l'init du programme et que le pointeur evenutellement stocke le soit au bon moment a cause de la mise en place du splitter.

  5. #5
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut
    justement dans le constructeur de main frame je les initialise a nul et on moment de splitter je les recupere :


    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
     
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
     
     BOOL bCreateSpltr = m_wndSplitter.CreateStatic( this, 1, 2);
     
     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTreeMenu), CSize(50,0),
          pContext);
     
     m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CChildView), CSize(0,0),
          pContext);
     
     m_pwndView  = (CChildView*)m_wndSplitter.GetPane(0,1);
     m_pTreeMenu = (CTreeMenu*)m_wndSplitter.GetPane(0,0);
     
     
     m_initSplitter = bCreateSpltr;
     
     return (bCreateSpltr);
     
    }

    est ce correct ?

  6. #6
    Membre éclairé Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Par défaut
    bon ,

    j arrive a contourner le bug en rajoutant :

    m_wndSplitter.SetActivePane(0,0,m_pTreeMenu);

    dans le code de BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)


    ??

    je comprends pas trop pourquoi ca change qq chose mais il semble que ca fonctionne

  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
    Par défaut
    j'ai regarde ce que je fais sur mes splitters ,
    je procede de la meme maniere que toi pour recuperer les pointeurs sur view.
    petit point de detail moi j'utilise:
    CFrameWnd::SetActiveView
    This method is automatically called by the framework to set the active view as the user changes the focus to a view within the frame window. You can explicitly call SetActiveView to change the focus to the specified view.

    void SetActiveView(
    CView* pViewNew,
    BOOL bNotify = TRUE);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            CView1 *pView1=(CView1 *)m_wndSplitter.GetPane(0,0);
    	CView2 *pView2=(CView2 *)m_wndSplitter.GetPane(1,0);
     
    	// activate the input view
    	SetActiveView(pView1);

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

Discussions similaires

  1. [MFC] - CSplitterWnd dynamique et split
    Par ivles dans le forum MFC
    Réponses: 1
    Dernier message: 28/10/2007, 10h54
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

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