![]() |
![]() |
![]() |
![]() |
Эта глава охватывает следующие темы:
Эта глава описывает общие виджеты суперклассы. Используйте эту информацию, чтобы определить, делает ли метод суперкласса то, в чем нуждается ваш виджет. С этим знанием Вы можете решить, занять ли метод (наследование отмены), добавить метод к цепочке, или использовать функции PtSuperClass*.
![]() |
Важно прочитать спецификации каждого из суперклассов вашего виджета перед использованием любой из функций PtSuperClass*(). |
Суперкласс PtWidget обеспечивает фундаментальные функциональные возможности всех виджетов Фотона.
PtWidget
Pt_RECTANGULAR
PtWidget определяет методы класса, описанные ниже.
Нет.
Нет.
Вычисляет размерности виджета не учитывая границы или поля. Размерности рассчитываются основываясь на позиции (Pt_ARG_POS) и измерениях (Pt_ARG_DIM) виджета. Для непересекающихся виджетов (например виджеты PtWindow), позиция равна (0, 0).
Определяет, нуждается ли виджет в области, и если так, какие события области должны быть непрозрачными и/или чувствительными.
Если виджет определяет растровый курсор, он установлен как данные области. Если виджет уже имеет область, то она модифицирована с непрозрачными/чувствительными данными и данными области. Это делается через PhRegionChange().
Если виджет не имеет области, но требует ее, она создается через PhRegionOpen().
Наконец, если виджет не окно, любые обратные вызовы горячих клавиш, присоединенные к виджету, регистрируются с самым близким непересекающимся родителем (класс PtWindow). Это делается через PtSetResources().
Нет.
Если виджет имеет область, то она закрывается. Все потомки (члены widget->rid) установлены в 0. Если виджет не окно, любые присоединенные обратные вызовы горячих клавиш отсоединяются от непересекающегося родителя.
Размерности этого виджета повреждаются родителем. Все дочерние виджеты этого виджета дереализованы. Любой из этих виджетов, имеющих ограничивающего родителя с установленным Pt_SET_CHILD_UNREALIZED_F вызывает эту функцию. Все вункции из цепочки обратных вызовов Pt_CB_UNREALIZED будет вызвана (сверху вниз).
Вызывается, когда образец виджета удаляется. Освобождает widget->widget_data. Любая память, автоматически распределенная ресурсом, выпущена (эта память не должна быть освобождена в методе Разрушения). Любые ресурсы, которые Вы освобождаете, должны устанавливать указатель в NULL, чтобы предотвратить двигатель виджета от освобождения памяти второй раз. Следующие типы ресурсов автоматически распределяют и выпускают память:
Необработанные обратные вызовы поддержываются для Ph_EV_BUT_PRESS, Ph_EV_BUT_RELEASE, Ph_EV_BUT_REPEAT и Ph_EV_KEY событий.
Если в цепочке обратных вызовов Pt_CB_FILTER имеются обратные вызовы, которые имеют маску события, которая соответствует типу текущего события, то эти обратные вызовы вызываются. Если значение, возвращенное обратным вызовом фильтра большее чем 0, это значение возвращается. Если имеются всплывающие подсказки, зарегистрированные с этим виджетом, список всплывающих подсказок проверяется, чтобы определить, должна ли всплывающая подсказка быть включена и/или выключена.
Если событие это событие Ph_EV_KEY, событие дается находящимуся в фокусе дочерниму виджету виджета, если таковой имеется. Если событие не использовано виджетом, обрабатывается цепочка горячих клавиш самого близкого непересекающегося родителя, чтобы видеть, является ли клавиша горячей. Если соответствия горячей клавиши найдено, вызывается обратный вызов горячей клавиши, и событие используется (возврат Pt_END).
Если событие это нажатие, отпускание или повторение кнопки, каждый дочерний виджет, пересекающий событие, находится через PtContainerHit(), пока один из этих виджетов не использует событие.
Когда пересекающийся виджет найден, прямоугольник события переводится относительно левого верхнего угла холста пересекающегося виджета. Как только трансляция выполнена, событие дается пересекающемуся виджету через absorbed = PtEventHandler(). После возврата, прямоугольник события депереводится тем же способом.
Если все следующее истина:
тогда фокус дается этому виджету, и event->processing_flags имеет флаг Ph_DIRECTED_FOCUS установленным. Если PtEventHandler() возвращает Pt_END, событие рассматривается использованным, и возвращается Pt_END.
Дополнительный шаг выполняется, если событие и _Pt_->current равны NULL: регистрируется поглащающий виджет с целью доставить искусственные отпускания соответствующему виджету в более позднее время.
if( widget->rid ) //if the event was not absorbed, take it back. cbinfo->event->collector.rid = widget->rid; if( ( ( absorbed != Pt_CONTINUE ) || ( cbinfo->event->processing_flags & Ph_BACK_EVENT ) ) && wp && cbinfo->event->type == Ph_EV_BUT_PRESS && ( !_Pt_->current || _Pt_->current == wp ) ) { if ( wp->flags & Pt_DESTROYED ) _Pt_->current = (PtWidget_t *)Pt_END; else _Pt_->current = wp; }
Как только событие было использовано или больше нет пересекающихся событий, возвращается Pt_END. Иначе возвращается поглощенный.
static const PtResourceRec_t resources[] = { { Pt_ARG_AREA, Pt_CHANGE_CANVAS, 0, Pt_ARG_IS_STRUCT( PtWidget_t, area )}, { Pt_ARG_BEVEL_WIDTH, Pt_CHANGE_CANVAS_REDRAW, 0, Pt_ARG_IS_NUMBER( PtWidget_t, border_width ) }, { Pt_ARG_CURSOR_TYPE, core_modify_cursor, 0, Pt_ARG_IS_NUMBER( PtWidget_t, cursor_type )}, { Pt_ARG_CURSOR_COLOR, core_modify_cursor, 0, Pt_ARG_IS_NUMBER( PtWidget_t, cursor_color )}, { Pt_ARG_DATA, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_ALLOC( PtWidget_t, data )}, { Pt_ARG_DIM, Pt_CHANGE_CANVAS, 0, Pt_ARG_IS_STRUCT( PtWidget_t, area.size )}, { Pt_ARG_FLAGS, PtModifyFlags, 0, Pt_ARG_IS_FLAGS( PtWidget_t, flags )}, { Pt_ARG_POS, Pt_CHANGE_CANVAS, 0, Pt_ARG_IS_STRUCT( PtWidget_t, area.pos ) }, { Pt_ARG_RESIZE_FLAGS, Pt_CHANGE_RESIZE, 0, Pt_ARG_IS_FLAGS( PtWidget_t, resize_flags )}, { Pt_CB_DESTROYED, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, destroyed )}, { Pt_CB_HOTKEY, core_modify_hotkey_callbacks, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, hotkeys )}, { Pt_CB_RAW_EVENT, core_modify_raw_callbacks, 0, Pt_ARG_IS_LINK( PtWidget_t, callbacks )}, { Pt_CB_REALIZED, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, realized )}, { Pt_CB_UNREALIZED, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, unrealized )}, { Pt_ARG_USER_DATA, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_ALLOC( PtWidget_t, user_data )}, { Pt_ARG_HELP_TOPIC, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_STRING( PtWidget_t, help_topic ) }, { Pt_CB_BLOCKED, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, blocked )}, { Pt_ARG_BITMAP_CURSOR, bitmap_cursor_change, 0, Pt_ARG_IS_ALLOC( PtWidget_t, bitmap_cursor ) }, { Pt_ARG_EFLAGS, PtModifyEFlags, 0, Pt_ARG_IS_FLAGS( PtWidget_t, eflags )}, { Pt_CB_IS_DESTROYED, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, is_destroyed ) }, { Pt_CB_DND, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, dnd ) }, { Pt_ARG_EXTENT, core_modify_extent, 0, Pt_ARG_IS_STRUCT( PtWidget_t, extent ) }, { Pt_CB_OUTBOUND, Pt_CHANGE_INVISIBLE, 0, Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, outbound ) }, { Pt_ARG_WIDTH, Pt_CHANGE_CANVAS, 0, Pt_ARG_IS_NUMBER( PtWidget_t, area.size.w )}, { Pt_ARG_HEIGHT, Pt_CHANGE_CANVAS, 0, Pt_ARG_IS_NUMBER( PtWidget_t, area.size.h )}, { Pt_ARG_MINIMUM_DIM, Pt_CHANGE_RESIZE, 0, Pt_ARG_IS_STRUCT( PtWidget_t, min_dim )}, { Pt_CB_FILTER, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_LINK( PtWidget_t, filter ) }, { Pt_ARG_POINTER, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_POINTER( PtWidget_t, ptr ) }, };
Обеспечивает фундаментальное поведение виджета Фотона и обратные вызовы.
PtWidget --> PtBasic
Виджет PtBasic добавляет три метода уровня класса к фундаментальным функциональным возможностям виджета. Для законченных описаний, смотрите "Методы класса" в главе Анатомия Виджета.
typedef struct Pt_basic_widget_class { PtWidgetClass_t core; void (*got_focus_f)( PtWidget_t *, PhEvent_t * ); void (*lost_focus_f)( PtWidget_t *, PhEvent_t * ); void (*calc_opaque_f)( PtWidget_t * ); } PtBasicWidgetClass_t; #define Pt_SET_GOT_FOCUS_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,got_focus_f)) #define Pt_SET_LOST_FOCUS_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,lost_focus_f)) #define Pt_SET_CALC_OPAQUE_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,calc_opaque_f))
PtBasic определяет методы класса, описанные ниже.
widget->border_width = 1; widget->cursor_color = Ph_CURSOR_DEFAULT_COLOR; widget->resize_flags |= Pt_RESIZE_XY_AS_REQUIRED; widget->eflags = Pt_DAMAGE_ON_FOCUS; basic->border_color = basic->fill_color = Pg_LGREY; basic->flags = Pt_ALL_ETCHES | Pt_ALL_BEVELS | Pt_ALL_OUTLINES | Pt_FLAT_FILL; basic->inline_color = basic->outline_color = PgGrey( 0x4b );
Нет.
Вызывает метод Размерности PtWidget через PtSuperClassExtent(). Затем результирующий размер корректируется, чтобы принять во внимание границы и поля.
Метод размерности вычисляет непрозрачный прямоугольник виджета и определяет, установлен ли флаг Pt_OPAQUE виджета. Непрозрачный прямоугольник, widget->opaque, указывает:
Этот прямоугольник это область, способная к затенению любых виджетов ниже нее. Виджеты, полностью затененные другим виджетом, не рисуются.
Проверяет член структуры calc_opaque_f класса PtBasic. Если не NULL, функция вызывается. Функция calc_opaque_f() ответственна за установку или очистку флага Pt_OPAQUE виджета. Если виджет имеет прямоугольную область, блокирующую что нибудь ниже, флаг Pt_OPAQUE должен быть установлен, и widget->opaque_rect должна идентифицировать эту прямоугольную область. Иначе, флаг Pt_OPAQUE должен быть очищен.
![]() |
Если цвет заполнения виджета Pg_TRANSPARENT или basic->roundness больше чем 0, виджет не должен быть помечен как непрозрачный. |
Наследуется от PtWidget.
Метод Рисования PtBasic рисует прямоугольник, заполненный текущим цветом заполнения. Рамка виджета рисуется, если Pt_HIGHLIGHTED бит флагов виджета установлен, и ширина рамки больше чем 0.
Если Pt_SET бит установлен, рамка выполняется перевернутой (то есть цвет верхней границы используется, чтобы рисовать нижнюю границу и наоборот). Метод Рисования PtBasic также обрабатывает исполнение фокуса.
Нет.
Нет.
Повреждает виджеты, имеющие флаги Pt_FOCUS_RENDER и Pt_DAMAGE_ON_FOCUS установленными. Подсвечивает и вызывает список обратных вызовов basic->arm (Pt_CB_ARM), если этот виджет имеет флаг Pt_AUTOHIGHLIGHT установленным. Вызывает список обратных вызовов basic->got_focus (Pt_CB_GOT_FOCUS) используя PtInvokeCallbackList().
Повреждает виджеты, имеющие флаги Pt_FOCUS_RENDER и Pt_DAMAGE_ON_FOCUS установленными. Подвысвечивает и вызывает список обратных вызовов basic->disarm (Pt_CB_DISARM), если этот виджет имеет флаг Pt_AUTOHIGHLIGHT установленным. Вызывает список обратных вызовов basic->got_focus (Pt_CB_LOST_FOCUS) через PtInvokeCallbackList().
Устанавливает или очищает флаг Pt_OPAQUE виджета (ресурс Pt_ARG_FLAGS) основываясь на цвете заполнения виджета, округлости и текущем значении флага Pt_RECTANGULAR в структуре класса виджета.
PtBasic чувствителен к следующим событиям:
Необработанные обратные вызовы возвращают Pt_CONTINUE, чтобы позволить продолжение цепочки.
![]() |
Если ваш класс виджета определяет Pt_SET_RAW_CALLBACKS, запомните это: если ваш необработанный обратный вызов чувствителен к одному из событий, перечисленных выше, и обратный вызов возвращает Pt_END или Pt_HALT, поведение PtBasic для этого события не будет происходить, если Вы не вызовите необработанные обработчики PtBasic'а внутри обратного вызова до возвращения. Это может быть сделано через PtSuperClassRawEvent(). |
static const PtResourceRec_t resources[] = { { Pt_ARG_FLAGS, basic_modify_flags, NULL, Pt_ARG_IS_FLAGS( PtWidget_t, flags ) }, { Pt_ARG_INLINE_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, inline_color ) }, { Pt_ARG_COLOR, Pt_CHANGE_REDRAW, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, color ) }, { Pt_ARG_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, fill_color ) }, { Pt_ARG_FILL_PATTERN, Pt_CHANGE_REDRAW, NULL, Pt_ARG_IS_STRUCT( PtBasicWidget_t, fill_pattern ) }, { Pt_ARG_MARGIN_HEIGHT, Pt_CHANGE_CANVAS, NULL, Pt_ARG_IS_NUMBER( PtBasicWidget_t, margin_height ) }, { Pt_ARG_MARGIN_WIDTH, Pt_CHANGE_CANVAS, NULL, Pt_ARG_IS_NUMBER( PtBasicWidget_t, margin_width ) }, { Pt_ARG_OUTLINE_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, outline_color ) }, { Pt_CB_ARM, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, arm ) }, { Pt_CB_DISARM, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, disarm ) }, { Pt_CB_ACTIVATE, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, activate ) }, { Pt_CB_GOT_FOCUS, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, got_focus ) }, { Pt_CB_LOST_FOCUS, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, lost_focus ) }, { Pt_CB_REPEAT, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, repeat ) }, { Pt_ARG_TRANS_PATTERN, Pt_CHANGE_RESIZE_REDRAW, NULL, Pt_ARG_IS_STRUCT( PtBasicWidget_t, trans_pattern ) }, { Pt_ARG_BASIC_FLAGS, basic_modify_flags, NULL, Pt_ARG_IS_FLAGS( PtBasicWidget_t, flags ) }, { Pt_CB_MENU, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, menu ) }, { Pt_ARG_CONTRAST, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_NUMBER( PtBasicWidget_t, contrast ) }, { Pt_ARG_BEVEL_CONTRAST, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_NUMBER( PtBasicWidget_t, border_contrast ) }, { Pt_ARG_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, border_color ) }, { Pt_ARG_LIGHT_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, top_flat_color ) }, { Pt_ARG_DARK_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, bot_flat_color ) }, { Pt_ARG_DARK_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, bot_border_color ) }, { Pt_ARG_LIGHT_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_COLOR( PtBasicWidget_t, top_border_color ) }, };
![]() |
Установка бита Pt_CONSUME_EVENTS ресурса eflags PtWidget'а управляет, потребляет ли виджет любое событие, данное ему. Контейнерные виджеты устанавливают этот бит по умолчанию, чтобы предотвратить события от прохождения к подклассифицируемым виджетам ниже них. |
Этот суперкласс обеспечивает новое начало координат, отсечение и ограничения для дочерних виджетов виджета. Если вы создаете виджет с дочерними виджетами, мы рекомендуем, чтобы Вы делали ваш виджет подклассом PtContainer или одного из его подклассов.
![]() |
Контейнер может иметь свой собственный метод Рисования, чтобы выполнить любые специфические для виджета данные (кроме дочерних виджетов). |
PtWidget --> PtBasic --> PtContainer
typedef struct Pt_container_widget_class { PtBasicWidgetClass_t basic; void (*child_created_f)( PtWidget_t *widget, PtWidget_t *child ); int (*child_settingresource_f)(PtWidget_t *widget, PtWidget_t *child, PtArg_t const *argt); int (*child_gettingresource_f)(PtWidget_t *widget, PtWidget_t *child, PtArg_t *argt ); int (*child_realizing_f)( PtWidget_t *widget, PtWidget_t *child ); void (*child_realized_f)( PtWidget_t *widget, PtWidget_t *child ); void (*child_unrealizing_f)( PtWidget_t *widget, PtWidget_t *child ); void (*child_unrealized_f)( PtWidget_t *widget, PtWidget_t *child ); void (*child_destroyed_f)( PtWidget_t *widget, PtWidget_t *child ); void (*child_move_resize_f)( PtWidget_t *widget, PtWidget_t *child, PhArea_t *current_area, PhRect_t *current_extent, PhArea_t *old_area, PhRect_t *old_extent ); int (*child_getting_focus_f)( PtWidget_t *widget, PtWidget_t *child, PhEvent_t *event ); int (*child_losing_focus_f)( PtWidget_t *widget, PtWidget_t *child, PhEvent_t *event ); PtWidget_t * (*child_redirect_f)( PtWidget_t *, PtWidgetClassRef_t *); } PtContainerClass_t; #define Pt_SET_CHILD_SETTINGRESOURCE_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_settingresource_f)) #define Pt_SET_CHILD_GETTINGRESOURCE_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_gettingresource_f)) #define Pt_SET_CHILD_REALIZING_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_realizing_f)) #define Pt_SET_CHILD_REALIZED_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_realized_f)) #define Pt_SET_CHILD_UNREALIZING_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_unrealizing_f)) #define Pt_SET_CHILD_UNREALIZED_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_unrealized_f)) #define Pt_SET_CHILD_CREATED_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_created_f)) #define Pt_SET_CHILD_DESTROYED_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_destroyed_f)) #define Pt_SET_CHILD_MOVED_RESIZED_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_move_resize_f)) #define Pt_SET_CHILD_GETTING_FOCUS_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_getting_focus_f)) #define Pt_SET_CHILD_LOSING_FOCUS_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_losing_focus_f)) #define Pt_SET_CHILD_REDIRECT_F \ (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \ child_redirect_f))
PtContainer определяет методы класса, описанные ниже.
PtContainerWidget_t *ctnr =(PtContainerWidget_t *)widget; PtBasicWidget_t *basic = (void *)widget; widget->eflags |= Pt_CONSUME_EVENTS; widget->border_width = 0; widget->resize_flags &= ~Pt_RESIZE_XY_BITS; basic->flags = Pt_ALL_BEVELS | Pt_FLAT_FILL; ctnr->flags = Pt_ANCHOR_CHILD_HORIZONTAL | Pt_ANCHOR_CHILD_VERTICAL | Pt_CANVAS_INVALID | Pt_ENABLE_CUA | Pt_ENABLE_CUA_ARROWS; ctnr->title_font = strdup("TextFont09"); PtSetParentWidget( widget );
Регистрируется с его родителем для служб прикрепления.
Находит блок ограничения дочерних виджетов виджета и применяет его политику изменения размера. Размерности рассчитываются, и если в результате холст различен, все зарегистрированные дочерние контейнеры прикрепляются. Если размерности или холст различны, список обратных вызовов изменения размера виджета вызываются. Смотрите PtSuperClassExtent() для типового метода Размерности контейнера.
Нет.
Нет.
Наследуется от PtBasic.
Вычеркивает виджет из его родителя. Уничтожает current_balloon и устанавливает его в NULL (если он еще не NULL).
Вычеркивает виджет из его родителя.
Наследуется от PtBasic.
Наследуется от PtBasic.
Наследуется от PtBasic.
Нет.
static void container_child_realized_unrealized( PtWidget_t *widget, PtWidget_t *child ) { PtContainerWidget_t *ctnr = (PtContainerWidget_t *)widget; if( child->flags & Pt_PROCREATED ) // || !PtResizePolicy( widget ) ) return; if ( ( widget->flags & Pt_REALIZED ) && ( ctnr->flags & Pt_AUTO_EXTENT ) ) { ctnr->flags |= Pt_IGNORE_CONSTRAINTS; PtMoveResizeWidget( widget, 0 ); ctnr->flags &= ~Pt_IGNORE_CONSTRAINTS; } }
Вызывает метод Реализации/Дереализации Дочерних Виджетов с правильными параметрами:
static void container_child_moved_resized( PtWidget_t *widget, PtWidget_t *child, PhArea_t *area, PhRect_t *rect, PhArea_t *oarea, PhRect_t *orect ) { container_child_realized_unrealized( widget, child ); }
Нет.
Нет.
Нет.
Нет.
Нет.
Нет.
static const PtRawCallback_t callback = { Pt_EV_REDIRECTED, container_callback, NULL }; static const PtResourceRec_t resources[] = { { Pt_ARG_AREA, container_modify_area, NULL, Pt_ARG_IS_STRUCT( PtWidget_t, area ) }, { Pt_ARG_DIM, container_modify_area, NULL, Pt_ARG_IS_STRUCT( PtWidget_t, area.size ) }, { Pt_ARG_POS, container_modify_area, NULL, Pt_ARG_IS_STRUCT( PtWidget_t, area.pos ) }, { Pt_ARG_RESIZE_FLAGS, container_modify_area, NULL, Pt_ARG_IS_FLAGS( PtWidget_t, resize_flags ) }, { Pt_ARG_ANCHOR_OFFSETS, container_modify_area, NULL, Pt_ARG_IS_STRUCT( PtContainerWidget_t, anchor_offset) }, { Pt_ARG_ANCHOR_FLAGS, container_modify_area, NULL, Pt_ARG_IS_FLAGS( PtContainerWidget_t, anchor_flags ) }, { Pt_ARG_FOCUS, container_modify, NULL, Pt_ARG_IS_POINTER( PtContainerWidget_t, focus ) }, { Pt_CB_RESIZE, Pt_CHANGE_INVISIBLE, NULL, Pt_ARG_IS_CALLBACK_LIST( PtContainerWidget_t, resize ) }, { Pt_CB_BALLOONS, container_set_balloons, NULL, Pt_ARG_IS_LINK( PtContainerWidget_t, balloons ) }, { Pt_ARG_CONTAINER_FLAGS, container_modify_flags, NULL, Pt_ARG_IS_FLAGS( PtContainerWidget_t, flags ) }, { Pt_ARG_TITLE, container_set_title, NULL, Pt_ARG_IS_STRING( PtContainerWidget_t, title ) }, { Pt_ARG_TITLE_FONT, container_set_title, NULL, Pt_ARG_IS_STRING( PtContainerWidget_t, title_font ) }, { Pt_CB_CHILD_ADDED_REMOVED,Pt_CHANGE_INVISIBLE,NULL, Pt_ARG_IS_LINK(PtContainerWidget_t,child_added_removed ) }, };
container->flags |= Pt_ANCHORS_INVALID; container->flags &= ~Pt_ANCHORS_LOCKED;
Бит Pt_ANCHORS_INVALID указывает, что виджет не может быть прикреплен, используя значения в члене смещений якоря, пока эти значения не будут повторно рассчитаны.
Бит Pt_ANCHORS_LOCKED указывает, что смещения якоря для контейнера имеют силу и не должны быть повторно рассчитаны из-за изменения, что толькочто произошло. Этот бит устанавливается, когда Pt_ARG_ANCHOR_OFFSETS установлен. Если Pt_ARG_ANCHOR_OFFSETS установлен, якоря утверждены и блокированы. Если Pt_ARG_RESIZE_FLAGS изменяется, якоря аннулированы, и виджет помечен для изменения размера:
widget->flags |= Pt_WIDGET_RESIZE;
static void container_modify( PtWidget_t *widget, PtArg_t *arg ) { PtContainerWidget_t *container = (PtContainerWidget_t *)widget; PhEvent_t event; memset( &event, 0, sizeof( event ) ); switch( arg->type ) { case Pt_ARG_FOCUS: // Если виджет уже имеет фокус или не является посредственным // дочерним виджетом этого контейнера, не делаем ничего. if (( container->focus == (PtWidget_t *)arg->value ) || ( !arg->value ) || (((PtWidget_t *)arg->value)->parent != widget)) return; // иначе, даем фокус целевому виджету. PtContainerGiveFocus( (PtWidget_t *)arg->value, &event ); if( container->focus && container->focus->flags & Pt_REALIZED ) PtDamageWidget( container->focus ); } }
![]() |
![]() |
![]() |
![]() |
Все мессаги сюда:yanich@inbox.ru |