IPB

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

 
Ответить в эту темуОткрыть новую тему
> GTK+ Си
Поделиться
kostyalamer
сообщение 30.8.2014, 16:54
Сообщение #1


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

Группа: Пользователь
Сообщений: 4384
Регистрация: 17.9.2009
Вставить ник
Цитата
Пользователь №: 1617
Страна: Россия
Город: Санкт-Петербург
Пол: Муж.



Репутация: 20


Предлагаю, выкладывать в этой теме примеры простейших программ и разную полезную информацию по GTK+.
Правда только если это будет кому-либо интересно на нашем форуме, например тема с Arduino у нас здесь заглохла .
Поскольку плодить мертвые темы глупо, пишите если есть интерес, если интереса ни у кого не будет , тему просто удалим.
PS А вообще у нас как-то тихо, что на Линуксе для всех , что здесь wink.gif

Сообщение отредактировал kostyalamer - 30.8.2014, 17:03
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ИВК
сообщение 30.8.2014, 20:52
Сообщение #2


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

Группа: Глоб. Модератор
Сообщений: 9985
Регистрация: 22.6.2009
Вставить ник
Цитата
Из: Онега
Пользователь №: 1352
Страна: Россия
Город: Не указан
Пол: Муж.



Репутация: 30


Так выкладывай что есть, а там видно будет smile.gif
А лично мне Qt достаточно. GTK+ - для меня уже излишество mellow.gif
А то, что тихо на форуме... это уже глубокий кризис, и у меня прямо сейчас нет идей насчёт оживления.


--------------------
Не пью, не курю, не смотрю телевизор, не пользуюсь Windows
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
kostyalamer
сообщение 30.8.2014, 21:57
Сообщение #3


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

Группа: Пользователь
Сообщений: 4384
Регистрация: 17.9.2009
Вставить ник
Цитата
Пользователь №: 1617
Страна: Россия
Город: Санкт-Петербург
Пол: Муж.



Репутация: 20


Цитата(IVK @ 30.8.2014, 20:52) *
Так выкладывай что есть, а там видно будет smile.gif

Ну ладно , полезные ссылки:
http://habrahabr.ru/post/135809/ - для начала
http://wiki.linuxformat.ru/wiki/LXF86:GTK%2B
http://docstore.mik.ua/manuals/ru/gtk_plus/book1.html
http://www.opennet.ru/docs/RUS/gtk_plus/

Для того что бы скомпилировать программу в altlinux на связке си и gtk+ надо дать команду :
gcc -Wall -o имя_проги.c имя_проги `pkg-config --cflags --libs gtk+-2.0`
ввиду хронической лени я забил в настройки Geany ( Сборка / Команды сборки ) :
для компиляции : gcc -Wall -c "%f" `pkg-config --cflags --libs gtk+-2.0`
для сборки : gcc -Wall -o "%e" "%f" `pkg-config --cflags --libs gtk+-2.0`
и теперь обхожусь мышкокликаньем.
В следующих постах подкину несколько простых шаблонов на основе которых достаточно бычтро можно написать
свои программы вот простенький примерчик :

Код
# include <gtk/gtk.h>   /* Подключаем библиотеку GTK+ */
# include <stdio.h>

static int count = 0;
int winx = 200;
int winy = 200;

void button_clicked(GtkWidget *button, gpointer data) // Обработчик нажатия кнопок
{
    
    printf("%s pressed %d time(s) \n", (char *) data,  ++count);

}

