wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

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

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Probleme défilement wxScrolledWindow
Conversation (Résolue) : Probleme défilement wxScrolledWindow
30-06-2010 11:09:53  Probleme défilement wxScrolledWindow #1
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
30-06-2010 22:07:59  Re: Probleme défilement wxScrolledWindow #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
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à...
30-06-2010 23:01:45  Re: Probleme défilement wxScrolledWindow #3
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
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à...
01-07-2010 07:57:19  Re: Probleme défilement wxScrolledWindow #4
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
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Probleme défilement wxScrolledWindow