2016-11-07 1 views
0

Ich hätte gerne ein Fenster, in dem sich ein Bild ändert, abhängig davon, was während einer Endlosschleife passiert.Bild auf StaticBitmap ändern wxWidgets

Stellen Sie sich jemanden vor, der herumläuft und wenn er eine bestimmte Spur verlässt, sollte das Programm einen Pfeil in Richtung der Spur anzeigen. Daher habe ich ein Programm, das den Abstand zwischen User und Track festlegt, aber ich habe keine Ahnung, wie ich das Image updaten soll.

Ich benutze code :: blocks mit wxWidgets und denke, ich muss die wxStaticBitmap Klasse verwenden. (Wenn es eine bessere Art und Weise ist, bitte sagen Sie mir.)

Ich habe versucht, mit: (. Beachten Sie, dass dieser Ausschnitt meist Pseudo-Code ist, mit Ausnahme der StaticDirectionBitmap Teil)

while(true) 
{ 
    updatePosition(); 
    if(userNotOnTrack) 
    { 
     if(trackRightOfUser) 
     { 
      StaticDirectionBitmap->SetBitmap("D:\\WindowsDgps\\WindowsDgpsGraphic\\arrow_right.png"); 
     } 
    } 
} 

Auf Standard der Bitmap hat ein "no_arrow" Bild. Damit bekomme ich einen Fehler: error: no matching function for call to 'wxStaticBitmap::SetBitmap(const char [51])'|. Ich sehe aus der Dokumentation, dass das nicht funktionieren kann, aber ich habe keine Ahnung was könnte.

Wenn jemand weiß, wie man damit umgeht, würde ich mich freuen zu hören. Ich erinnere mich an ein paar Jahre zurück, als ich etwas Ähnliches in C# ausprobiert habe und komplett wegen Thread-Sicherheit gescheitert bin ... Ich hoffe es ist nicht so schwer in C++ mit wxWidgets.

Antwort

2

SetBitmap verwendet einen wxBitmap-Parameter und keine Zeichenfolge. So sollte der Anruf in etwa so aussehen:

SetBitmap(wxBitmap("D:\\WindowsDgps\\WindowsDgpsGraphic\\arrow_right.png", wxBITMAP_TYPE_PNG)); 

Vergewissern Sie sich vor diesem Aufruf, dass die png-Handler mit einem Aufruf wie eine der folgenden Optionen hinzugefügt:

wxImage::AddHandler(new wxPNGHandler); 

oder

::wxInitAllImageHandlers(); 

Der einfachste Ort, um dies zu tun ist in der Anwendung OnInit() -Methode.

Wenn Sie die statische Bitmap von einem Arbeitsthread aktualisieren möchten, sollten Sie ein wxThreadEvent auslösen und dann im Ereignishandler den Aufruf von SetBitmap vornehmen. Das Beispiel here zeigt, wie diese Ereignisse generiert und behandelt werden.