Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ GTK+ _ Перевести код под gtk+3.6.4

Автор: lss 22.12.2015, 18:11

Уважаемые, помогите перевести следующий код, чтобы работал с gtk+ 3.6.4:

         GtkWidget *widget; 
         GdkGC *gc;
         GdkColor fclrs, bclr, clr;
         int timer[9];
         ch_num[9];
         int xt[9];
         int yt[9];
         int x[9];
         int y[9];
         int d[9];
         int i;        

        gc = widget->style->fg_gc[GTK_WIDGET_STATE(widget)];
        GdkFont *font = gdk_fontset_load("Lucida Console");
        gdk_gc_set_rgb_fg_color(gc, &clr);
        gdk_draw_string(widget->window, font, gc, xt[i], yt[i], ch_num);
        gdk_draw_line(widget->window, gc, 862, 255, 997, 255);
        gdk_draw_arc(widget->window, gc, TRUE, x[8] - d[8], y[8] - d[8], 2 * d[8], 2 * d[8], 0, 360 * 64);
        gdk_draw_rectangle(widget->window, gc, TRUE, x[5] - (d[5] / 2) - 5, y[5] - 3, d[5] + 8,3);

Автор: Алексей1153 23.12.2015, 7:58

а что именно не работает ?

навскидку - не видно, где создаётся память для widget. А на инициализацию переменных вообще тут поклали

Автор: ViGOur 23.12.2015, 9:52

Ну да, ни инициализации, ни выделения памяти, ничего!
Ты лучше скажи, что нужно сделать?

Судя по коду, лабу! :)

Автор: lss 23.12.2015, 16:23

Цитата(Алексей1153 @ 23.12.2015, 7:58) *
а что именно не работает ?навскидку - не видно, где создаётся память для widget. А на инициализацию переменных вообще тут поклали

Память выделяется, инициализация делается, но проблема не в этом. Этот код написан под gtk+2, в gtk+3 он просто не компилируется, нет там приведённых функций, там рисование через cario делается. Я ни в gtk+2, ни в gtk+3 мало что понимаю, просто есть необходимость скомпилировать код. Если сделать замену приведённых функций на конструкции, которые будут делать то же самое в gtk+3, то остальной код скомпилируется.


Нашёл код, где рисование делается с помощью cairo. Компилируется, но рисование не работает (окно пустое выводит). На консоль выводит:
Цитата
(GTK3_0.exe:8176): GLib-GObject-WARNING **: gsignal.c:2459: signal `expose-event' is invalid for instance `02075000'

Компилирую в 10-й студии, ОС windows XP x64 (пробовал в 15-й студии, ОС windows 8 - то же самое). gtk+ подключен из этого пакета: gtk+-bundle_3.6.4-20130921_win32.
В чём может быть причина?

КОД
#include <gtk/gtk.h>
#include <cairo.h>
#include <cairo-pdf.h>
#include <cairo-ps.h>
#include <cairo-svg.h>
#include <math.h>
#include <gdk/gdkkeysyms.h>
#include <string.h>


#define M_PI 3.14
#define WIDTH  800
#define HEIGHT 600
#define STRIDE WIDTH*4
#define MAX_COORDS 1024



