logo
Литература_1 / photon_old

Получение и установка состояния окна

Ресурс Pt_ARG_WINDOW_STATE управляет состоянием окна:

Чтобы сделать это:

Установите этот бит:

Максимизировать окно

Ph_WM_STATE_ISMAX

Сделать окно фоновым

Ph_WM_STATE_ISBACKDROP

Минимизировать окно

Ph_WM_STATE_ISHIDDEN

Разместить базовое окно впереди окон всех других приложений

Ph_WM_STATE_ISFRONT

Передать фокус клавиатуры на окно, если фокус курсора отключён

Ph_WM_STATE_ISFOCUS

Передать приложению комбинации с клавишей <Alt>

Ph_WM_STATE_ISALTKEY

Заблокировать окно

Ph_WM_STATE_ISBLOCED

(только для чтения)

Принятым по умолчанию значением является PH_WM_STATE_ISFOCUS.

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

Наиболее безопасным временем, когда можно использовать этот ресурс для установки состояния окна – время перед тем, как окно реализовано. Например, Вы можете выполнить установки, когда создаётся виджет PtWindow или в ответной реакции окна Pt_CB_WINDOW_OPENING. Установки обретут силу, когда окно реализуется.

Вы можете установить Pt_ARG_WINDOW_STATE после реализации окна, основывая Ваши изменения на Ваших предположениях о том, каково текущее состояние окна, но безопаснее сообщить оконному менеджеру о том, как Вы хотите изменить состояние окна, вызвав:

PtForwardWindowEvent()

Изменить состояние окна, связанного с данным идентификатором региона

PtForwardWindowTaskEvent()

Изменить состояние окна, связанного с данным идентификатором коннекции Photon'а.

Например, чтобы минимизировать окно, которое принадлежит Вашему приложению и уже открыто:

static void send_key( long key ) {

struct {

PhEvent_t event;

PhRect_t rect;

PhKeyEvent_t pevent;

} new_event;

PhEvent_t event;

PhKeyEvent_t key_event;

PhRect_t rect;

rect.ul.x = rect.ul.y = 0;

rect.lr.x = rect.lr.y = 0;

memset( &event, 0, sizeof(event));

memset( &key_event, 0, sizeof(key_event) );

event.type = Ph_EV_KEY;

event.emitter.rid = Ph_DEV_RID;

event.num_rects = 1;

event.data_len = sizeof(key_event);

event.input_group = 1;

key_event.key_cap = key;

key_event.key_sym = key;

if ( isascii( key ) && isupper( key ) ) {

key_event.key_mods = Pk_KM_Shift;

}

/* Генерирование нажатия клавиши */

key_event.key_flags = Pk_KF_Sym_Valid | Pk_KF_Cap_Valid | Pk_KF_Key_Down;

PhEmit( &event, &rect, &key_event );

/* Генерирование отпускания клавиши */

key_event.key_flags &= ~(Pk_KF_Key_Down | Pk_KF_Sym_Valid) ;

PhEmit( &event ,&rect, &key_event );

return;

}

Чтобы минимизировать окно, принадлежащее другому приложению и уже открыто:

PhWindowEvent_t event;

memset( &event, 0, sizeof (event) );

event.event_f = Ph_WM_HIDE;

event.event_state = Ph_WM_EVSTATE_HIDE;

PtForwardWindowTaskEvent( connection_id, &event );

 Когда Вы вызываете эти функции, Вы просите оконный менеджер выполнить заданное действие. Если это действие не входит в набор флагов управления (Pt_ARG_WINDOW_MANAGED_FLAGS) для данного окна, оконный менеджер этого и на сделает.

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4