Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перевести код под gtk+3.6.4
Форум на CrossPlatform.RU > Библиотеки > GTK+
lss
Уважаемые, помогите перевести следующий код, чтобы работал с 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
а что именно не работает ?

навскидку - не видно, где создаётся память для widget. А на инициализацию переменных вообще тут поклали
ViGOur
Ну да, ни инициализации, ни выделения памяти, ничего!
Ты лучше скажи, что нужно сделать?

Судя по коду, лабу! :)
lss
Цитата(Алексей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
не вставляйте в посты портянки по полкилометра, кладите файлы на какой-нибудь pastebin и прикладывайте ссылку.
lss
Цитата(Iron Bug @ 23.12.2015, 21:33) *
не вставляйте в посты портянки по полкилометра, кладите файлы на какой-нибудь pastebin и прикладывайте ссылку.

С кодом подсказали: нужно вместо "expose-event" (в g_signal_connect()) писать "draw".
https://developer.gnome.org/gtk3/stable/ch2....html#id1574386
Там написано, что
“expose-event” signal has been replaced by a new “draw” signal, which takes a cairo_t instead of an expose event.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.