Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0][GTK+] Wyświetlanie okna SFML w GTK

Ostatnio zmodyfikowano 2019-02-15 15:40
Autor Wiadomość
Leon2004_
Temat założony przez niniejszego użytkownika
[SFML 2.0][GTK+] Wyświetlanie okna SFML w GTK
» 2019-02-07 21:40:43
Witam,
problem jest taki że mam program oparty o SFML i chcę do niego dołożyć menu przez GTK+.
Kiedy załączam pętlę gtk_main() nic się nie wyświetla w oknie SFML.
Kiedy zaś ją usunę, mam działającego SFMLa i białe okienko GTK.
Poszukałem trochę i znalazłem ten temat http://cpp0x.pl/forum/temat/?id=11666
Zaimplementowałem kod, i całość się kompiluje, ale mam jedno okienko z czarnym tłem - jakby pętla gtk blokowała wszystko inne.
Pytaniem jest, jak w załączonej pętli cokolwiek wyświetlić? W razie czego mogę podać kod programu.
Pozdrawiam
P-173916
pekfos
» 2019-02-08 00:28:10
Pokaż ten kod.
P-173917
Leon2004_
Temat założony przez niniejszego użytkownika
» 2019-02-08 09:28:55
Kod jest w zasadzie sklejony z przykładu z kursu na stronie, oraz kod który był w linku który podałem.
Program się kompiluje, mam czarne okienko. Nie wiem co jest w tym okienku, a nawet jak tam jest obraz z SFML to nie wiem jak go zaktualizować.

C/C++
#include <iostream>
#include <cmath>
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdkwin32.h>


using namespace std;
using namespace sf;

RenderWindow win;

int main( int argc, char * argv[] )
{
    gtk_init( & argc, & argv );
   
    GtkWidget * window;
    GtkWidget * area;
   
    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    area = gtk_drawing_area_new();
   
    gtk_container_add( GTK_CONTAINER( window ), area );
   
    GdkEventMask mask;
    mask = GDK_ALL_EVENTS_MASK;
    gtk_widget_add_events( area, mask );
   
    gtk_widget_set_can_focus( area, true );
    gtk_widget_set_size_request( area, 16 * 25, 16 * 25 );
   
    gtk_widget_realize( area );
    gtk_widget_set_double_buffered( area, false );
   
   
    gdk_window_resize( area->window, 16 * 25, 16 * 25 );
    win.create( sf::WindowHandle( GDK_WINDOW_HWND( area->window ) ) );
   
    gtk_widget_show_all( window );
    gtk_main();
   
    while( win.isOpen() )
    {
        Event e; //stwórz wydarzenie
        while( win.pollEvent( e ) )
        {
            if( e.type == Event::Closed ) //Jeżeli chcę zamknąć, zamknij
                 win.close();
           
            if( e.type == Event::KeyPressed ) //Zdarzenia z klawiatury
            {
                switch( e.key.code )
                {
                case Keyboard::M:
                   
                    break;
                case Keyboard::B:
                   
                    break;
                case Keyboard::G:
                   
                    break;
                case Keyboard::K:
                   
                    break;
                case Keyboard::W:
                   
                    break;
                case Keyboard::S:
                   
                    break;
                case Keyboard::P:
                   
                    break;
                case Keyboard::Escape:
                    win.close();
                    break;
                case Keyboard::I:
                   
                    break;
                }
            }
        }
       
        drawLines( win, zmienne, iloscZmiennych ); //narysuj zmienne
       
    }
    return 0;
}
P-173918
pekfos
» 2019-02-08 12:22:13
Pętla główna programu wykonuje się przez cały czas trwania aplikacji, więc jak dasz dwie jedną po drugiej to powinno być oczywiste, co się stanie. Temat do którego się odniosłeś zawiera rozwiązanie tego problemu.
P-173921
Leon2004_
Temat założony przez niniejszego użytkownika
» 2019-02-08 12:35:45
Tak, wiem że wykonują się dwie pętle (a w zasadzie wykonuje się jedna, 2 się znjadują po prostu w kodzie). Właśnie trochę nie ogarniam rozwiązania w poście który podlinkowałem, kod wręcz skopiowałem a nie działa. Znaczy działa, ale nie mogę nic zrobić - nie wiem jak wyświetlić cokolwiek z SFMLa.
P-173922
Gabes
» 2019-02-08 23:09:30
Należy utworzyć wspólny "kontekst urządzenia"
WinApi, OpenGL.
P-173926
Leon2004_
Temat założony przez niniejszego użytkownika
» 2019-02-09 10:27:32
"Należy utworzyć wspólny "kontekst urządzenia" WinApi, OpenGL." Co to znaczy? Mam się przesiąść na WinAPI i OpenGL? Już wolałbym samo winapi...
P-173927
jankowalski25
» 2019-02-09 12:04:31
Właśnie trochę nie ogarniam rozwiązania w poście który podlinkowałem
Ale przecież tam nie było dwóch pętli zdarzeń jedna pod drugą. Zauważ, że w kodzie ze wspomnianego tematu po
gtk_main();
 już niczego więcej nie ma, jest jedynie wyjście z maina i to koniec.

Popatrz na to, w którym momencie jest w tamtym kodzie używane
sf::Event
 i podepnij to analogicznie u siebie. Kolejność ma być taka: najpierw konfiguracja GTK+ i wszystkiego, co jest z tym związane, a dopiero potem obsługa zdarzeń SFML w miejscu uzyskania z GTK+ informacji o tym, że nastąpiło jakieś zdarzenie.

Należy utworzyć wspólny "kontekst urządzenia"
WinApi, OpenGL.
Hę? Kontekst, w sensie uchwytu do okna w WinAPI? Chodziło o poniższą linijkę?
Win.create( sf::WindowHandle( GDK_WINDOW_HWND( area->window ) ) );
To akurat jest w porządku, uchwyt uzyskany z GTK+ jest przekazywany do SFML, aby ta biblioteka nie próbowała tworzyć nowego okna po swojemu.

Mam się przesiąść na WinAPI i OpenGL? Już wolałbym samo winapi...
Nie ma takiej potrzeby. Obie biblioteki w swoich implementacjach korzystają z WinAPI, wystarczy najpierw utworzyć wszystko w GTK+, a następnie przekazać stamtąd niektóre elementy do SFML (chociażby wspomniany uchwyt do okna w WinAPI).
P-173928
« 1 » 2
  Strona 1 z 2 Następna strona