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


|
Menu Snippets (navigation): |
Détails du snippet : wxAutoGridCtrl : Nombre automatique de colonnes d'un wxGridSizer |
Informations sur l'auteur de ce snippet : | |

Hors ligne
| Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
|
Introduction / Description : | |
Ce contrôle a été créé afin de résoudre le problème suivant : Il fallait afficher un grand nombre d'images (une 30 aine) sur plusieurs colonnes. Le nombre de colonnes devait être ajusté en fonction de la taille des images, et de la largeur de la fenêtre. Il fallait également que ce nombre de colonnes évolue lorsque l'on redimensionne la fenêtre (une fenêtre devenant plus large permettant d'afficher plus de colonnes). De plus, il fallait pouvoir accéder aux images "cachées", c'est à dire se trouvant plus bas que le bord inférieur de la fenêtre. Il m'a donc fallu marier une wxScrolledWindow avec un wxGridSizer pour pouvoir répondre à toutes ces spécificités.
Fichier " wxAutoGridCtrl.h"
Code wxWidgets:#ifndef WXAUTOGRIDCTRL_H_INCLUDED #define WXAUTOGRIDCTRL_H_INCLUDED #include <wx/scrolwin.h> class wxAutoGridCtrl : public wxScrolledWindow { public: wxAutoGridCtrl(wxWindow *parent,wxWindowID id=wxID_ANY); virtual ~wxAutoGridCtrl(); private: wxGridSizer *m_gridszr; void OnSize(wxSizeEvent &event); DECLARE_EVENT_TABLE(); }; #endif // WXAUTOGRIDCTRL_H_INCLUDED Fichier " wxAutoGridCtrl.cpp"
Code wxWidgets:#include "wxAutoGridCtrl.h" BEGIN_EVENT_TABLE(wxAutoGridCtrl,wxScrolledWindow) END_EVENT_TABLE(); wxAutoGridCtrl::wxAutoGridCtrl(wxWindow *parent,wxWindowID id) : wxScrolledWindow(parent,id,wxDefaultPosition,wxDefaultSize) { wxBoxSizer *basesizer=new wxBoxSizer(wxVERTICAL); m_gridszr=new wxGridSizer(3); basesizer->Add(m_gridszr,0,wxALL,0); SetSizer(basesizer); //SetSizer(m_gridszr); // On connecte la méthode "OnSize" à l'événement concerné Connect(this->GetId(),wxEVT_SIZE,(wxObjectEventFunction)&wxAutoGridCtrl::OnSize); // On charge les images et on les affiche avec les wxStaticBitmap wxBitmap imageBMP; wxString image_name; for (int i=1;i<13;i++) { image_name.Printf(_T("./images/img (%d).png"),i); imageBMP.LoadFile(image_name,wxBITMAP_TYPE_ANY); m_gridszr->Add(new wxStaticBitmap(this,-1,imageBMP),0,wxALL,5); } SetScrollRate(0,5); // pour n'avoir qu'une scrollbar verticale } wxAutoGridCtrl::~wxAutoGridCtrl() { //dtor } void wxAutoGridCtrl::OnSize(wxSizeEvent &event) { if (m_gridszr==NULL) return; // Ça évite de planter au démarrage // On récupère l'adresse du premier wxStaticBitmap wxSizerItem *item=m_gridszr->GetItem((size_t)0); wxStaticBitmap *stbmp=(wxStaticBitmap*)item->GetWindow(); if (stbmp==NULL) return; // On ne sait jamais // On récupère la taille du wxStaticBitmap wxSize stbmpsize=stbmp->GetSize(); // On récupère la taille de la zone visible de la wxScrolledWindow wxSize vsize=GetClientSize(); int NbCols=vsize.GetWidth()/(stbmpsize.GetWidth()+5); if (NbCols==0) NbCols=1; // il faut au moins une colonne // On met à jour le sizer si nécessaire if (NbCols!=m_gridszr->GetCols()) m_gridszr->SetCols(NbCols); // On laisse se propager l'événement "OnSize" event.Skip(); }
Voilà . Le code est (normalement) suffisament commenté. Les images de cet exemple se trouvent dans un sous répertoire de l'application nommé "images" (original, non ?) et sont affichées grâce à un wxStaticBitmap.
Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation): |
|