Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 2


|
Conversation (Résolue) : Probleme défilement wxScrolledWindow |
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 61
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
J'ai un problème d'affichage et de défilement dans une wxScrolledWindow.
Voici les évènements liés à ma wxScrolledWindow
Code: BEGIN_EVENT_TABLE(winComposition, wxMDIChildFrame) EVT_PAINT(winChild::OnPaint) Voici la déclaration et la construction de ma wxScrolledWindow
Code: winChild::winChild(wxMDIParentFrame *parent, const wxString& title) : wxMDIChildFrame(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) { AffichageSW = new wxScrolledWindow ( m_panel45, WINDOWS_COMPOSITION_SCROLLBAR, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); AffichageSW ->SetScrollRate( 1, 1 ); AffichageSW ->SetVirtualSize(5000, 1000 ); AffichageSW ->SetMinSize( wxSize( 300,-1 ) ); AffichageSW ->SetBackgroundColour( wxColour( 255, 255, 255 ) ); } Voici la méthode onPaint
Code: void winChild::OnPaint(wxPaintEvent &event) { wxPaintDC pDC(this); int i; wxClientDC ScrolledWindowDC(AffichageSW); ScrolledWindowDC.SetPen (*wxGREY_PEN); for (i=0;i<10;i+=1) ScrolledWindowDC.DrawLine(1, i*zoom, 5000, i*zoom); } Donc maintenant mes 2 problèmes :
1er Problème : A l'exécution, au départ tout se passe bien, tout est bien dessiné. Lorsque j'utilise les scrolbar, les droites defilent bien. Si je "reviens sur mes pas" le dessin disparait. Si je resize la fenetre, alors tout réapparait... ainsi que le 2 eme problème.
2eme Problème : Si je déplace les scrollbar, l'origine du dessin n'est plus l'origine de la fenêtre avec les scrollbars à 0. L'origine du dessin s'est déplacé avec les scrollbars.
Si quelqu'un peut m'aider, merci d'avance
Yann
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
Tu devrais regarder les sources de l'exemple mdi fourni avec les sources, car il fait exactement ce que tu veux.
En voici un petit résumé :
Il y a d'abord la fenêtre principale, qui hérite de wxMDIParentFrame. Pour cette classe, pas d'utilisation de l'événement "OnPaint".
Ensuite, il y a une (plusieurs) fenêtre fille héritant de wxMDIChildFrame. De même que pour la classe précédente, pas d'utilisation de l'événement "OnPaint".
Enfin, dans la classe "fille", une wxScrolledWindow. Et c'est seulement là que la méthode "OnDraw" est utilisée pour dessiner (il n'est même pas nécessaire de mettre quoi que ce soit dans la table d'événements. Tu peux utiliser directement le wxDC passé en paramètres de cette méthode, et ton dessin sera nickel.
Je vais essayer de trouver le temps de pondre un code "minimal" pour ce genre d'application (en clair, je vais simplifier l'exemple au maximum).
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Bon, alors ça y est. Voici le code simplifié de l'exemple "mdi" fourni avec les libs (j'ai laissé comme dans l'exemple : les 3 classes principales se trouvent dans le même fichier)
La déclaration des classes
Code wxWidgets:// La classe servant de support au dessin class MyCanvas : public wxScrolledWindow { public: MyCanvas(wxWindow *parent); virtual void OnDraw(wxDC& dc); }; // La classe "fille MDI" class MyChild: public wxMDIChildFrame { public: MyChild(wxMDIParentFrame *parent, const wxString& title); private: MyCanvas *m_canvas; }; // La fenêtre principale class MyFrame : public wxMDIParentFrame { public: MyFrame(wxWindow *parent, const wxString& title); private: void OnNewChildWindow(wxCommandEvent& event); DECLARE_EVENT_TABLE() };
Et leur implémentation
Code wxWidgets:MyCanvas::MyCanvas(wxWindow *parent) : wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE | wxVSCROLL | wxHSCROLL) { // Le fond du dessin sera blanc SetBackgroundColour(wxColour(_T("WHITE"))); // Et la taille virtuelle sera de 500x500 SetScrollbars(10, 10, 50, 50); } // La méthode de dessin, directement tirée de l'exemple wxWidgets void MyCanvas::OnDraw(wxDC& dc) { dc.SetFont(*wxSWISS_FONT); dc.SetPen(*wxGREEN_PEN); dc.DrawLine(0, 0, 200, 200); dc.DrawLine(200, 0, 0, 200); dc.SetBrush(*wxCYAN_BRUSH); dc.SetPen(*wxRED_PEN); dc.DrawRectangle(100, 100, 100, 50); dc.DrawRoundedRectangle(150, 150, 100, 50, 20); dc.DrawEllipse(250, 250, 100, 50); #if wxUSE_SPLINES dc.DrawSpline(50, 200, 50, 100, 200, 10); #endif // wxUSE_SPLINES dc.DrawLine(50, 230, 200, 230); dc.DrawText(_T("This is a test string"), 50, 230); wxPoint points[3]; points[0].x = 200; points[0].y = 300; points[1].x = 100; points[1].y = 400; points[2].x = 300; points[2].y = 400; dc.DrawPolygon(3, points); } MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title) : wxMDIChildFrame(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) { m_canvas = new MyCanvas(this); } BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame) EVT_MENU(wxID_NEW, MyFrame::OnNewChildWindow) END_EVENT_TABLE() MyFrame::MyFrame(wxWindow *parent, const wxString& title) : wxMDIParentFrame(parent, -1, title) { SetClientSize(500,400); wxMenu *file_menu = new wxMenu(); file_menu->Append(wxID_NEW, _T("&New child\tCtrl-N")); wxMenuBar *menu_bar = new wxMenuBar(); menu_bar->Append(file_menu, _T("&File")); SetMenuBar(menu_bar); } void MyFrame::OnNewChildWindow(wxCommandEvent& event) { MyChild *subframe; subframe = new MyChild(this, _T("Canvas Frame")); }
Voilà, c'est tout.
Je n'ai pas mis beaucoup de commentaires, alors, si tu as besoin, n'hésites pas...
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 61
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
Je te remercie pour ton aide.... ! Ca fonctionne.
Merci Yann
|
|
|