Страниц: [1]
  Печать  
Автор Тема: Position widget.  (Прочитано 2665 раз)
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« : Августа 10, 2015, 10:03:32 am »

Добрый день!
Пишу программу под Photon, столкнулся с необъяснимой мне вещью, которая нуждается в растолковании. Есть 2 варианта функции задача которой изменить позицию виджета на 1 (как пример). Их отличие друг от друга на лицо:

Вариант 1:
Код:
int MoveLabel( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
PtArg_t    arg = { 0 };
PhPoint_t *pos = NULL;

/* eliminate 'unreferenced' warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;

PtSetArg( &arg, Pt_ARG_POS, &pos, 0 );
PtGetResources( ABW_PtLabel1, 1, &arg );

pos->x++;

PtSetArg( &arg, Pt_ARG_POS, pos, 0 );
PtSetResources( ABW_PtLabel1, 1, &arg );

return( Pt_CONTINUE );
}

Вариант 2:
Код:
int MoveLabel( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
PtArg_t    arg     = { 0 };
PhPoint_t *pos     = NULL;
PhPoint_t  new_pos = { 0 };

/* eliminate 'unreferenced' warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;

PtSetArg( &arg, Pt_ARG_POS, &pos, 0 );
PtGetResources( ABW_PtLabel1, 1, &arg );

new_pos.x = pos->x + 1;
new_pos.y = pos->y;

PtSetArg( &arg, Pt_ARG_POS, &new_pos, 0 );
PtSetResources( ABW_PtLabel1, 1, &arg );

return( Pt_CONTINUE );
}

Почему первый вариант не работает? Спасибо.

P.S. Вариант 3 (тоже рабочий):
Код:
int MoveLabel( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
PtArg_t    arg = { 0 };
PhPoint_t *pos = NULL;

/* eliminate 'unreferenced' warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;

PtSetArg( &arg, Pt_ARG_POS, &pos, 0 );
PtGetResources( ABW_PtLabel1, 1, &arg );

pos->x++;

        PtReRealizeWidget( ABW_PtLabel1 );

return( Pt_CONTINUE );
}
« Последнее редактирование: Августа 10, 2015, 10:09:11 am от qnx_user » Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #1 : Августа 10, 2015, 10:23:30 am »

По теме не скажу.
Мне когда лень (а это почти всегда) я делаю так:
Код:
ABW_PtLabel1->area.pos.x++;
ABW_PtLabel1->area.size.w+=10;
PtDamageWidget(ABW_PtLabel1); (иногда и/или PtExtentWidget(ABW_PtLabel1);)
Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #2 : Августа 10, 2015, 10:41:55 am »

Мне когда лень (а это почти всегда) я делаю так:
Код:
ABW_PtLabel1->area.pos.x++;
ABW_PtLabel1->area.size.w+=10;
PtDamageWidget(ABW_PtLabel1); (иногда и/или PtExtentWidget(ABW_PtLabel1);)


Спасибо, пробовал делать так же только с PtReRealizeWidget (так же рабочий вариант). Просто смутило, что вроде по смыслу код в варианте 1 и 2 одинаков, но почему-то работает по разному. К сожалению трудно понять что внутри себя делает PtSetResources и как она распоряжается массивом args.
Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #3 : Августа 10, 2015, 11:37:58 am »

В первом варианте, PhPoint_t *pos становиться указателем на ресурс виджета, его нельзя изменять вручную, т.е. без использования PtSetResources().
Когда Вы пытаетесь присвоить новое значение для ресурса Pt_ARG_POS, то механизм виджета пытается скопировать новое значение из своего ресурса в свой же ресурс.
Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #4 : Августа 10, 2015, 11:49:45 am »

... механизм виджета пытается скопировать новое значение из своего ресурса в свой же ресурс.
Спасибо, подобная мысль меня посещала.
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #5 : Августа 10, 2015, 03:47:39 pm »

PtReRealizeWidget только для окон вызываю. Обычные виджеты через PtDamageWidget перерисовываются. К флагам виджета тоже напрямую обращаюсь - немного быстрее работает чем через вызов PtGetResources/PtSetResources. Особенно когда виджетов много.
Записан
QNX Worker
Jr. Member
**
Offline Offline

Сообщений: 99


Просмотр профиля
« Ответ #6 : Августа 11, 2015, 10:46:51 am »

Я давно себе такие функции сделал:
Код:
...
//Установка положения виджета
int SetWidgetPosition(PtWidget_t *widget, int X, int Y){
   PhPoint_t pos;
   pos.x=X;
   pos.y=Y;
   PtSetResource(widget, Pt_ARG_POS, &pos, 0);
   PtDamageWidget(widget);
   return 0;
};
...
//Установка размера виджета
int SetWidgetSize(PtWidget_t *widget, int W, int H){
   PhDim_t size;
   size.w=W;
   size.h=H;
   PtSetResource(widget, Pt_ARG_DIM, &size, 0);
   PtDamageWidget(widget);
   return 0;
};
...
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #7 : Августа 11, 2015, 02:39:41 pm »

PtSetResources разве сам не вызывает PtDamageWidget ?
Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #8 : Августа 11, 2015, 03:53:17 pm »

PtSetResources разве сам не вызывает PtDamageWidget ?

Вызывает. Вчера пробовали изменять позицию виджета напрямую обращаясь к элементам структуры PtWidget_t (например ABW_PtLabel1->area.pos.x), и обратили внимание что если вызвать PtDamageWidget, то виджет не меняет своего положения (а вот текст внутри виджета меняет), нужно вызвать PtExtentWidget. Поэтому, PtSetResources скорее всего вызывает и то и другое, нет?
« Последнее редактирование: Августа 11, 2015, 06:49:34 pm от qnx_user » Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #9 : Августа 11, 2015, 03:57:56 pm »

PtReRealizeWidget только для окон вызываю. Обычные виджеты через PtDamageWidget перерисовываются. К флагам виджета тоже напрямую обращаюсь - немного быстрее работает чем через вызов PtGetResources/PtSetResources. Особенно когда виджетов много.

Все верно, но это, как говорится, для опытных "пользователей". Мне кажется, что новичкам такие вещи лучше не объяснять, дабы не устраивать еще больший хаос в их голове.

Я давно себе такие функции сделал:

Уверен, что сам пример из хелпа наведет вас на правильную мысль  Wink
Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #10 : Августа 11, 2015, 04:08:36 pm »

Мне кажется, что новичкам такие вещи лучше не объяснять, дабы не устраивать еще больший хаос в их голове.

Не новички, так что все более или менее понятно. Есть путаница, небольшая, в голове, из-за разнообразия функций, которые применяются в каждом конкретном случае. Так же ряд вопросов возникает из-за того что тела функций скрыты, и не всегда понятно что она внутри себя вызывает (например PtSetResources). С точки зрения объектно-ориентированного подхода хочется работать с объектами и реализовать свои простейшие функции-обертки и использовать уже их из проекта в проект.
« Последнее редактирование: Августа 11, 2015, 04:10:32 pm от qnx_user » Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #11 : Августа 11, 2015, 08:03:43 pm »

Ну кстате, если реализовывать именно "правильные" функции-обертки, то следует идти по пути QNX Worker'a.  Wink
Напрямую-то в виджеты лезть имеет смысл только для выжимания скорости работы или на стадии создания виджетов вручную.   Angry
Для моих случаев достаточно PtDamageWidget.  Tongue
PtSetResources вызывает конкретные функции модификации своего ресурса - это можно видеть если смотреть примеры реализаций виджетов из примеров. Что не есть хорошо для быстродействия, но дает гибкость-универсальность-переносимость коду. Roll Eyes
А вот внутри этих функций вызываются уже и Damage и Extent именно там, где нужно.

И не забываем, что для QNX немного экспериментов как всегда не помешает   Cool

Собсно всегда была трабла скрыть-показать виджет, узнать его состояние, причем быстро.
Счас для себя во ->flags сбрасываю/ставлю бит Pt_DELAY_REALIZE и работаю с PtRealizeWidget/PtUnrealizeWidget.
Но вкуривал доолго  Huh?
« Последнее редактирование: Августа 11, 2015, 08:05:32 pm от deadarcher » Записан
Hed
Jr. Member
**
Offline Offline

Сообщений: 98


Просмотр профиля
« Ответ #12 : Августа 11, 2015, 09:51:23 pm »

С точки зрения объектно-ориентированного подхода хочется работать с объектами и реализовать свои простейшие функции-обертки и использовать уже их из проекта в проект.

Дежавю Wink
Записан
Страниц: [1]
  Печать  
 
Перейти в: