Bonjour tout le monde,
Je me casse la tête sur un pb pour lequel je ne trouve pas de solution sur un forum, et qui par conséquent vaut peut-être le coup d'être exposé.
J'essaie d'utiliser une sf::RenderWindow dans une interface wxWidgets. Pour ça, j'ai suivi le tuto proposé là:
http://www.sfml-dev.org/tutorials/1.6/graphics-wxwidgets-fr.php.
N'étant pas très fort en compilation, je bloque sur le message d'erreur:
/home/damien/Bureau/cpp/test-wx/wxSFMLCanvas.cpp||In member function ‘void wxSFMLCanvas::OnPaint(wxPaintEvent&)’:|
/home/damien/Bureau/cpp/test-wx/wxSFMLCanvas.cpp|53|error: invalid use of incomplete type ‘struct Display’|
/usr/include/X11/Xlib.h|263|error: forward declaration of ‘struct Display’|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 2 seconds) ===|
Je compile avec Code::Blocks sous Debian. J'utilise la SFML 2.0 et wxWidget 2.8.
Si quelqu'un a une idée... mes cheveux lui rendront grâce avant que je me les arrache...
Voici mes fichiers éventuellement problématiques, réalisés en faisant des copiers-collers depuis le tuto:
wxSFMLCanvas.h
============
#ifndef WXSFMLCANVAS_H
#define WXSFMLCANVAS_H
#include <SFML/Graphics.hpp>
#include <wx/wx.h>
class wxSFMLCanvas : public wxControl, public sf::RenderWindow
{
public :
wxSFMLCanvas(wxWindow* Parent = NULL, wxWindowID Id = -1, const wxPoint& Position = wxDefaultPosition,
const wxSize& Size = wxDefaultSize, long Style = 0);
virtual ~wxSFMLCanvas();
private :
DECLARE_EVENT_TABLE()
virtual void OnUpdate();
void OnIdle(wxIdleEvent&);
void OnPaint(wxPaintEvent&);
void OnEraseBackground(wxEraseEvent&);
};
#endif // WXSFMLCANVAS_H
wxSFMLCanvas.cpp
==============
#include "wxSFMLCanvas.h"
#ifdef __WXGTK__
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <wx/gtk/win_gtk.h>
#endif
wxSFMLCanvas::wxSFMLCanvas(wxWindow* Parent, wxWindowID Id, const wxPoint& Position, const wxSize& Size, long Style) :
wxControl(Parent, Id, Position, Size, Style)
{
#ifdef __WXGTK__
// La version GTK requiert d'aller plus profondément pour trouver
// l'identificateur X11 du contrôle
gtk_widget_realize(m_wxwindow);
gtk_widget_set_double_buffered(m_wxwindow, false);
GdkWindow* Win = GTK_PIZZA(m_wxwindow)->bin_window;
XFlush(GDK_WINDOW_XDISPLAY(Win));
sf::RenderWindow::create(GDK_WINDOW_XWINDOW(Win));
#else
// Testé sous Windows XP seulement (devrait fonctionner sous X11 et
// les autres versions de Windows - aucune idée concernant MacOS)
sf::RenderWindow::Create(GetHandle());
#endif
}
wxSFMLCanvas::~wxSFMLCanvas()
{
//dtor
}
void wxSFMLCanvas::OnIdle(wxIdleEvent&)
{
// On génère un rafraîchissement du contrôle, afin d'assurer un framerate maximum
// La fonction Refresh est définie dans wxControl, et génère (entre autres) un évènement paint pour rafraîchir le contrôle.
Refresh();
}
void wxSFMLCanvas::OnPaint(wxPaintEvent&)
{
// On prépare le contrôle à être dessiné (verrouillage de la zone graphique)
wxPaintDC Dc(this);
// On laisse la classe dérivée se mettre à jour et dessiner dans le contrôle
OnUpdate();
// On affiche tout ça à l'écran
Display();
}