int main( int argc, char *argv[] )
{
   //GtkWidget *button;                                          // Кнопка
   GtkWidget *button1;                                          // Кнопка1
   GtkWidget *button2;                                          // Кнопка2
   GtkWidget *button3;                                          // Кнопка3
   GtkWidget *button4;                                          // Кнопка3
   GtkWidget *window;                                         // Главное окно
   GtkWidget *fixed;
   gtk_init( &argc, &argv );                                                                 // Инициализируем GTK+
   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );            // Создаем главное окно
   gtk_window_set_title( GTK_WINDOW( window ),"Тест кнопок gtk");
   gtk_window_set_default_size(GTK_WINDOW(window), winx, winy);
   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
   fixed = gtk_fixed_new();
   gtk_container_add(GTK_CONTAINER(window), fixed);
  
   button1= gtk_button_new_with_label ("Кнопка 1");
   gtk_fixed_put(GTK_FIXED(fixed), button1, 0, 0);
   gtk_widget_set_size_request(button1, winx, 50);
   g_signal_connect( G_OBJECT( button1 ), "clicked",GTK_SIGNAL_FUNC(button_clicked), "Button 1");

   button2= gtk_button_new_with_label ("Кнопка 2");
   gtk_fixed_put(GTK_FIXED(fixed), button2, 0, 50);
   gtk_widget_set_size_request(button2, winx, 50);
   g_signal_connect( G_OBJECT( button2 ), "clicked",GTK_SIGNAL_FUNC(button_clicked), "Button 2");
  
   button3= gtk_button_new_with_label ("Кнопка 3");
   gtk_fixed_put(GTK_FIXED(fixed), button3, 0, 100);
   gtk_widget_set_size_request(button3, winx, 50);
   g_signal_connect( G_OBJECT( button3 ), "clicked",GTK_SIGNAL_FUNC(button_clicked), "Button 3");
  
   button4= gtk_button_new_with_label ("Выход");
   gtk_fixed_put(GTK_FIXED(fixed), button4, 0, 150);
   gtk_widget_set_size_request(button4, winx, 50);
   g_signal_connect( G_OBJECT( button4 ), "clicked",GTK_SIGNAL_FUNC(gtk_main_quit), "Button 4"); // Выход по нажатию кнопки
  
   g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);   // Выход по кресту на рамке
  
   gtk_widget_show_all(window);
   gtk_main();                  
return 0;
}

а вот как этот шаблон выглядит :
Прикрепленный файл  shablon01.png ( 9.55 килобайт ) Кол-во скачиваний: 2

PS во всех шаблонах код мой только частично , все остальное взято из интернета wink.gif
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
kostyalamer
сообщение 31.8.2014, 23:13
Сообщение #4


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

Группа: Пользователь
Сообщений: 4384
Регистрация: 17.9.2009
Вставить ник
Цитата
Пользователь №: 1617
Страна: Россия
Город: Санкт-Петербург
Пол: Муж.



Репутация: 20


Еще один шаблончик на ту же тему, на мой взгляд будет симпатичней, к тому же окошко тянется вместе с кнопками :

Код
#include <gtk/gtk.h>
int winx = 200;
int winy = 200;
int zazor =5;
/* Новый обратный вызов. Данные переданные этой функции
                                         выводятся на stdout */
void callback( GtkWidget *widget,
                 gpointer   data )
{
    g_print ("Hello again - %s was pressed\n", (gchar *) data);
}
/* другой обратный вызов */
gint delete_event( GtkWidget *widget,
                      GdkEvent  *event,
                      gpointer   data )
{
    gtk_main_quit ();
    return FALSE;
}
int main( int   argc,
           char *argv[] )
{
    /* Тип указателей на виджеты - GtkWidget */
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box1;
    /* Этот вызов присутствует во всех программах GTK.
        Разбираются аргументы командной строки и возвращаются программе */
    gtk_init (&argc, &argv);
    /* Создаём основное окно программы */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    /* Новый вызов который устанавливает заголовок
     *          окна  */
    gtk_window_set_title (GTK_WINDOW (window), "Тест кнопок gtk2 ");
    gtk_window_set_default_size(GTK_WINDOW(window), winx, winy);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    /* Определяем обработчика сигналов delete_event
     * для выхода из GTK. */
    g_signal_connect (G_OBJECT (window), "delete_event",
                         G_CALLBACK (delete_event), NULL);
    /* Устанавливаем ширину окантовки окна программы */
    gtk_container_set_border_width (GTK_CONTAINER (window), zazor*2);
    /* Создаём контейнер для упаковки виджетов.
        Реально контейнер не отображается, он используется как
        инструмент для размещения виджетов */
    box1 = gtk_vbox_new (FALSE, zazor);
    /* Помещаем контейнер в основное окно. */
    gtk_container_add (GTK_CONTAINER (window), box1);

    /* Создаём кнопку с надписью "Button 1". */
    button = gtk_button_new_with_label ("Кнопка 1");
    /* Размещаем кнопку "button 1" в качестве аргумента для функции обратного вызова,
        для того, чтобы вызывать эту функцию при нажатии на кнопку.*/
    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (callback), (gpointer) "button 1");
    /* Вместо gtk_container_add, мы упаковываем кнопку
     * в невидимый контейнер который был помещен в основное окно. */
    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
    /* Обязательное действие для отображения сформированной кнопки */
    //gtk_widget_show (button);
    
    /* Повторяем теже самые действия для создания второй кнопки */
    button = gtk_button_new_with_label ("Кнопка 2");
    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (callback), (gpointer) "button 2");
    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);

    /* Повторяем теже самые действия для создания третьей кнопки */
    button = gtk_button_new_with_label ("Кнопка 3");
    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "button 3");
    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);
    
    /* Повторяем теже самые действия для создания кнопки выход*/
    button = gtk_button_new_with_label ("Выход");
    g_signal_connect( G_OBJECT( button), "clicked",GTK_SIGNAL_FUNC(gtk_main_quit), "button 4"); // Выход по нажатию кнопки
    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);
    

    gtk_widget_show_all(window);
    /* Входим в gtk_main и ждем событий X сервера для начала выполнения действий! */
    gtk_main ();
    return 0;
}

