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..
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..
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 :'(
bon, je sait bien qu'il faut tracer dans un DC :
d'ailleur, j'ai mon DC de pret, il peut prendre plusieures resolutions (la plus courante etant 1024*768)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.
mais, je ne sait pas comment créer de conteneur pour afficher ce DC de facon scrollable...
bon, j'ai reussi a créer une zone scrollable :
il me manquait le enablescrolling :'(
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);
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...
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 :
si j'enleve :
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);
=>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 :'(
Code : Sélectionner tout - Visualiser dans une fenêtre à part WxScrolledWindow1->SetScrollbars(8, 8, 128, 96, true);
:'(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.
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...
je n'arrive pas trouver comment faire :'(
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 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 :
Les fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 EVT_PAINT(fenetre::OnPaint) EVT_ERASE_BACKGROUND(fenetre::OnErase)
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).
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(); } }
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!!!
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) { ... }je ne sait âs trop quoi faire...invalid static_cast from type `void (vncPeuThreadeFrm::*)()' to type `void (wxEvtHandler::*)(wxScrollWinEvent&)'
ma zone scrollable est du type :
WxScrolledWindow
si quelqu'un pouvait me dirte ce que signifie un "static_cast from"... dsl
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 ...
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.
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 :
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...?
Code : Sélectionner tout - Visualiser dans une fenêtre à part void HandleOnScroll(wxScrollWinEvent& event);
?
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)mais ma focntion onscroll n'est jamais appelée.
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(); }
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
merci enormement a toi, je me jette dessus!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager