Dr_Lion Posted February 24, 2012 at 04:02 PM Report Share #441030 Posted February 24, 2012 at 04:02 PM Boas tardes, tenho o seguinte código em linguagem C que usa o CAIRO para desenhar figuras geométricas e o GTK para criar uma janela onde são desenhadas as figuras. Percebo de C, no entanto, a programação em GTK tal como CAIRO é novo para mim, comecei a brincar com isto á 2 dias. O código, é uma mistura de alguns tuturiais que retirei da internet e alterei á minha maneira, no entanto quando a janela é criada, o programa fica pendurado á espera que feche a janela para continuar. O que eu pretendia era que a janela fosse actualizada, ou redesenhada, mas o programa continuasse a sua excução. O código de criação das janelas encontra-se todo na funcão main, e será aí que é necessário fazer a alteração. Alguém pode dar uma ajuda? #include <stdio.h> #include <cairo.h> #include <gtk/gtk.h> #define M_PI 3.1415 static gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { double xc1 = 300.0; double yc1 = 225.0; double xc2 = 200.0; double yc2 = 400.0; double xc3 = 400.0; double yc3 = 400.0; double radius1 = 100.0; double radius2 = 100.0; double radius3 = 100.0; double angle1 = 0.0 * (M_PI/180.0); /* angles are specified */ double angle2 = 360.0 * (M_PI/180.0); /* in radians */ cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 500, 500); //cairo_t *cr = cairo_create (surface); cairo_t *cr; cr = gdk_cairo_create(widget->window); //circ 1 s linhas cairo_set_line_width (cr, 10.0); cairo_arc (cr, xc1, yc1, radius1, angle1, angle2); cairo_stroke (cr); //circ 2 s linhas cairo_arc (cr, xc2, yc2, radius2, angle1, angle2); cairo_stroke (cr); //circ 3 s linhas cairo_arc (cr, xc3, yc3, radius3, angle1, angle2); cairo_stroke (cr); /* // draw helping lines cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6); cairo_set_line_width (cr, 6.0); //centro da circunf cairo_arc (cr, xc1, yc1, 10.0, 0, 2*M_PI); cairo_fill (cr); //linhas cairo_arc (cr, xc1, yc1, radius1, angle1, angle1); cairo_line_to (cr, xc1, yc1); cairo_arc (cr, xc1, yc1, radius1, angle2, angle2); cairo_line_to (cr, xc1, yc1); cairo_stroke (cr); * */ return FALSE; } int main (int argc, char *argv[]) { printf("\n inicio do programa..\n"); GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK); g_signal_connect(window, "expose-event", G_CALLBACK(on_expose_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(window), "lines"); gtk_window_set_default_size(GTK_WINDOW(window), 600, 600); gtk_widget_set_app_paintable(window, TRUE); gtk_widget_show_all(window); gtk_main(); printf("Retornou ao prog.\n A sair..\n"); return 0; } Agradeço desde já a todos. Link to comment Share on other sites More sharing options...
seuqram Posted February 24, 2012 at 04:43 PM Report Share #441034 Posted February 24, 2012 at 04:43 PM esperimenta meter while! assim ele vai atualizar. Link to comment Share on other sites More sharing options...
Dr_Lion Posted February 27, 2012 at 02:44 PM Author Report Share #441329 Posted February 27, 2012 at 02:44 PM Pois, tendo em conta que aí está a desenhar apenas uma vez, para desenhar várias tenho o meter dentro de um ciclo, e não tem que ser obrigatoriamente um while, pode ser um for. A minha questão não é essa, mas sim, que trecho de código por dentro do ciclo, para juntando um simples printf("\teste"); o programa desenhe a janela e esteja constantemente a escrever na consola o printf e a actulizar a imagem da janela. Como disse em cima este código é uma mistura de vários pelo que o código base a janela ficava á espera de uns cliques do rato, pelo que pode ser necessário alterar alguma função de modo a esta não ficar bloqueada á espera. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now