Выглядит эта радость так :
Прикрепленный файл  shablon02.png ( 8.53 килобайт ) Кол-во скачиваний: 2


в качестве основы взят пример : http://www.opennet.ru/docs/RUS/gtk_plus/x363.html переделанный под вертикальный контейнер.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
kostyalamer
сообщение 7.9.2014, 21:07
Сообщение #5


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

Группа: Пользователь
Сообщений: 4384
Регистрация: 17.9.2009
Вставить ник
Цитата
Пользователь №: 1617
Страна: Россия
Город: Санкт-Петербург
Пол: Муж.



Репутация: 20


Шаблон для программ с менюшками , по мотивам : http://welinux.ru/post/1754/
Код
#include <gtk/gtk.h>

int main( int argc, char *argv[])
{

  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *menubar;
  GtkWidget *menu1;
  GtkWidget *m1;
  GtkWidget *menu2;
  GtkWidget *m2;
  GtkWidget *menu3;
  GtkWidget *m3;
  GtkWidget *quit;
  GtkWidget *m11,*m21, *m31, *m12,*m22,*m32;
  
  void menu_clicked(GtkWidget *m11, gpointer data) // Обработчик выбора пунктов меню
{
    printf("Выбран пункт %s  \n", (char *) data);

}

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
  gtk_window_set_title(GTK_WINDOW(window), "menu");

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  menubar = gtk_menu_bar_new();
  menu1= gtk_menu_new();

  m1= gtk_menu_item_new_with_label("Меню_1");
  m11 = gtk_menu_item_new_with_label("Меню1.1");
  m12 = gtk_menu_item_new_with_label("Меню1.2");
  quit = gtk_menu_item_new_with_label("Выход");
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(m1), menu1);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu1), m11);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu1), m12);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu1), quit);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), m1);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);
  
  menu2 = gtk_menu_new();

  m2 = gtk_menu_item_new_with_label("Меню_2");
  m21 = gtk_menu_item_new_with_label("Меню_2.1");
  m22 = gtk_menu_item_new_with_label("Меню_2.2");
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(m2), menu2);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu2), m21);
   gtk_menu_shell_append(GTK_MENU_SHELL(menu2), m22);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), m2);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);  
  
   menu3 = gtk_menu_new();

  m3 = gtk_menu_item_new_with_label("Меню_3");
  m31 = gtk_menu_item_new_with_label("Меню_3.1");
  m32 = gtk_menu_item_new_with_label("Меню_3.2");

  gtk_menu_item_set_submenu(GTK_MENU_ITEM(m3), menu3);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu3), m31);
  gtk_menu_shell_append(GTK_MENU_SHELL(menu3), m32);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), m3);
  
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);  

  g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);


  g_signal_connect( G_OBJECT( m11 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню1.1");
  g_signal_connect( G_OBJECT( m12 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню1.2");
  g_signal_connect( G_OBJECT( m21 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню2.1");
  g_signal_connect( G_OBJECT( m22 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню2.2");
  g_signal_connect( G_OBJECT( m31 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню3.1");
  g_signal_connect( G_OBJECT( m32 ), "activate",GTK_SIGNAL_FUNC(menu_clicked), "Меню3.2");
  g_signal_connect(G_OBJECT(quit), "activate",G_CALLBACK(gtk_main_quit), NULL);
  
  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}


Выглядит вот так:
Прикрепленный файл  shablon03.png ( 12.27 килобайт ) Кол-во скачиваний: 3


PS на этом шаблоне я и закончу, все что нужно для написания простейших приложений на си и gtk здесь есть, а писать в пустоту не интересно wink.gif Будут вопросы, отвечу в теме.
PPS Клубу явно не хватает кодеров
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
( Гостей: 1 )
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28.3.2024, 13:07