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 Snippets (navigation):
Pages: 1    Accueil » Snippets » Graphique
» Générer un rectangle bords arrondis avec ombre sur fond transparent
Détails du snippet : Générer un rectangle bords arrondis avec ombre sur fond transparent
Informations sur l'auteur de ce snippet :


Hors ligne
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Introduction / Description :
La création de png transparent avec ombre portée se fait assez facilement sous wxwidgets. Il suffit d'utiliser le code ci-dessous. Dans cet exemple, nous créons un rectangle aux bords arrondis (de 10px) avec ombre. Pour simuler l'ombre, un rectangle noir est créé et nous appliquons un effet blur sur celui-ci...
Contenu du snippet :

Code wxWidgets:

 
#include <wx/image.h>
#include <wx/gdicmn.h>
#include <wx/dcmemory.h>
#include <wx/graphics.h>
 
//nous spécifions l'emplacement du fichier qui sera généré
wxString sPath = wxGetCwd()+"/fichier.png";
 
    #if wxUSE_LIBPNG
        wxImage::AddHandler( new wxPNGHandler );
    #endif
 
    wxMemoryDC memDC, memDC_shadow;
 
//variables du rectangle et de l'ombre (600px sur 600px dans cet exemple)
    wxBitmap m_bitmap(600,600);
    wxBitmap m_bitmap_rectangle(600,600);
 
 
    //create background image for shadow
    memDC_shadow.SelectObject( m_bitmap_rectangle );
    memDC_shadow.Clear();
 
//nous créons un rectangle noir à bords arrondis de 15px, pour l'ombre. Les arrondis et la taille du rectangle sont légèrement plus grands que le rectangle principal)
    wxGraphicsContext *gc0 = wxGraphicsContext::Create(memDC_shadow);
    if (gc0)
    {
        gc0->SetPen(*wxTRANSPARENT_PEN);
        wxGraphicsPath path0 = gc0->CreatePath();
        path0.AddRoundedRectangle(5, 5, 110, 110, 15);
//la couleur est noire mais le alpha est à 180 (donc translucide)
        gc0->SetBrush( wxBrush( wxColour(0, 0, 0, 180) ) );
        gc0->FillPath(path0);     
        gc0->StrokePath(path0);
        delete gc0;
    }
    memDC_shadow.SelectObject( wxNullBitmap );
 
 
//nous convertissons le wxGraphicsContext en wxImage
    wxImage image_bkg;
    image_bkg = m_bitmap_rectangle.ConvertToImage();
 
    memDC.SelectObject(m_bitmap);
    memDC.DrawBitmap(wxBitmap(image_bkg.Blur(5)),0,0,true);
 
//nous créons un second wxGraphicsContext in incluons l'ombre précédemment créée.
    wxGraphicsContext *gc2 = wxGraphicsContext::Create(memDC);
    if (gc2)
    {
        gc2->SetPen( wxPen(    wxColour(29, 125, 18, 255), 2 , wxPENSTYLE_SOLID) );
        gc2->SetInterpolationQuality(wxINTERPOLATION_BEST);
        gc2->SetAntialiasMode(wxANTIALIAS_DEFAULT);
        wxGraphicsPath path2 = gc2->CreatePath();
        path2.AddRoundedRectangle(10, 10, 100, 100, 10);   
        gc2->SetBrush( wxBrush( wxColour(255, 255, 255, 255) ) );
        gc2->FillPath(path2);     
        gc2->StrokePath(path2);
        delete gc2;
    }
    memDC.SelectObject(wxNullBitmap);
 
 
    wxImage image, image_temp;
    image_temp = m_bitmap.ConvertToImage();
 
//nous convertissons le tout en wxImage et sauvegadons dans le fichier
    image = image_temp;
    image.SaveFile(sPath, wxBITMAP_TYPE_PNG);
    image.Destroy();
 
Explications finales :
Il est bien entendu possible de positionner l'ombre de manière différente.
Commentaires
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Hello.

En faisant quelques tests, je me suis rendu compte qu'il fallait un peu adapter le code pour qu'il soit compilable avec wxWidgets 2.8.12.

En effet, la classe wxGraphicsContext ne possède pas tous les membres disponibles avec la version 2.9.2.

La partie à modifier est la suivante :

Code wxWidgets:

    wxGraphicsContext *gc2 = wxGraphicsContext::Create(memDC);
    if (gc2)
    {
        gc2->SetPen( wxPen(    wxColour(29, 125, 18, 255), 2 , wxPENSTYLE_SOLID) );
        gc2->SetInterpolationQuality(wxINTERPOLATION_BEST);
        gc2->SetAntialiasMode(wxANTIALIAS_DEFAULT);
        wxGraphicsPath path2 = gc2->CreatePath();
        path2.AddRoundedRectangle(10, 10, 100, 100, 10);   
        gc2->SetBrush( wxBrush( wxColour(255, 255, 255, 255) ) );
        gc2->FillPath(path2);     
        gc2->StrokePath(path2);
        delete gc2;
    }

Avec wxWidgets 2.8.12, la constante wxPENSTYLE_SOLID n'existe pas. Il faut la remplacer par wxSOLID.
De plus, les fonctions membres SetInterpolationQuality et SetAntialiasMode n'existent pas non plus (mais elles ne sont apparemment pas indispensables dans ce cas).
Le bloc de code ci-dessus est donc à remplacer par :

Code wxWidgets:

    wxGraphicsContext *gc2 = wxGraphicsContext::Create(memDC);
    if (gc2)
    {
        gc2->SetPen( wxPen( wxColour(29, 125, 18, 255), 2 , wxSOLID) );
        //gc2->SetInterpolationQuality(wxINTERPOLATION_BEST);
        //gc2->SetAntialiasMode(wxANTIALIAS_DEFAULT);
        wxGraphicsPath path2 = gc2->CreatePath();
        path2.AddRoundedRectangle(10, 10, 100, 100, 10);
        gc2->SetBrush( wxBrush( wxColour(255, 255, 255, 255) ) );
        gc2->FillPath(path2);
        gc2->StrokePath(path2);
        delete gc2;
    }


Et pour ceux que ça intéresse, voici le résultat obtenu :
http://s3.archive-host.com/membres/images/1024301307/Captures/rect-ombre-coins-arrondis.png

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 222
Snippets: 5
Tutoriels: 0
Site web
Hors ligne
Haha c'est excellent à chaque fois j'ai la chance d'avoir un problème à réfléchir et la solution apparaitre le jour même ( environ ). Qu'elle synchronisation. Je teste ça demain au taff. Merci Xaviou et starmate.

Dernière modification par Gandi (13-10-2011 09:53:01)


"Les ordinateurs ne remplaceront jamais les livres. Vous ne pouvez pas vous mettre sur une pile de disquettes pour atteindre le haut de votre armoire" ( Sam Ewing )
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Petite précision supplémentaire : il est désormais possible d'utiliser les wxGraphicsContext avec MinGW (le test ci-dessus a été fait avec GCC-4.5.2-TDM)

Comment va, depuis le temps, Gandi ?

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 222
Snippets: 5
Tutoriels: 0
Site web
Hors ligne
Oooh bein moi je vais très bien, j'ai arrêter de coder la nuit c'est pour ça que je viens plus trop ici. Sauf pour le boulot ... la réalité virtuelle :p.
Bon zouu j'ai de l'IHM à faire ça va me changer de la 3D.

"Les ordinateurs ne remplaceront jamais les livres. Vous ne pouvez pas vous mettre sur une pile de disquettes pour atteindre le haut de votre armoire" ( Sam Ewing )
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Graphique
» Générer un rectangle bords arrondis avec ombre sur fond transparent