crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перевести код под gtk+3.6.4
lss
  опции профиля:
сообщение 22.12.2015, 18:11
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 9.3.2014
Пользователь №: 4074

Спасибо сказали: 0 раз(а)




Репутация:   0  


Уважаемые, помогите перевести следующий код, чтобы работал с 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
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

навскидку - не видно, где создаётся память для widget. А на инициализацию переменных вообще тут поклали
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 23.12.2015, 9:52
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


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

Судя по коду, лабу! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lss
  опции профиля:
сообщение 23.12.2015, 16:23
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 9.3.2014
Пользователь №: 4074

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей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;
}


Сообщение отредактировал ViGOur - 23.12.2015, 17:41
Причина редактирования: Длиный код обрамляем в ТЕГ expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 23.12.2015, 21:33
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


не вставляйте в посты портянки по полкилометра, кладите файлы на какой-нибудь pastebin и прикладывайте ссылку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lss
  опции профиля:
сообщение 24.12.2015, 18:52
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 9.3.2014
Пользователь №: 4074

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 10:42