Tak jak w temacie.
Próbuję z g_signal_emit_by_name ( G_OBJECT(draw), "configure-event", 0, NULL );
jednak bez skutku i mam komunikat:
Glib_Gobject-WARNING **: gsignal.c:3003 value location for gboolean
passed as NULL
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 10 lat
- Postów:51
Fakt, działa, ale:
Należy pamiętać jeśli zostanie podpięta funkcja obsługująca to zdarzenie g_signal_connect (G_OBJECT(draw), "configure-event", G_CALLBACK(konfig), GINT_TO_POINTER(3) );
i w niej korzysta się z zmiennych struktury GdkEvent to program się wysypie, dlatego należy wypełnić tą strukture. Poniżej trochę kodu, może komuś się przyda:
guint skala;
gboolean konfig (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
gdouble x, y;
x = ((GdkEventButton*)event)->x; // 1 sposób dostania się do składowej
y = event->button.y; // 2 sposób dostania się do składowej
x = x * skala;
y = y * (gint) user_data;
return FALSE;
}
int main( int argc, char **argv )
{
GtkWidget *draw;
[...]
draw = gtk_drawing_area_new();
g_signal_connect (G_OBJECT(draw), "configure-event", G_CALLBACK(konfig), GINT_TO_POINTER(3) );
[...]
GdkEvent ev;
gboolean v;
/* Należy wypełnić strukture przynajmniej tymi danymi, które będą używane w funkcji obsługującej zdarzenie configure-event */
ev.button.x = 2.0;
ev.button.y=4.9;
g_signal_emit_by_name ( G_OBJECT(draw), "configure-event", &ev, &v ); // Emisja sygnału configure-event
g_print ( "Funkcja konfig zwrocila wartość %d\n", v );
[...]
}
Trochę rzeźbisz. Wysyłasz sygnał, który informuje o zmianie rozmiaru okna, podajesz tam jakieś dane o buttonie O.o Rzutujesz na GdkEventButton zamiast skorzystać z GdkEventConfigure w handlerze. Może poczytaj tutorial http://developer.gnome.org/gtk-tutorial/2.24/x2470.html bo to chyba chcesz zrobić.
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 10 lat
- Postów:51
To jest tylko wycinek wiekszej całości :)
Emmisja sygnału configure-event potrzebna mi była, aby skrócić testowanie programu. Zmiana rozmiaru okna u mnie pociąga za sobą zmiane rozmiaru obszaru rysunkowego (trzeba przeliczyć/przeskalować punkty), a nadodatek nie musiałem klikać LMB na pozycji 2.0,4.9 :) Być może można było użyć innego sygnału, ale ten sposób okazał się skuteczny...
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.