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 :

appel vers une variable global


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut appel vers une variable global
    Bonjour

    Je travail sur une applic MFC CFormView sur VC++ 2005

    j ai une fonciton qui realise une acquisition video d'ou j extrai un bitmap.
    je souhaite par la suite afficher ce bitmap via un fonction OnDraw(cdc* pDC)

    En me basant sur un projet VC.6 j ai effectue ceux ci.

    j ai cree un HBITMAP bit dans la class CProjectApp du fichier Project.h

    ensuite je cree g_pApp dans Project.cpp

    extern CProjectApp* g_pApp = NULL;

    ainsi que dans ProjectView.cpp

    extern CProjectApp* g_pApp;

    par la suite :

    BOOL CProjectApp::InitInstance()
    {
    g_pApp = this;

    CProjectView dg;
    m_pMainWnd = &dg;

    //blabla d origine
    }


    Cela me permet (en theorie) d appeller ma variable bit de partout avec la syntaxe suivante
    ((CProjectApp*)g_pApp->m_pMainWnd)->bit

    Le soucis est quand j ecris CProjectView dg;

    j obtiens

    Error 1 error C2248: 'CProjectView::CProjectView' : cannot access protected member declared in class 'CProjectView'

    Pourtant je vois pas ce que je pourrai modifier ou rajouter

    Si j enleve les lignes
    CProjectView dg;
    m_pMainWnd = &dg;
    le prog compile et run mais en debug je remarque il ne recupere pas de donne pour bit. donc bien sur tjrs pas d affichage.

    SVP
    Est ce que quelqun a des explications et surtout des solutions?
    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Déjà, la syntaxe que tu donnes est incorrecte.

    Ensuite, tu n'as pas besoin de variable globale pour ça:
    • Déjà, il y en a déjà une, appelée theApp
    • Ensuite, il y a la fonction AfxGetApp() (mais il faut utiliser un static_cast<> pour convertir en ton type)


    Troisièmement, Je croyais que le bitmap en question était censé être dans le document...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Re Médinoc

    En faite je créé mon bitmap dans une fonction d'acquisition. Et je veux l'afficher sur ma CFormView. C'est tout . Ça parait simple. Mais je n'y arrive pas

    Si je t'ai parlé de document dans un ancien post c'est parce que VC en génère un et j ai penser l utiliser. Mais d'après ce que j ai cru comprendre les documents c'est pour gérer les données entre plusieurs views. moi j suis en SDI
    Revenons à mon probléme :
    J'ai pensé créer un bitmap en variable global comme ça il pourra être utiliser par la fonction d acquisition pour la création et par la fonction Ondraw pour l'affichage.

    Sur tes conseils j'ai regardé la doc CWinApp en ligne sur votre site, mais ce n'est pas très clair pour mon petit cerveau.

    http://cpp.developpez.com/faq/vc/?page=CWinApp#GetApp

    j'ai écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CMyApp *pApp=static_cast<CMyApp *>(AfxGetApp());
    pApp->m_Global.MyFunction();     //exemple de fonction globale 
    CListCtrm &rList=pApp->m_Global.GetLisCtrl(); // variable globale.
    J'imagine que ça s'écrit dans CMyApp::initInstance()

    Comment j'adapte ce code pour un HBITMAP bit.
    Ensuite la syntaxe pour accéder a mon bitmap a partir de mes 2 fonctions.

    A chaque fois que je fais une recherche la dessus je tombe que sur des bouts de code ou on ne sait pas d'ou tombe la moitié des éléments.
    Quelqu'un aurait un source codé sur VC++2005 utilisant des variables globales et des AfxGetApp()

    merci d'avance
    Merci de pensez à la balise code, et de faire un effort sur l'écriture, Farscape.

  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
    salut,
    je ne vois pas ou est le probléme si tu fait du C++ tu devrais comprendre ce qui est écrit.
    AfxGetApp() renvoie un pointeur sur la classe de base d'application CWinApp.
    ta classe d'application hérite de CWinApp.
    en castant le retour de cette fonction sur ta classe d'application tu accèdes aux méthodes et aux données de ta classe.
    tu peux tout aussi bien déclarer dans ton source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    extern CMyClassApp theApp;
    //.................
    theApp.MyFunction();
    car theApp est une variable globale représentant l'unique instance de la classe d'application ( CMyClassApp représente ta classe d'application).

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    En C++ il y a une règle vraiment basique , il faut éviter les variables globales tout comme en POO
    Tu n'as pas besoin d'en créer, la classe CDocument doit contenir cela.
    Et je ne pige pas quel est ton problème;
    peut-tu détailler pas à pas ?
    Si tu as un HBITMAP il faut appeler CreateCompatibleDC ,SelectObject et BitBlt/StretchBlt pour l'afficher dans OnDraw

  6. #6
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Coucou

    dsl pour les accent je suis en qwerty

    Merci de vous interessez avec mes problemes d'MFC
    Enfaite je fais differament maintenant, mais j'ai toujours ce probleme d affichage.
    je cree un pointeur sur ma view

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     CProjectView* CProjectView::this_view = NULL;
    je cree egalement une methode qui retourne this_view
    et CBitmap* next_bitmap; dans la classe CProjectView
    dans le constructeur je cree mon bitmap vide + this_view=this

    dans ma fonction aquisition j ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    view->next_bitmap = new CBitmap();
    view->next_bitmap->CreateBitmap(352,288,1,24,tab);
    view->Invalidate();

    Pour ma fonction affichage:
    le "if" teste mon bitmap issu de l'acquisition video
    le "else" affiche un bitmap du disque dur quand il n y a pas de video en entree
    le else affiche bien le bitmap, le if non alors qu'ils suivent la meme demarche d affichage.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void CProjectView::OnDraw(CDC* pDC)
    {
     
    CProjectDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CProjectView* view = CProjectView::GetMeViewPlease();
     
    if(.......)
    {
     
         CDC MemDC;
         BITMAP InfoBitmap;
     
         MemDC.CreateCompatibleDC((pDC));
         view->next_bitmap->GetBitmap(&InfoBitmap);
         MemDC.SelectObject(&view->next_bitmap);
         pDC->StretchBlt(0,0,352,288,&MemDC,0,0,InfoBitmap.bmWidth,InfoBitmap.bmHeight,SRCCOPY);
     
    }
     
    else
    {
         CBitmap Bitm;
         CDC MemDC;
     
         Bitm.LoadBitmap(IDB_BITMAP1);
         BITMAP InfoBitmap2;
     
         MemDC.CreateCompatibleDC((pDC));
         Bitm.GetBitmap(&InfoBitmap2);
         MemDC.SelectObject(&Bitm);
         pDC->StretchBlt(0,0,352,288,&MemDC,0,0,InfoBitmap2.bmWidth,InfoBitmap2.bmHeight,SRCCOPY);
    }
     
    }


    En mode Debug tout a l'air de bien se passer au niveau des variables: elles recuperent toutes des valeurs et ont des adresses...
    C'est pareil avec BitBlt, je vois pas trop ou chercher?
    il doit me manquer quelquechoses dans mes view->next_bitmap mais je sais pas quoi.

Discussions similaires

  1. [PHP 5.0] appel d'une variable global dans un autre fichier à partir d'une classe
    Par andry.aime dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2009, 09h31
  2. Appeler une variable globale dans la fonction eval
    Par Romanops dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2007, 04h24
  3. Lien vers une variable ?
    Par drinkmilk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/02/2005, 09h55
  4. appel d une variable ds un sub
    Par NeHuS dans le forum ASP
    Réponses: 7
    Dernier message: 05/01/2005, 15h38
  5. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11

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