IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Mettre une image dans une static Box ?


Sujet :

wxWidgets

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Mettre une image dans une static Box ?
    Bonjour tout le monde,

    j'ai un soucis avec les wxWidgets, c'est purement graphique. J'ai un panel contenant notamment un wxStaticBox (que je met dans un wxSaticBoxSizer, c'est joli tout ca !). Dans mon exemple le box porte le nom "Joueur :". Voilà, maintenant j'aimerai mettre une image dedans.

    Par exemple ici :


    J'aimerai avoir le rectangle grisé non pas derrière le static box mais à l'interieur, et avoir donc les inscriptions par dessus. En gros dans la static box, à la place d'avoir du vert, je veux ma bitmap, et autour bien sur ca reste vert !

    Je ne comprends pas comment faire. Voila ce que j'ai essayé. Deriver du wxPanel dans lequel je suis pour faire une fonction OnPaint et afficher mon image dedans. Ca me donne le résultat que vous voyez. Autre hypothèse, j'ai dérivé wxStaticBox et par la meme technique créé un evenement OnPaint encore une fois, dans lequel j'affiche l'image. Mais cette fois ce n'est jamais rafraichi (on ne passe pas dans le OnPaint !). Par contre le panel est bien rafraichi, mais ca ne me sert pas !

    Merci pour votre aide !

    Bye.
    Alex.

  2. #2
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Salut Muetdhiver,
    en effet ce n'est pas possible avec widget de faire ca, tu peux cependant triché en affichant un text transparent je te donne un exemple d'une classe qui herite de wxStaticText

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <wx/stattext.h>
    class CTransparentStaticText : public wxStaticText
    {
        DECLARE_DYNAMIC_CLASS (CTransparentStaticText)
     
      public:
        CTransparentStaticText();
        CTransparentStaticText(
            wxWindow* parent,
            wxWindowID id,
            const wxString& label,
            const wxPoint& pos = wxDefaultPosition,
            const wxSize& size = wxDefaultSize,
            long style = 0,
            const wxString& name= wxStaticTextNameStr
        );
     
        bool Create(
            wxWindow* parent,
            wxWindowID id,
            const wxString& label,
            const wxPoint& pos = wxDefaultPosition,
            const wxSize& size = wxDefaultSize,
            long style = 0,
            const wxString& name= wxStaticTextNameStr
        );
     
        virtual bool HasTransparentBackground() { return true; };
     
        virtual void OnPaint(wxPaintEvent& event);
        void OnRepaint();
        DECLARE_EVENT_TABLE()
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include "CTransparentStaticText.h"
    #include "wx/dcclient.h"
     
    IMPLEMENT_DYNAMIC_CLASS (CTransparentStaticText, wxStaticText)
     
    BEGIN_EVENT_TABLE(CTransparentStaticText, wxStaticText)
      EVT_PAINT(CTransparentStaticText::OnPaint)
    END_EVENT_TABLE()
     
    CTransparentStaticText::CTransparentStaticText() {}
     
    CTransparentStaticText::CTransparentStaticText(wxWindow* parent, wxWindowID id, const wxString& label,const wxPoint& pos, const wxSize& size, long style, const wxString& name )
    {
        Create(parent, id, label, pos, size, style, name);
    }
     
     
    bool CTransparentStaticText::Create(wxWindow* parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxString& name )
    {
        bool bRetVal = wxStaticText::Create(parent, id, label, pos, size, style|wxTRANSPARENT_WINDOW, name);
        SetBackgroundColour(parent->GetBackgroundColour());
        SetBackgroundStyle(wxBG_STYLE_COLOUR);
        SetForegroundColour(parent->GetForegroundColour());
        return bRetVal;
    }
     
    void CTransparentStaticText::OnPaint(wxPaintEvent& event)
    {
        wxPaintDC dc(this);
        dc.SetFont(GetFont());
        dc.DrawText(GetLabel(), 0, 0);
    }
     
    void CTransparentStaticText::OnRepaint()
    {
        GetParent()->RefreshRect(GetRect(), false);
        GetParent()->Update();
        wxPaintDC dc(this);
        dc.SetFont(GetFont());
        dc.DrawText(GetLabel(), 0, 0);
    }
    bon courage ....

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci bcp pour cette réponse !
    Je vais essayer tout ca ce WE !
    J'ai cependant une petite question qui me vient d'emblée :

    La callback OnRepaint n'est associée à aucun évenement (contrairement à OnPaint). Pourquoi la créer ? Quand l'utiliser ?
    Quel est ce mecanisme de Repaint par rapport a celui du Paint() aisément compréhensible ?

    Merci. A la prochaine !

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Hello,

    En fait je regarde un peu la solution que tu proposes mais je comprends pas trop le concept !
    Tu veux que j'utilise une box, avec du texte transparent dedans, et qu'en dessous (dans mon panel) j'affiche la bmp ? C'est ca ?

    Si oui alors ca pose probleme dans le sens ou le texte ne rempli pas entièrement la static box, donc y aura des portions qui resteront en vert non ? Genre sur les bordures ? Les lignes de séparation entre les textes ont des marges elles aussi....

    Dis moi ce que tu en penses.
    En tout cas merci.

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Hello, encore un nouveau message de ma part puisqu'a chaque fois ce sont des questions différentes autour de ton code. Là j'ai essayé ta classe. Mais ou as tu pris cette classe ? Ca ne fonctionne pas du tout, ou alors j'ai cruellement oublié quelque chose. Deja pour trois points :

    1) L'objet wxDCPaint ne peut être utilisé que dans un evenement EVT_PAINT, donc dans la fonction OnRepaint associée a aucun evenement ca ne peut pas fonctionner (Exception wx).

    2) L'attribut wxTRANSPARENT_WINDOW ne fonctionne QUE pour les wxWindow (The window is transparent, that is, it will not receive paint events. Windows only.) et non pas ses dérivés apparemment (me trompes-je ? )

    3) Enfin, encore a ce sujet, utiliser wxTRANSPARENT_WINDOW fait que la classe en question ne recoit plus l'evenement EVT_PAINT. Donc le code dans la fonction OnPaint ne peut pas être executé ! D'ailleurs avec un point d'arrêt je n'y passe jamais, donc pas d'utilité, ou alors j'ai pas tout pigé !

    Sinon, quand meme, pour le test, j'ai essayé d'utiliser ta classe simplement, en remplacant mon wxStaticText par le CTransparentStaticText et ca m'affiche simplement le texte sur fond gris (donc rien de transparent, je ne vois pas mon image derrière...).

    Merci pour l'aide !
    A plus.

  6. #6
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Salut Muetdhiver,
    ce code marche très bien je l'utilise moi meme, montre moi ton example.
    La callback OnRepaint n'est associée à aucun évenement (contrairement à OnPaint). Pourquoi la créer ? Quand l'utiliser ?
    Tu as entièrement raison c'est une fonction que j'utilisais pour un cas bien particulier elle ne te sera d'aucune utilité.

    je t'ai fait un petit exemple vite fait minimal.
    TMyFrame.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #ifndef WX_PRECOMP
        #include "wx/wx.h"
    #endif
    #include "CTransparentStaticText.h"
    using namespace std;
     
    class TMyFrame : public wxFrame
    {
    public:
        CTransparentStaticText *isConnected;
     
        TMyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,long style = wxDEFAULT_FRAME_STYLE);
        void OnPaint(wxPaintEvent& event);
    DECLARE_EVENT_TABLE()
    };
     
    class TMyApp : public wxApp
    {
    public:
        TMyFrame *frame;
        bool OnInit();
    };
    TmyFrame.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #ifndef __TMYFRAME__
        #include "TMyFrame.h"
    #endif
     
    #include <wx/image.h>
     
    using namespace std;
     
    BEGIN_EVENT_TABLE(TMyFrame, wxFrame)
        EVT_PAINT(TMyFrame::OnPaint)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(TMyApp)
     
    bool TMyApp::OnInit()
    {
            frame = new TMyFrame("softphone", wxPoint(264, 142),wxSize(262, 141));
        frame->Show(true);
        return true;
    }
     
    TMyFrame::TMyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,long style) : wxFrame(NULL, -1, title, pos, size, style)
    {
        isConnected=new CTransparentStaticText(this,-1,"",wxPoint(140, 20),wxSize(50,30),wxTRANSPARENT_WINDOW);
        isConnected->SetLabel("Connecting ...");
        isConnected->Refresh();
    }
     
    //function call when the gui have to be repaint
    void TMyFrame::OnPaint(wxPaintEvent& event)
    {
        wxPaintDC MonDC(this);
        wxImage * fond=new wxImage();
        fond->AddHandler(new wxPNGHandler);
        string tmpBG="./popup_BG.png";
        fond->LoadFile(tmpBG.c_str(), wxBITMAP_TYPE_PNG);
        wxBitmap * bitmap=new wxBitmap(*fond);
        MonDC.DrawBitmap(*bitmap, 0, 0);
        delete bitmap;
        delete fond;
    }
    makefile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    all:
    g++ -o ./build/CTransparentStaticText.o -c ./sources/CTransparentStaticText.cpp `$(WXWIDGET_LIBRARY_PATH)/lib/wx/config/$(WXWIDGET_HEADER_PATH) --cxxflags` -g -Wall
        g++ -o ./app/test ./sources/TMyFrame.cpp ./build/CTransparentStaticText.o -I./sources/ `$(WXWIDGET_LIBRARY_PATH)/lib/wx/config/$(WXWIDGET_HEADER_PATH) --libs` `$(WXWIDGET_LIBRARY_PATH)/lib/wx/config/$(WXWIDGET_HEADER_PATH) --cxxflags`
    ca marche très bien chez moi si tu as un problème montre dit moi ce qu'il en est ...
    bon courage

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci pour toute cette aide !
    Effectivement ton code doit fonctionner et je n'en doute pas mais cela ne répond pas à mes attentes ! Ce que je voulais, c'est afficher du texte avec une image en dessous (d'ou le texte transparent, en effet), mais tout en laissant le texte dans une StaticBox, de façon a ce qu'il soit borné, et qu'on puisse le mettre dans un StaticBoxSizer pour ne pas avoir a gérer son placement. Or toi tu ne place pas ton texte dans une StaticBox mais nulle part (enfin juste dans la frame, en spécifiant ses coordonnées). Donc résultat ca fonctionne.
    Moi ca me donne l'exemple explicite quand je le place à moitié au dessus du StaticBox, et à moitié sur mon image :

    Sur l'exemple, c'est le texte "Score :" qu'il faut regarder! Le "Score" est sur la StaticBox, et le " :" est sur l'image.
    Conclusion : le texte transparent dont tu parles est en effet transparent mais affiche le widget du dessous, donc pour le cas d'un StaticBox ce ne peut pas fonctionner puisque ca m'affiche le gris du StaticBox qui est en dessous

    Merci pour ton aide, le débat reste ouvert.

  8. #8
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    Hmm ok pour l'exemple que je t'ai donnée en effet tu ne peut pas l'appliquer au staticBox.
    tu as deux voix pour faire ce que tu veux :
    1. Soit tu fait la meme chose que ce que j'ai fait pour les wxStaticBox
    2. Soit tu utlise d'autres sizers comme les wxGridSizer

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Hello !
    Je me suis enfin remis sur ce code.
    1) Alors pour ce qui est d'appliquer la même chose a une classe dérivée de StaticBox, c'est a dire faire une CTransparentStaticBox, ca ne fonctionne pas chez moi, j'ai pourtant essayé en mettant un texte transparent dans cette static box transparente, mais on ne voit toujours pas l'image du dessous (c'est comme la capture précédente).
    2) Par contre j'ai donc viré tous les static box, et mis mes textes transparents dans des GridSizer (comme tu l'avais dis). Evidemment ca fonctionne puisqu'il n'y a plus de BoxSizer.

    Merci !
    ++
    Alex.


    Citation Envoyé par Jérémy Lefevre Voir le message
    Hmm ok pour l'exemple que je t'ai donnée en effet tu ne peut pas l'appliquer au staticBox.
    tu as deux voix pour faire ce que tu veux :
    1. Soit tu fait la meme chose que ce que j'ai fait pour les wxStaticBox
    2. Soit tu utlise d'autres sizers comme les wxGridSizer

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. Réponses: 3
    Dernier message: 19/05/2008, 23h04
  3. Mettre une Image dans une Image
    Par shadowhocine dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 19/12/2006, 18h40
  4. Réponses: 3
    Dernier message: 30/10/2006, 11h21
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo