Отловить click для behavior:button
От: PSasa  
Дата: 04.02.09 08:34
Оценка:
Добрый,

Я почитал тут, посмотрел примеры.
Мне непонятным оказался механизм "отлова" события CLICK от кнопки.
Я видел как это реализовано в mfc примере(Wizard) для behavior:command
есть ли аналогичный способ для behavior:button (HLN_COMMAND_CLICK)?
Или единственный способ слушать ВСЕ сообщения и фильтровать только определенный тип событий от определенного компонента?
Мне кажется неудобным иметь одну громадную функцию обработки всех событий.
Или я ошибаюсь (недопонимаю весь механизм)?

С уважением,
Александр
Re: Отловить click для behavior:button
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 04.02.09 08:50
Оценка:
Здравствуйте, PSasa, Вы писали:

PS>Или единственный способ слушать ВСЕ сообщения и фильтровать только определенный тип событий от определенного компонента?

PS>Мне кажется неудобным иметь одну громадную функцию обработки всех событий.
Так ничего громадного в ней нет Или ты про что-то другое?
struct my_button : public htmlayout::behavior
{
    my_button() : htmlayout::behavior( HANDLE_BEHAVIOR_EVENT, "my-button" ) {}
    virtual BOOL on_event (HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT_PTR reason ) 
    { 
      if( type != BUTTON_CLICK )
        return false;
    }
};
Хорошо там, где мы есть! :)
Re[2]: Отловить click для behavior:button
От: PSasa  
Дата: 04.02.09 10:43
Оценка:
Здравствуйте, ShaggyOwl, Вы писали:

SO>Так ничего громадного в ней нет Или ты про что-то другое?

SO>
SO>struct my_button : public htmlayout::behavior
SO>{
SO>    my_button() : htmlayout::behavior( HANDLE_BEHAVIOR_EVENT, "my-button" ) {}
SO>    virtual BOOL on_event (HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT_PTR reason ) 
SO>    { 
SO>      if( type != BUTTON_CLICK )
SO>        return false;
SO>    }
SO>};
SO>


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

С уважением,
Александр
Re[3]: Отловить click для behavior:button
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 04.02.09 10:54
Оценка:
Здравствуйте, PSasa, Вы писали:

PS>Наверное все-таки это не то.

PS>Здесь ты создаешь новое поведение унаследованное от button
От htmlayout::behavior.
PS>я же хочу отловить BUTTON_CLICK в своей программе,
Во. Именно это это behavior my-button делать и будет.
PS>а лучше назначить функцию одработки BUTTON_CLICK элемента с ID
Решается с помощью стилей. behavior button будет генерировать событие BUTTON_CLICK, а behavior my-button обрабатывать его.
<html>
  <head>
    <style>
      #my-button { behavior: button my-button; } 
    </style>
  </head>
  <body>
    <button #my-button>Hello, behavior</button>
  </body>
</html>
Хорошо там, где мы есть! :)
Re[3]: Отловить click для behavior:button
От: Nikolaz Германия www.nikeware.com
Дата: 04.02.09 15:15
Оценка:
Здравствуйте, PSasa, Вы писали:

PS>Наверное все-таки это не то.

PS>Здесь ты создаешь новое поведение унаследованное от button
PS>я же хочу отловить BUTTON_CLICK в своей программе, а лучше назначить функцию одработки BUTTON_CLICK элемента с ID

Если вам нужно MFC-ориентированная обертка, могу поделится своими наработками.
У меня сделано многое через CSSS. Выглядит примерно так:

