The OpenNET Project
 
Поиск (ключи):  ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
ССЫЛКИ НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

GTK+ 2.0 Tutorial

<<< Previous

Adjustments

Next >>>


Внутреннее устройство регуляторов

Хорошо поняв вышесказанное, возникает вопрос: как можно создать собственный обработчик сигнала для перехвата сигналов регулирования, при использовании регуляторов пользователем, и как устанавливать значение диапазона регулировок в таких обработчиках?

Чтобы ответить на этот вопрос и последующие, для начала рассмотрим структуру struct _GtkAdjustment:

struct _GtkAdjustment
{
  GtkObject parent_instance;
  
  gdouble lower;
  gdouble upper;
  gdouble value;
  gdouble step_increment;
  gdouble page_increment;
  gdouble page_size;
};

(real C programmer), вы можете использовать другой способ доступа к изменению значений регулирования:

gdouble gtk_adjustment_get_value( GtkAdjustment *adjustment);

Когда вы установите значения регулировок, вы захотите чтобы все виджеты использовали эти значения как основные, GTK позволяет  сделать это с помощью функции, например:

void gtk_adjustment_set_value( GtkAdjustment *adjustment,
                               gdouble       value );

Как упоминалось ранее, Регуляторы это подкласс объектов как и все виджеты, поэтому они могут производить сигналы. Обновления случаются автоматически, когда вы совместно используете объект настройки между scrollbar и другим регулировочным виджетом; все регулировочные виджеты подключают обработчики сигнала с сигналом value_changed для их настройки. Вот - определение этого сигнала в struct _GtkAdjustmentClass:

  void (* value_changed) (GtkAdjustment *adjustment);

Различные виджеты использующие объекты регулирования, создают этот сигнал каждый раз, когда происходит изменение значения регулятора. Это происходит и тогда, когда пользователь изменяет положение регулятора, и когда программа явно изменяет значение используя gtk_adjustment_set_value(). Так например при использовании регулятора масштаба изображения, нужно чтобы вид изображения менялся всякий раз когда меняется значение регулятора, для этого создаётся обратный вызов:

void cb_rotate_picture (GtkAdjustment *adj, GtkWidget *picture)
{
  set_picture_rotation (picture, gtk_adjustment_get_value (adj));
...

и подключается регулятор масштаба:

g_signal_connect (G_OBJECT (adj), "value_changed",
                  G_CALLBACK (cb_rotate_picture), (gpointer) picture);

А что если пользователь добавит информацию в виджет, тем самым расширит область регулировки? В этом случае производится изменённый сигнал:

  void (* changed) (GtkAdjustment *adjustment);

Обычно виджеты регулировки диапазона подключают к этому сигналу обработчик, который изменяет их внешний вид - например размер ползунка в полосе прокрутки уменьшается пропорционально увеличению области прокручивания.

Вам наверное никогда не понадобится к этому сигналу подключать обработчик, за исключением случаев создания новых типов виджетов диапазона. Однако, если вы непосредственно изменяете значения регулировок, вам потребуется создавать этот сигнал для перенастройки любого виджета примерно так:

g_signal_emit_by_name (G_OBJECT (adjustment), "changed");

<<< Previous

Home

Next >>>

Using Adjustments the Easy Way

Up

Range Widgets




Подпишись на Linux Format и получи один из 3 ценных призов!

Началась подписка на журнал Linux Format на 2010 год. Спешите оформить подписку на единственный в России ежемесячный журнал о Linux!

Все, оформившие подписку на печатную версию журнала, получают диск с архивом журнала Linux Format за 2005-2009г. в подарок. Также в подарок вы получаете именную электронную версию в формате PDF. Теперь вы можете приступить к чтению журнала сразу в момент выхода свежего номера, не дожидаясь, пока вам доставят бумажную версию.

Кроме того, все, оформившие подписку на первую половину или весь 2010 год в интернет-магазине ГНУ/Линуксцентра, автоматически становятся участниками розыгрыша ценных призов:


  Закладки на сайте
  Проследить за страницей
Created 1996-2010 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList