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 : 4

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» wxAutoGridCtrl : Nombre automatique de colonnes d'un wxGridSizer
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 30aine) 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.
Contenu du snippet :
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();
}
Explications finales :
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.
Commentaires

Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» wxAutoGridCtrl : Nombre automatique de colonnes d'un wxGridSizer