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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    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 émérite 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 : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    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 confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    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 confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    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 confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    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 émérite 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 : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    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

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