Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: sfml+wxWidgets "error: invalid use of incomplete type 'struct Display'"  (Lu 2335 fois)

0 Membres et 1 Invité sur ce sujet

dl

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
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:
Citer
/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
============
Citer
#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
==============
Citer
#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();
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
display();
Laurent Gomila - SFML developer

dl

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Ah oui en effet. Merci !

Cependant les problèmes continuent :

Citer
obj/Debug/MainFrame.o:(.rodata._ZTV8MyCanvas[vtable for MyCanvas]+0x2c)||undefined reference to `wxSFMLCanvas::GetEventTable() const'|
obj/Debug/MainFrame.o:(.rodata._ZTV8MyCanvas[vtable for MyCanvas]+0x30)||undefined reference to `wxSFMLCanvas::GetEventHashTable() const'|
obj/Debug/wxSFMLCanvas.o:(.rodata._ZTV12wxSFMLCanvas[vtable for wxSFMLCanvas]+0x2c)||undefined reference to `wxSFMLCanvas::GetEventTable() const'|
obj/Debug/wxSFMLCanvas.o:(.rodata._ZTV12wxSFMLCanvas[vtable for wxSFMLCanvas]+0x30)||undefined reference to `wxSFMLCanvas::GetEventHashTable() const'|
obj/Debug/wxSFMLCanvas.o:(.rodata._ZTV12wxSFMLCanvas[vtable for wxSFMLCanvas]+0x284)||undefined reference to `wxSFMLCanvas::OnUpdate()'|
||=== Build finished: 5 errors, 0 warnings (0 minutes, 7 seconds) ===|

si je commente DECLARE_EVENT_TABLE() dans la classe wxSFMLCanvas, le programme s'exécute, mais rien ne se dessine.

y a-t-il un remède ?


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Une déclaration ne va jamais seule, il y a toujours la définition qui va avec. Il doit y avoir une macro du genre IMPLEMENT_EVENT_TABLE ou un truc dans le genre. Bref, faut juste lire la doc de base de wxWidgets.

Pour OnUpdate : c'est pareil, s'il est déclaré il faut que tu le définisses quelque part.
Laurent Gomila - SFML developer

dl

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Okay,

ça marche en insérant la définition de la table d'événements dans le wxSFMLCanvas.cpp :
Citer
BEGIN_EVENT_TABLE(wxSFMLCanvas, wxControl)
    EVT_IDLE(wxSFMLCanvas::OnIdle)
    EVT_PAINT(wxSFMLCanvas::OnPaint)
END_EVENT_TABLE()

Merci pour ces réponses rapides et efficaces !!