Код html:
<html>
  <head>
    <style>
      #action_btn
      {
        click!: upper_value= do_something($1(#action_field):value);
      } 
    </style>
  </head>
  <body>
    <button id="action_btn">Action!</button>
    <input id="action_field" value="some text"/>
  </body>
</html>


do_something — это глобальная custom-функция.
Обработчик для нее лежит в MFC классе:
BEGIN_CSSS_FUNCTION_MAP(CMyHtmlayoutView, CHtmlayoutView)
    ON_CSSS_FUNCTION("do_something", do_something)
    ON_CSSS_FUNCTION("on_add_item", on_add_item)
    ON_CSSS_FUNCTION("on_del_item", on_del_item)
        ...
END_CSSS_FUNCTION_MAP()

void CMyHtmlayoutView::do_something(UINT argc, json::value* argv, json::value& retval)
{
    CString val(argv[0].to_string().c_str());
        val.MakeUpper();
    retval= json::value(tt);
}


Сам CMyHtmlayoutView выглядит примерно так:
class CMyHtmlayoutView : public CHtmlayoutView
{
protected:
    CMyHtmlayoutView();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CMyHtmlayoutView)
    DECLARE_MESSAGE_MAP()
...
    // handlers for csss! scripts
    DECLARE_CSSS_FUNCTION_MAP()
    void do_something(UINT argc, json::value* argv, json::value& retval);
    void on_add_item(UINT argc, json::value* argv, json::value& retval);
    void on_del_item(UINT argc, json::value* argv, json::value& retval);
...    
};


DECLARE_CSSS_FUNCTION_MAP() и BEGIN_CSSS_FUNCTION_MAP работают по принципу классического MESSAGE_MAP в MFC. Поддерживается насладование.
Re: Отловить click для behavior:button
От: c-smile Канада http://terrainformatica.com
Дата: 04.02.09 17:08
Оценка:
Здравствуйте, PSasa, Вы писали:

Событие BUTTON_CLICK сгенерированное кнопкой "всплывает" т.е. доставляется
самой кнопке и всем её контейнерам (включая view — окно).

Т.е. ловить "кнопкин клик" можно на ней самой или на любом из ея контейнеров путем
создания своего htmlayout::event_handler и прикрепления оного htmlayout::attach_event_handler()
на требуемый объект.


Можно також придумать конструкции вида:

#define BEGIN_DOM_EVENT_MAP \
   BOOL on_event (HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT_PTR reason ) {

#define END_DOM_EVENT_MAP \
   return FALSE; }

// дискриминатор выбора:
#define ON_DOM_EVENT(WHICH,WHERE,WHAT) \
   if( WHICH == type && htmlayout::dom::element(target).test(WHERE) ) \
      return WHAT(target);


Тогда можно писать такое

class MyWindow: public CWnd,
      public htmlayout::event_handler 
{
  void OnCreate(...) 
  { 
   ....
   htmlayout::attach_event_handler(GetSafeHWnd(), this); 
  }

  BEGIN_DOM_EVENT_MAP

    ON_DOM_EVENT( BUTTON_CLICK, "button#some", do_something1 )

    ON_DOM_EVENT( TABLE_ROW_CLICK, "table#my-grid > tr:nth-child(even)", do_on_even_row_click )
    ON_DOM_EVENT( TABLE_ROW_CLICK, "table#my-grid > tr:nth-child(odd)", do_on_odd_row_click )

    ON_DOM_EVENT( MENU_ITEM_CLICK, "menu#oh-my > li#got", oh_my_got_click )
    
  END_DOM_EVENT_MAP

  bool do_something1(dom::element element) { .... }
  bool do_on_even_row_click (dom::element element) { .... }
  bool do_on_odd_row_click (dom::element element) { .... }
  bool oh_my_got_click (dom::element element) { .... }

}


Можно также вариант от Nikolaz взять и использовать CSSS! в качестве дискриминаторов-синтезаторов событий.
Re[2]: Отловить click для behavior:button
От: Nikolaz Германия www.nikeware.com
Дата: 05.02.09 08:51
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Можно также вариант от Nikolaz взять и использовать CSSS! в качестве дискриминаторов-синтезаторов событий.

Для меня удобствие при использовании CSSS! состоит в том, что помимо самого факта клика, я могу наверх еще что-то в параметрах самой custom-функции передать. Очень удобно.
Re[3]: Отловить click для behavior:button
От: c-smile Канада http://terrainformatica.com
Дата: 05.02.09 22:26
Оценка:
Здравствуйте, Nikolaz, Вы писали:

N>Здравствуйте, c-smile, Вы писали:


CS>>Можно также вариант от Nikolaz взять и использовать CSSS! в качестве дискриминаторов-синтезаторов событий.

N>Для меня удобствие при использовании CSSS! состоит в том, что помимо самого факта клика, я могу наверх еще что-то в параметрах самой custom-функции передать. Очень удобно.

Это да.

Кстати я вот також думал вывести наружу этот самый CSSS! evaluator.

Типа HTMLayoutElementEvaluate(HELEMENT he, LPCWSTR cssScript);

тогда cssScript можно использовать в атрибутах (написав соотв. метод во view event handler)

<button onclick='call-something-on-host(self.id,"Ку-ку!")'>Click me!</button>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.