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

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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 à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    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
    Points : 17 323
    Points
    17 323
    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 éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    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 360
    Points : 20 376
    Points
    20 376
    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 à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    j ai un autre probleme pour un test:

    j'essaye de voir si mon acquisition fonctionne correctement en sauvegardant le bitmap sur disque dur.
    Je passe par hbitmap et Cimage, je tape le code a la fin de mon acquisition



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HBITMAP temp_bmp = (HBITMAP)::CreateBitmap(352,288,1,24,tab);
    //temp_bmp=CreateBitmap(352,288,1,24,tab);
    CImage image;
    image.Attach(temp_bmp);
    //image.Save(_T("C:\\kitoutataila.bmp"));
    image.Save(_T("C:\\test.bmp"), Gdiplus::ImageFormatBMP);
    image.Detach();
    DeleteObject(temp_bmp);

    malheureusement cela ne marche pas non plus, en debug temp_bmp prend une adress mais c'est ecrit {unused=???} a cote

    vive MFC......

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Un HBITMAP n'est pas un vrai pointeur, il peut valoir n'importe quoi sauf NULL.

    Mais il est déclaré en tant que pointeur de structure pour éviter les affectations qui n'ont pas de sens (du genre, copier directement un HBITMAP dans un HPEN).
    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.

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci pour ces precisions

    Mais je ne sais toujours pas comment resoudre ce probleme.
    CreateBitmap est la seule fonction que j ai trouver pour entrer mon tableau de donnee. Et cette fonction me retourne un HBITMAP.

    J'aurai bien utiliser CBitmap mais je n'ai pas trouver de fonction pour sauver sur le disque dur.

    Vous auriez aussi une solution pour mon avant-avant-dernier post?

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    personne ???

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ben désolé, je ne sais me débrouiller avec les bitmaps qu'en mémoire.
    Dès qu'il est question de CImage ou de sauvegarde, je m'y perds.
    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.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci comme meme

  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
    salut,
    tu peux attacher un bitmap a un objet CImage par la méthode Attach.
    et avec la méthode save tu peux sauvegarder le bitmap.
    HRESULT CImage::Save( LPCTSTR pszFileName, REFGUID guidFileType= GUID_NULL ) const
    avec :
    guidFileType The file type to save the image as. Can be one of the following:
    • ImageFormatBMP An uncompressed bitmap image.
    • ImageFormatPNG A Portable Network Graphic (PNG) compressed image.
    • ImageFormatJPEG A JPEG compressed image.
    • ImageFormatGIF A GIF compressed image.

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