/* This path desribes what will be drawn later
   The bulk of it is doing the IBM letters by connect the dots
   at the very end, we will get fancy and add a (R) Registered logo.
*/
static void
travel_path (cairo_t *cr)
{
   gint     pen_radius         = 10;

   cairo_set_source_rgb (cr, 1,1,1);
   cairo_paint (cr);

   cairo_set_line_width (cr, pen_radius*2);

   /* Use IBM Blue Pen Color with no ALPHA */
   cairo_set_source_rgba (cr, .3, .42, .69, 1);


   /* This Draws the IBM 8 Lines "I" Logo */
   cairo_move_to (cr, 10, 10);
   cairo_line_to (cr, 160, 10);

   cairo_move_to (cr, 10, 40);
   cairo_line_to (cr, 160, 40);

   /* NOTE: Narrower Middle: 1/3 width */
   cairo_move_to (cr, 60, 70);
   cairo_line_to (cr, 110, 70);

   cairo_move_to (cr, 60, 100);
   cairo_line_to (cr, 110, 100);

   cairo_move_to (cr, 60, 130);
   cairo_line_to (cr, 110, 130);

   cairo_move_to (cr, 60, 160);
   cairo_line_to (cr, 110, 160);
   /* END Narrower Middle */

   cairo_move_to (cr, 10, 190);
   cairo_line_to (cr, 160, 190);

   cairo_move_to (cr, 10, 220);
   cairo_line_to (cr, 160, 220);
   /* END "I" DRAWING */




   /* This Draws the IBM 8 Lines "B" Logo */
   cairo_move_to (cr, 170, 10);
   cairo_line_to (cr, 340, 10);

   cairo_move_to (cr, 170, 40);
   cairo_line_to (cr, 360, 40);

   cairo_move_to (cr, 200, 70);
   cairo_line_to (cr, 250, 70);
   /*B's have holes in them! */
   cairo_move_to (cr, 300, 70);
   cairo_line_to (cr, 360, 70);


   cairo_move_to (cr, 210, 100);
   cairo_line_to (cr, 350, 100);


   cairo_move_to (cr, 210, 130);
   cairo_line_to (cr, 350, 130);


   cairo_move_to (cr, 200, 160);
   cairo_line_to (cr, 250, 160);
   /*B's have holes in them! */
   cairo_move_to (cr, 300, 160);
   cairo_line_to (cr, 360, 160);


   cairo_move_to (cr, 170, 190);
   cairo_line_to (cr, 360, 190);


   cairo_move_to (cr, 170, 220);
   cairo_line_to (cr, 340, 220);
   /* END "B" DRAWING */
    



   /* THE EVER POINTY "M"  */
   cairo_move_to (cr, 370, 10);
   cairo_line_to (cr, 470, 10);
   cairo_move_to (cr, 560, 10);
   cairo_line_to (cr, 660, 10);


   cairo_move_to (cr, 370, 40);
   cairo_line_to (cr, 490, 40);
   cairo_move_to (cr, 540, 40);
   cairo_line_to (cr, 660, 40);


   cairo_move_to (cr, 400, 70);
   cairo_line_to (cr, 510, 70);
   cairo_move_to (cr, 520, 70);
   cairo_line_to (cr, 630, 70);


   cairo_move_to (cr, 400, 100);
   cairo_line_to (cr, 630, 100);


   cairo_move_to (cr, 400, 130);
   cairo_line_to (cr, 470, 130);
   cairo_move_to (cr, 480, 130);
   cairo_line_to (cr, 550, 130);
   cairo_move_to (cr, 560, 130);
   cairo_line_to (cr, 630, 130);


   cairo_move_to (cr, 400, 160);
   cairo_line_to (cr, 470, 160);
   cairo_move_to (cr, 490, 160);
   cairo_line_to (cr, 540, 160);
   cairo_move_to (cr, 560, 160);
   cairo_line_to (cr, 630, 160);


   cairo_move_to (cr, 370, 190);
   cairo_line_to (cr, 470, 190);
   cairo_move_to (cr, 500, 190);
   cairo_line_to (cr, 530, 190);
   cairo_move_to (cr, 560, 190);
   cairo_line_to (cr, 660, 190);


   cairo_move_to (cr, 370, 220);
   cairo_line_to (cr, 470, 220);
   cairo_move_to (cr, 510, 220);
   cairo_line_to (cr, 520, 220);
   cairo_move_to (cr, 560, 220);
   cairo_line_to (cr, 660, 220);

   /* END POINTY LETTERS */
  
   /* We stroke the path so we see everything we just specified
      by connecting the dots
   */
   cairo_stroke(cr);




   /* Let us add a disclaimer and show some fancy cairo: */
   /* We are going to want a nice fine lined circle around the R
   you need to make sure you have stroked existing things
   that you wanted drawn with the larger pen before continuing.
   */
   cairo_set_line_width (cr, pen_radius*.5);

   /* Now we will draw the fancy circle around the "R" */
   /* NOTE: The angles are in radians */
   cairo_move_to (cr, 710, 200);
   double angle1 = 0 * (M_PI/180.0);  
   double angle2 = 360 * (M_PI/180.0);

   /* We draw a large black circle */
   cairo_set_source_rgba (cr, 0, 0, 0, 1);
   cairo_arc (cr, 710, 200, 20, angle1, angle2);
   cairo_stroke (cr);

   /* We draw a smaller white circle centered on it */
   cairo_set_source_rgba (cr, 1, 1, 1, 1);
   cairo_arc (cr, 710, 200, 20, angle1, angle2);
   /* We use the fill operator to fill in the circle! */
   cairo_fill (cr);

   /* We are going to draw the letter "R" with black pen*/

   cairo_move_to (cr, 695,212); /* Bottom left of text at point */
   cairo_set_source_rgba (cr, 0, 0, 0, 1);
   cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
                                       CAIRO_FONT_WEIGHT_BOLD);
   cairo_set_font_size (cr, 40);
   cairo_show_text (cr, "R");

    /* We stroke everything we have just done
       to actually draw it...
    */
    cairo_stroke (cr);    

}

/* Apply our path to the surface specified */
static void
draw (cairo_surface_t *surface)
{
    cairo_t *cr;
    cr = cairo_create (surface);

    /* Try applying the scale and rotate factors here to examine their effects on the output!*/
    /* cairo_rotate (cr, -M_PI / 4); */
    /* cairo_scale (cr, 2, 1.0);  */

    travel_path (cr);
    cairo_destroy (cr);
}

/* Function needed to draw to gtk window */
static void
draw_gtk (GtkWidget      *widget,
          GdkEventExpose *eev,
          gpointer        data)
{
  cairo_t *cr;
  cr = gdk_cairo_create (gtk_widget_get_window(widget));
  travel_path (cr);
  cairo_destroy (cr);
}


/* We will draw our path on multiple surfaces to demonstrate
   some of the various cairo backend
*/
int main (gint    argc, gchar **argv)
{
    cairo_surface_t *surface;

    /* PDF Backend */
    surface = cairo_pdf_surface_create ("IBM.pdf",
                    WIDTH, HEIGHT);
    draw (surface);
    cairo_surface_destroy (surface);


    /* Postscript Backend */
    surface = cairo_ps_surface_create ("IBM.ps",
                    WIDTH, HEIGHT);
    draw (surface);
    cairo_surface_destroy (surface);


    /* Image backend */
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                      WIDTH, HEIGHT);
    draw (surface);
    cairo_surface_write_to_png (surface, "IBM.png");
    cairo_surface_destroy (surface);


    /* Scalable Vector Graphics Backend */
    surface = cairo_svg_surface_create ("IBM.svg",
                    WIDTH, HEIGHT);
    draw (surface);
    cairo_surface_destroy (surface);


    /* GTK Window using Cairo */
    gtk_init (NULL, NULL);        /* Fire up GTK!       */
    GtkWidget *mainwin;           /* Make a new windows */
    GtkWidget *canvas = NULL;     /* Make a new canvas  */
  
    mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    canvas = gtk_drawing_area_new ();
    gtk_widget_set_size_request (canvas, WIDTH, HEIGHT);    

    gtk_container_add (GTK_CONTAINER (mainwin), canvas); /* Place the canvas in the window */

    g_signal_connect (mainwin, "destroy", G_CALLBACK (gtk_main_quit), NULL); /* Quit graphically */

    /* Instead of drawing like usual, we connect the expose event to do the drawing! */
    g_signal_connect (G_OBJECT (canvas), "expose-event",
                      G_CALLBACK (draw_gtk), NULL);
  
    gtk_widget_show_all (mainwin); /* Show the window on the screen */
    gtk_main ();
    return 0;
}

Автор: Iron Bug 23.12.2015, 21:33

не вставляйте в посты портянки по полкилометра, кладите файлы на какой-нибудь pastebin и прикладывайте ссылку.

Автор: lss 24.12.2015, 18:52

Цитата(Iron Bug @ 23.12.2015, 21:33) *
не вставляйте в посты портянки по полкилометра, кладите файлы на какой-нибудь pastebin и прикладывайте ссылку.

С кодом подсказали: нужно вместо "expose-event" (в g_signal_connect()) писать "draw".
https://developer.gnome.org/gtk3/stable/ch25s02.html#id1574386
Там написано, что
“expose-event” signal has been replaced by a new “draw” signal, which takes a cairo_t instead of an expose event.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)