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

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Bitmap comboControl avec popupAnimation et bitmaps.
Conversation : Bitmap comboControl avec popupAnimation et bitmaps.
30-01-2009 12:11:15  Bitmap comboControl avec popupAnimation et bitmaps. #1
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour!
J'essaie de faire un contrôle sous la forme d'un bitmapButton qui présente une liste déroulante quand il est cliqué.
ça marche bien si je mets des wxString dans la liste (cf. ce topic ou je parle tout seul). ça marche bien en s'aidant de l'exemple Combo.

Fichier wxComboCtrlWithCustomPopupAnim.cpp pour ceux que ça intéresse :

Code wxWidgets:

 
//    ------------------------------------------------------------------------------    //
//                                with "only" Array of STRINGS                        //
//    ------------------------------------------------------------------------------    //
wxComboCtrlWithCustomPopupAnim::wxComboCtrlWithCustomPopupAnim(wxWindow* parent, int id, const wxString& base_img_name, wxArrayString *choices)
: wxComboCtrl(parent, id, "", wxDefaultPosition, wxDefaultSize, wxNO_BORDER, wxDefaultValidator, "")
{
    ////    Maybe unnecessary but doesn't hurt...
    UseAltPopupWindow(true);
    // Make sure GetFeatures is implemented
    wxComboCtrl::GetFeatures();
 
    ////    LIST VIEW COMBO POPUP Managing :
        m_list = new ListViewComboPopup();        // creation
        // Assignment    Must be one of the 1st things to do... otherwise --> ASSERT errors on 'm_count'
        SetPopupControl(m_list);
        // Filling using the passed argument 'choices[]'
        for (unsigned int i = 0; i < choices->GetCount(); i++)
        {
            if ( choices->Item(i) != wxT("----------------------------------------------------------------------------") )
                m_list->AddSelection(wxT(choices->Item(i)));
            else
            {
                m_list->AddSelection(wxT(choices->Item(i)));
                m_list->SetItemTextColour(i, wxColour(170, 170, 170));                   
            }
        };
        // Font
        the_font = new wxFont(14, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_LIGHT, false, "", wxFONTENCODING_SYSTEM);
        m_list->SetFont(*the_font);
        // Background
        m_list->SetBackgroundColour(wxColour(217, 223, 235));
 
SetCustomPaintWidth(500);
 
    ////    BITMAP :
        // Creation using the argument 'base_img_name'
        wxBitmap *bmp1 = new wxBitmap(base_img_name + wxT("norm.bmp"), wxBITMAP_TYPE_BMP);
        wxBitmap *bmp2 = new wxBitmap(base_img_name + wxT("clicked.bmp"), wxBITMAP_TYPE_BMP);
        wxBitmap *bmp3 = new wxBitmap(base_img_name + wxT("on.bmp"), wxBITMAP_TYPE_BMP);
        // Verification :
        wxString *failed = new wxString(wxGetTranslation(_T("Failed Loading BMP Image ")));
            if (! bmp1->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("1"));
            if (! bmp2->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("2"));
            if (! bmp3->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("3"));
        // Assignment to the ComboControl
        SetButtonBitmaps(*bmp1, false, *bmp2, *bmp3, wxNullBitmap);
 
 
    ////    SIZE Handling :    Very Important to not display the list things...
 
        SetSizeHints(wxSize(57, 55), wxSize(57, 55), wxSize(57, 0));    // corresponding to the button's size.
        SetPopupMinWidth(GetLongestTextFromChoices(choices));    //    largeur min pour la combo list
        SetPopupMaxHeight(GetHeightFromChoices(choices));        //    hauteur max pour la combo list
        // Assignment
        SetSize(GetMaxSize());
 
};


Utilisation: Fichier cpp de la construction du Panel:

Code wxWidgets:

    //    //////////////////////////////////////////////////////////////////////////
    //        Combo Ctrl        ///
    //    //////////////////////////////////////////////////////////////////////////
        wxArrayString *les_choix = new wxArrayString();
        les_choix->Insert("20 cm", 0);
        les_choix->Insert("30 cm", 1);
        les_choix->Insert("40 cm", 2);
        vl = new wxComboCtrlWithCustomPopupAnim(this, wxID_ANY, "bitmaps\\bas\\B_bas_", les_choix);
 
 



Le truc, c'est que j'essaie maintenant de mettre des bitmaps à la place de ces wxString. Et ça se complique.
Notez qu'on utilisait wxArrayString, je définis donc ArrayofBmp:

Fichier BmpArray.h avec le lien de ce qui m'a aidé...:

Code wxWidgets:

// ----------------------------------------------------------------------------
// Array of bitmaps to use into a wxComboPopup
/**        HELP from : http://docs.wxwidgets.org/stable/wx_wxarray.html#wxarray        **/
// ----------------------------------------------------------------------------
#ifndef BMP_ARRAY
#define BMP_ARRAY
 
#include <wx/bitmap.h>
#include <wx/dynarray.h>
 
// this defines the new type:
WX_DECLARE_OBJARRAY(wxBitmap, ArrayOfBmp);
 
#endif
 


Fichier BmpArray.cpp :

Code wxWidgets:

#include "BmpArray.h"
 
// now that we have BmpArray declaration in scope we may finish the
// definition of ArrayOfBmp -- note that this expands into some C++
// code and so should only be compiled once (i.e., don't put this in the
// header, but into a source file or you will get linking errors)
#include <wx/arrimpl.cpp> // this is a magic incantation which must be done!
WX_DEFINE_OBJARRAY(ArrayOfBmp);


Et dans le fichier de construction du panel:

Code wxWidgets:

    ArrayOfBmp *bmp_choix = new ArrayOfBmp();
        bmp_choix->Insert(im_rouge, 0);
        bmp_choix->Insert(im_vert, 1);
    accessories= new wxComboCtrlWithIconCustomPopupAnim(this, ID_ACCESS_BTN, "bitmaps\\bas\\access_button\\B_bas_", bmp_choix);
 


Le constructeur de wxComboCtrlWithIconCustomPopupAnim :

Code wxWidgets:

//    ------------------------------------------------------------------------------    //
//                                with BITMAPS                                        //
//    ------------------------------------------------------------------------------    //
wxComboCtrlWithIconCustomPopupAnim::wxComboCtrlWithIconCustomPopupAnim(wxWindow* parent, int id,  const wxString& base_img_name, ArrayOfBmp *choices)
: wxComboCtrl(parent, id, "", wxDefaultPosition, wxDefaultSize, wxNO_BORDER, wxDefaultValidator, "")
{
    ////    Maybe unnecessary but doesn't hurt...
    UseAltPopupWindow(true);
    // Make sure GetFeatures is implemented
    wxComboCtrl::GetFeatures();
 
    ////    LIST VIEW COMBO POPUP Managing :
        m_list = new IconViewComboPopup();        // creation
        // Assignment    Must be one of the 1st things to do... otherwise --> ASSERT errors on 'm_count'
        SetPopupControl(m_list);
 
        InitImagelist();
        m_list->SetImageList(full_image_list, wxIMAGE_LIST_NORMAL);
 
        // Filling using the passed argument 'choices[]'
        for (int i = 0; i < 8; i++)
        {
 
        }
 
        // Background
        m_list->SetBackgroundColour(wxColour(217, 223, 235));
 
    SetCustomPaintWidth(200);
 
    ////    BITMAP :
        // Creation using the argument 'base_img_name'
        wxBitmap *bmp1 = new wxBitmap(base_img_name + wxT("norm.bmp"), wxBITMAP_TYPE_BMP);
        wxBitmap *bmp2 = new wxBitmap(base_img_name + wxT("clicked.bmp"), wxBITMAP_TYPE_BMP);
        wxBitmap *bmp3 = new wxBitmap(base_img_name + wxT("on.bmp"), wxBITMAP_TYPE_BMP);
        // Verification :
        wxString *failed = new wxString(wxGetTranslation(_T("Failed Loading BMP Image ")));
            if (! bmp1->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("1"));
            if (! bmp2->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("2"));
            if (! bmp3->IsOk())        wxLogMessage(*failed + *base_img_name +wxT("3"));
        // Assignment to the ComboControl
        SetButtonBitmaps(*bmp1, false, *bmp2, *bmp3, wxNullBitmap);
 
 
 
 
 
    ////    SIZE Handling :    Very Important to not display the list things...
        SetSizeHints(wxSize(57, 55), wxSize(65, 65), wxSize(65 , 0));    // corresponding to the button's size.
        SetPopupMinWidth(100);        //    largeur min pour la combo list
        SetPopupMaxHeight(200);        //    hauteur max pour la combo list
        // Size Assignment
        SetSize(GetMaxSize());
};


et la fonction InitImagelist() :

Code wxWidgets:

    void InitImagelist()
    {
        ////    images load :
            im_rouge            = new wxBitmap(_T("bitmaps\\eye_status\\rouge.bmp"), wxBITMAP_TYPE_BMP);
            im_vert                = new wxBitmap(_T("bitmaps\\eye_status\\vert.bmp"), wxBITMAP_TYPE_BMP);
 
            full_image_list = new wxImageList(65, 65);
            full_image_list->Create(65, 65);
        full_image_list->Add(*im_rouge);            //    pos° 0.
        full_image_list->Add(*im_vert);                //    pos° 1.
    };
 


Voilà à peu près où j'en suis, je récupère l'erreur "Couldn't add an image to the image list" à l'exécution.

Pourtant je pensais bien faire. Le problème vient peut-être de BmpArray... ?

Je sais que c'est un gros sujet, j'espère avoir expliqué correctement, et que vous aurez des idées me permettant d'avancer là dessus.

Merci d'avance,

Thomas.
30-01-2009 15:57:19  Re: Bitmap comboControl avec popupAnimation et bitmaps. #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

Je doute que ça ait un rapport, mais tu devrais éviter d'apperler le constructeur avec la dimension des images, puis create.

Comme pour les fenêtres et contrôles, il ne faut appeler Create que si tu utilises le constructeur par défaut (celui qui ne prend pas de paramètres).

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
03-02-2009 08:43:29  Re: Bitmap comboControl avec popupAnimation et bitmaps. #3
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne
Salut, merci de m'avoir lu...
J'ai supprimé ce create, j'ai bien noté pour plus tard que tu l'utilises que si tu appelles le constructeur vide.
Par, contre, mon vaste problème ne venait pas de là...

Si jamais j'avance là dessus, je vous le dirai.

Bonne journée,
Thomas.
03-02-2009 08:50:34  Re: Bitmap comboControl avec popupAnimation et bitmaps. #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Juste une petite question : tu as bien vérifié que tes wxBitmaps (im_rouge et im_vert) étaient bien valides ?

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
03-02-2009 10:50:16  Re: Bitmap comboControl avec popupAnimation et bitmaps. #5
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne
Ouais, j'ai pris l'habitude de faire un

Code wxWidgets:

if (! im_rouge->IsOk())        wxLogMessage(*failed += _T("\"im_rouge\""));


Donc elles devraient être valides.
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Bitmap comboControl avec popupAnimation et bitmaps.