Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 3


|
Menu Snippets (navigation): |
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...
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();
Il est bien entendu possible de positionner l'ombre de manière différente.
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 :

@+ 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 . 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): |
|