[gtkmm] repaint ? + rahmen um IconView Elemente ?
-
Ich habe zwei voneinander unabhängige Probleme
1. Ich möchte aus einem Callback heraus ein Gtk::Window anzeigen und rufe dafür einfach die show() Methode auf.
Das Fenster öffnet sich auch, allerdings wird der Inhalt nicht gezeichnet, erst wenn die Callback Methode durchgelaufen ist.Eine repaint methode oder dergleichen kann ich nicht finden. Lässt sich sowas irgendwie anders realisieren !?
2. Gibt es eine einfach Möglichkeit einen farbigen Rahmen um Gtk::IconView Elemente zeichnen zu lassen ?
-
Hi,
Mortal2006 schrieb:
Ich habe zwei voneinander unabhängige Probleme
1. Ich möchte aus einem Callback heraus ein Gtk::Window anzeigen und rufe dafür einfach die show() Methode auf.
Das Fenster öffnet sich auch, allerdings wird der Inhalt nicht gezeichnet, erst wenn die Callback Methode durchgelaufen ist.Eine repaint methode oder dergleichen kann ich nicht finden. Lässt sich sowas irgendwie anders realisieren !?
Ohne Code schwer zu beurteilen. Normal sollte show und show_all_children() am Ende vom Ctor des Gtk::Window ausreichen.
2. Gibt es eine einfach Möglichkeit einen farbigen Rahmen um Gtk::IconView Elemente zeichnen zu lassen ?
Fällt mir auf die schnelle ehrlich gesagt nichts ein. Schon mal versucht, das Container-Widget drumherum einzufärben?
Cheers
GPC
-
Bin der Lösung meines ersten Problems etwas näher gekommen. Auf der suche nach dem Container-Widget für meine IconView Elemente(das ich nicht gefunden habe, ich denke es gibt neben der IconView(die ich einfärben kann) keine weiteren container ?) bin ich auf die Methoden:
Gdk::Window::invalidate_rect(...)
Gdk::Window::process_all_updates()gestoßen. Das Problem ist wohl das die Fenster im Gtk Mainloop neu gezeichnet werden, allerdings wird dieser ja von meinem Callback unterbrochen( show() und show_all_children() aendern glaub ich nur das visible Attribut).
Nun haben die beiden Methoden mir schon etwas weiter geholfen, allerdings funktioniert das neu zeichnen nur Teilweise.
Ich benutze glade und das Window um das es geht enthält zwei Labels die eigentlich vollkommen gleich konfiguriert sind. Beim ersten Aufruf des Callbacks wird das Window noch nicht richtig gezeichnet, beim zweiten schon...
Gtk::Window* statusWindow = (Gtk::Window*)refXml->get_widget("StatusWindow"); Gtk::Label* status1 = (Gtk::Label*)refXml->get_widget("USW_Status1"); Gtk::Label* status2 = (Gtk::Label*)refXml->get_widget("USW_Status2"); status1->set_text("blabla"); statusWindow->show(); statusWindow->show_all_children(true); /*bereich der neu gezeichnet werden soll ...*/ Glib::RefPtr<Gdk::Window> window=statusWindow->get_window(); int x,y,width,height; window->get_root_origin(x,y); statusWindow->get_size(width,height); Gdk::Rectangle rect(x, y, width, height); window->invalidate_rect(rect,true); /*neu zeichnen !?*/ window->process_updates(true); /*fenster mit irgendwelchen daten aktualisieren ...*/ for(unsigned int i=0; i < 103091; ++i) { status2->set_text(i); /*nur ein beispiel ...*/ window->process_updates(true); } statusWindow->hide();
Mehr passiert mit dem Window im Callback nicht und auch zwischen den Aufrufen nicht. Ich schätzedas so noch nicht alle wichtigen events abgearbeitet werden...
-
So hab eine für mich funktionierende Lösung, war wohl etwas zu sparsam mit dem invalidieren des screens
Ganz am Anfang rufe ich einmal folgenden Code auf:
Gtk::Window* statusWindow = (Gtk::Window*)refXml->get_widget("StatusWindow"); Glib::RefPtr<Gdk::Window> window=statusWindow ->get_window(); Glib::RefPtr<Gdk::Screen> screen=statusWindow ->get_screen(); Gdk::Rectangle rect(0, 0, screen->get_width(), screen->get_height()); window->invalidate_rect(rect,true); window->process_all_updates();
Und wann immer ich dann das neu zeichnen nochmal anstoßen will(z.B. im loop):
window->process_updates(true);