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

wxWidgets Discussion :

créer une zone pour afficher une BMP scrollable


Sujet :

wxWidgets

  1. #1
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut créer une zone pour afficher une BMP scrollable
    bonjours, je voudrait afficher une bitmap dans une fenetre, amis elle est trop grande pour y tenire, je voudrait donc afficher une "zone bitmap" scrollable...

    j'ai essayé avec "WxStaticBitmap", mais ca ne m'a pas l'aire d'etre la solution..

  2. #2
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    j'ai trouvé : wxScrolledWindow, je vait essayer de faire avec, mais je ne sait pas comment ca fonctionne... j'ai deja lut la doc, je vait la re-lire :'(

  3. #3
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    bon, je sait bien qu'il faut tracer dans un DC :
    All drawing in wxWidgets is done on a device context, using an instance of a class derived from wxDC. There is no such thing as drawing directly to a window; instead, you create a device context for the window and then draw on the device context. There are also device context classes that work with bitmaps and printers, or you can design your own. A happy consequence of this abstraction is that you can define drawing code that will work on a number of different device contexts: just parameterize it with wxDC, and if necessary, take into account the device's resolution by scaling appropriately. Let's describe the major properties of a device context.
    d'ailleur, j'ai mon DC de pret, il peut prendre plusieures resolutions (la plus courante etant 1024*768)
    mais, je ne sait pas comment créer de conteneur pour afficher ce DC de facon scrollable...

  4. #4
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    bon, j'ai reussi a créer une zone scrollable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    						memoryDC.SelectObject(Bmp);
    					 	WxScrolledWindow1->DoPrepareDC(memoryDC);
    					 	WxScrolledWindow1->SetScrollbars(1, 1, 1024, 768);
    					 	WxScrolledWindow1->EnableScrolling(true,true);
    il me manquait le enablescrolling :'(

    reste a mettre la bmp a afficher dedans...

    pourtant, l'objet Bmp, qui est un wxBitmap, contient deja l'image, mais elle n'est pas affichée...

  5. #5
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    rah! en fait mon image s'affiche 1/1000 de seconde puis disparait, je corrige ca, et je met la source

    edit : voila mon pb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    					 	WxScrolledWindow1->SetScrollbars(8, 8, 128, 96, true);//8*128 = 1024, 8*96 = 768
    						wxClientDC MyDC(WxScrolledWindow1)	; 
    						MyDC.BeginDrawing();	 
    						MyDC.DrawBitmap(Bmp, wxCoord(0), wxCoord(0), false);
    si j'enleve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WxScrolledWindow1->SetScrollbars(8, 8, 128, 96, true);
    =>mon bitmap est affiché, mais il n'y a pas de scrollbar, si je le laisse, j'ai les scrollbar, mais, la bitmap ne reste pas affichée :'(
    wxScrolledWindow::SetScrollbars
    void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, int noUnitsY, int xPos = 0, int yPos = 0, bool noRefresh = FALSE)

    Sets up vertical and/or horizontal scrollbars.
    :'(

  6. #6
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    je pensait que cela venait du fait que ma variable DC etait interne a ma fonction, je l'ai donc mis en variable membre de mon objet, mais le pb subsiste...

    si je fait un system pause, juste apres mon affichage, la bitmap reste affichée jusqu'a ce que je sorte de ma pause...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    wxBitmap Bmp;
    Bmp.LoadFile(fichier, wxBITMAP_TYPE_BMP );
     
     //on affiche la bmp dnas un champ :
    WxScrolledWindow1->EnableScrolling(true,true);
    WxScrolledWindow1->SetScrollbars(8, 8, 128, 96, false);//8*128 = 1024, 8*96 = 768
    //MyDC est un pointeur vers wxClientDC
    MyDC = new wxClientDC(WxScrolledWindow1); 
    MyDC->DrawBitmap(Bmp, wxCoord(0), wxCoord(0), false);
    system("PAUSE");
    //LA LA BMP DISPARAIT
    je n'arrive pas trouver comment faire :'(

  7. #7
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je suis en train d'expérimenter moi aussi les images avec wxWidgets, c'est un peu la galère, mais après quelques recherches, j'ai résolu ton problème :

    tu dois avoir deux évenements : un qui affiche sur la fenetre et un qui efface ta fentre (et donc fixe le fond).

    En fait pour l'instant j'affiche mon image dans mon wxScrollWindow via l'evenement d'affichage, et dans l'evenement ou tu effaces je n'ai rien mis, voici un bout de code de ce que ça donne :

    Les evenements de la boucle evenementielle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EVT_PAINT(fenetre::OnPaint)
    EVT_ERASE_BACKGROUND(fenetre::OnErase)
    Les fonctions :

    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
     
    void fenetre::OnErase( wxEraseEvent & event )
    {
      ;
    }
     
    void fenetre::OnPaint( wxPaintEvent & event )
    {
      wxBufferedPaintDC dc(aireScroll);
      aireScroll->DoPrepareDC(dc);
     
      if( element_actif == IMAGE )
        {
          aireScroll->SetScrollbars(1,1,imageActive->GetWidth(),imageActive->GetHeight());
          aireScroll->EnableScrolling(true,true);
          dc.BeginDrawing();
          dc.DrawBitmap( (*bit) , 0, 0, false );
          dc.EndDrawing();
        }
    }
    en fait je charge une image via un conteneur wxImage( c'est mon imageactive) , ce conteneur est converti en bitmap via wxBitmap (c'est ma variable bit).

  8. #8
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    merci, je vait essayer

  9. #9
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Merci beaucoup! ca marche nickel, a une exception, pres :

    lorsque je fait defiler mon image, elle ne se mat pas a jours toute seule, mais ca doit venir du fait que je doit rapperler la fonction de dessin a chaque defilment,je vait donc voir de ce coté, merci enormement de ton aide!!!

  10. #10
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    donc, j'ai l'erreure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	EVT_SCROLLWIN(vncPeuThreadeFrm::OnScroll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void vncPeuThreadeFrm::OnScroll(wxScrollWinEvent & event)
    {
    ...
    }
    invalid static_cast from type `void (vncPeuThreadeFrm::*)()' to type `void (wxEvtHandler::*)(wxScrollWinEvent&)'
    je ne sait âs trop quoi faire...

    ma zone scrollable est du type :
    WxScrolledWindow


    si quelqu'un pouvait me dirte ce que signifie un "static_cast from"... dsl

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Bizarre ton erreur ... T'aurai bien mis la fonction dans ta classe ? (avec les bons paramètres. Parce que visiblement ton compilo ne voit pas le paramètre ...

  12. #12
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    vi, dsl, j'ai corrigé cette erreure...

    j'en suis a ce pb :

    mon image s'affiche, elle ne disparait pas.

    par contre, quand je la fiat scroller, les parties non affichées avant le scroll ne sont pas mises a jours, pour celan, je doit afficher une autre fenetre par dessus, et la, tout est repaind, je suis en trian de cherche rla fonction servant donc au reaffichage de toute l'ui, ou juste de la partie concernée.

  13. #13
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    en fait, je n'arrive pas a trouver l'event handler correspondant a "WxScrolledWindow"

    sauriez vous lequel est-ce, ou comment créer le sien?

    tout ce que j'ai besoin ensuite, je pesne, c'est retracer lors de l'utilisation del'ascenseur...

    edit :

    dans le code du fichier .h, j'ai trouvé la fonction meembre publique suivante, non incluse dans la doc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void HandleOnScroll(wxScrollWinEvent& event);
    je ne suis vraiment pas familier de c++ et de wx, odnc, je ne sait pas comment l'utiliser... je doit heriter de la classe afin de la ré-écrire, je doit l'appeler qu'elque part, je doit...?

    ?

  14. #14
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    pour le moment, j'en suis a ca (je n'ai pas reussi a appliquer la solution citée plus haut)
    (dsl du nombre de commentaire, c'est des tests non concluants :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        WxScrolledWindow1 = new wxScrolledWindow(this, ID_WXSCROLLEDWINDOW1, wxPoint(4,39), wxSize(560,220), wxVSCROLL | wxHSCROLL | wxWS_EX_PROCESS_UI_UPDATES );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	//pour la zone affichant la bmp
    	EVT_PAINT(                 vncPeuThreadeFrm::OnAfficheBmp) //kan la bmp d'affiche
    	EVT_SCROLLBAR(SCROLL_ID,   vncPeuThreadeFrm::OnScroll)
    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
    void vncPeuThreadeFrm::OnAfficheBmp(wxPaintEvent & event )
    {
       wxPaintDC dc(this); //si on ne crée pas de wxPaintDC, la fenetre se bloque (cf la doc)
     
       if (BmpRecue)
       {        
            //wxBufferedPaintDC MyDC(WxScrolledWindow1); 
     
            //on affiche la bmp dnas un champ :     							 							 	
        	wxBufferedPaintDC DC(WxScrolledWindow1, Bmp); 
        	WxScrolledWindow1->PrepareDC(DC);
        	DC.BeginDrawing();
     
        	//DC.DrawBitmap(Bmp, wxCoord(0), wxCoord(0), false);
        	DC.EndDrawing();
        	//MyDC = DC;
       }
    }
     
     
     
    /*
     * kan on bouge la zone scrollable
     */
    void vncPeuThreadeFrm::OnScroll(wxCommandEvent & event)
    {
            //on affiche la bmp dnas un champ :     							 							 	
        	wxBufferedPaintDC MyDC(WxScrolledWindow1); 
        	WxScrolledWindow1->PrepareDC(MyDC);
        	MyDC.BeginDrawing();
        	MyDC.DrawBitmap(Bmp, wxCoord(0), wxCoord(0), false);
        	MyDC.EndDrawing();
    //    	this.UpdateWindowUI();
    }
    mais ma focntion onscroll n'est jamais appelée.

  15. #15
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Salut,

    Juste pour te signaler que le livre "Cross platform GUI programming with WxWidgets" est deshormais disponible gratuitement en ligne.

    J'ai parcouru le début, ça a l'air bon, je pense que tu pourras peut être comprendre ton problème.

    http://www.wxwidgets.org/book/index.htm

  16. #16
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    merci enormement a toi, je me jette dessus!

Discussions similaires

  1. Rédiger une macro pour sélectionner une zone d'impresion
    Par lenul78570 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/02/2009, 21h27
  2. Afficher une zone/forme selon une valeur sélectionnée
    Par ttttnht dans le forum Windows Forms
    Réponses: 11
    Dernier message: 24/12/2008, 15h54
  3. PHP/FLASH récupérer une variable pour afficher une image dans un clip
    Par Touillette85 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 17/12/2008, 10h02
  4. Réponses: 15
    Dernier message: 01/07/2008, 15h12
  5. Affiché une box pour poser une question
    Par satanas dans le forum Forms
    Réponses: 1
    Dernier message: 16/05/2008, 11h52

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