Добавить в корзинуПозвонить
Найти в Дзене

Работа с буфером обмена в GTK+

Буфер обмена (clipboard)- это часть памяти, в которой хранится то, что мы копируем. Рассмотрим как работать с буфером обмена в GTK+.В GTK+ уже есть встроенный виджет для работы с буфером обмена: GtkClipboard *clipboard; Для работы с этим виджетом существуют десятки функций, но мы разберем простейший случай: у нас есть виджет для однострочного ввода текста (GtkEntry) и нам нужно выполнить три простых функции: Напишем простую программу: В этой программе мы используем текстовый виджет (text), три кнопки для работы с буфером обмена (bcopy, bcut, bpaste) и кнопку выхода (bquit). Все эти виджеты разместим в вертикальном контейнере vbox. Основные действия для работы с буфером обмена следующие: В этой программе для украшения на кнопках добавлены стандартные иконки GTK+ bcopy = gtk_button_new_from_stock (GTK_STOCK_COPY); Полный список стандартных иконок можно посмотреть здесь. Текст программы: # include <gtk/gtk.h> GtkWidget *win, *vbox, *bcopy, *bcut, *bpaste, *bquit; GtkEntry *text; GtkClipb

Буфер обмена (clipboard)- это часть памяти, в которой хранится то, что мы копируем. Рассмотрим как работать с буфером обмена в GTK+.В GTK+ уже есть встроенный виджет для работы с буфером обмена:

GtkClipboard *clipboard;

Для работы с этим виджетом существуют десятки функций, но мы разберем простейший случай: у нас есть виджет для однострочного ввода текста (GtkEntry) и нам нужно выполнить три простых функции:

  • Вырезать,
  • Копировать,
  • Вставить.

Напишем простую программу:

В этой программе мы используем текстовый виджет (text), три кнопки для работы с буфером обмена (bcopy, bcut, bpaste) и кнопку выхода (bquit). Все эти виджеты разместим в вертикальном контейнере vbox.

Основные действия для работы с буфером обмена следующие:

  • Создать виджет для буфера обмена: GtkClipboard *clipboard;
  • Связать виджет с системным буфером обмена: clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
  • Связать нажатие кнопки с вызовом соотвествующей функции. Например, для копирования текстового виджета в буфер обмена используется функция gtk_editable_copy_clipboard(text);

В этой программе для украшения на кнопках добавлены стандартные иконки GTK+

bcopy = gtk_button_new_from_stock (GTK_STOCK_COPY);

Полный список стандартных иконок можно посмотреть здесь.

Текст программы:

# include <gtk/gtk.h>

GtkWidget *win, *vbox, *bcopy, *bcut, *bpaste, *bquit;

GtkEntry *text;

GtkClipboard *clipboard;

void ClipCopy()

{

gtk_editable_copy_clipboard(text);

}

void ClipCut()

{

gtk_editable_cut_clipboard(text);

}

void ClipPaste()

{

gtk_editable_paste_clipboard(text);

}

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

{

gtk_init (&argc, &argv);

/* Создаем основное окно */

win = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_container_set_border_width (GTK_CONTAINER (win), 8);

gtk_window_set_title (GTK_WINDOW (win), "Clipboard");

gtk_window_set_default_size (GTK_WINDOW (win), 300, 300);

gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);

gtk_widget_realize (win);

g_signal_connect (win, "destroy", gtk_main_quit, NULL);

/* Создаем вертикальный контейнер */

vbox = gtk_vbox_new (TRUE, 6);

gtk_container_add (GTK_CONTAINER (win), vbox);

// Поле ввода

text = gtk_entry_new ();

gtk_entry_set_max_length (GTK_ENTRY (text), 50);

gtk_entry_set_text (GTK_ENTRY (text), "Hello!");

gtk_box_pack_start (GTK_BOX (vbox), text, TRUE, TRUE, 0);

// Кнопка "Копировать"

bcopy = gtk_button_new_from_stock (GTK_STOCK_COPY);

g_signal_connect (bcopy, "clicked", G_CALLBACK (ClipCopy), NULL);

gtk_box_pack_start (GTK_BOX (vbox), bcopy, TRUE, TRUE, 0);

// Кнопка "Вырезать"

bcut = gtk_button_new_from_stock (GTK_STOCK_CUT);

g_signal_connect (bcut, "clicked", G_CALLBACK (ClipCut), (gpointer) win);

gtk_box_pack_start (GTK_BOX (vbox), bcut, TRUE, TRUE, 0);

// Кнопка "Вставить"

bpaste = gtk_button_new_from_stock (GTK_STOCK_PASTE);

g_signal_connect (bpaste, "clicked", G_CALLBACK (ClipPaste), (gpointer) win);

gtk_box_pack_start (GTK_BOX (vbox), bpaste, TRUE, TRUE, 0);

// Кнопка "Выход"

bquit = gtk_button_new_from_stock (GTK_STOCK_CLOSE);

g_signal_connect (bquit, "clicked", gtk_main_quit, NULL);

gtk_box_pack_start (GTK_BOX (vbox), bquit, TRUE, TRUE, 0);

clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);

// Отображаем все виджеты и запускаем основной цикл

gtk_widget_show_all(win);

gtk_main();

return 0;

}

С другими виджетами общая схема работы остается такой же. Например, для виджета GtkText нужно использовать следующие функции:

  • gtk_text_buffer_copy_clipboard
  • gtk_text_buffer_cut_clipboard
  • gtk_text_buffer_paste_clipboard

Можно ли стать программистом за год с нуля?
Читайте в моей бесплатной мини-книге «Путь в программисты». Скачать её можно здесь.