Здравствуйте, Lightlace, Вы писали:
behavior это фактически микро-окно со своей element_proc (аналог WinProc в Windows)
behaviors назначается DOM эдементу в CSS — #myelement { behavior: name-of-my-behavior; }
Вот её имплементация в htmlayout_behaviors.hpp
// ElementWventProc implementeation
static BOOL CALLBACK element_proc(LPVOID tag, HELEMENT he, UINT evtg, LPVOID prms )
{
event_handler* pThis = static_cast<event_handler*>(tag);
if( pThis ) switch( evtg )
{
case HANDLE_INITIALIZATION:
{
INITIALIZATION_PARAMS *p = (INITIALIZATION_PARAMS *)prms;
if(p->cmd == BEHAVIOR_DETACH)
pThis->detached(he);
else if(p->cmd == BEHAVIOR_ATTACH)
pThis->attached(he);
return TRUE;
}
case HANDLE_MOUSE: { MOUSE_PARAMS *p = (MOUSE_PARAMS *)prms; return pThis->handle_mouse( he, *p ); }
case HANDLE_KEY: { KEY_PARAMS *p = (KEY_PARAMS *)prms; return pThis->handle_key( he, *p ); }
case HANDLE_FOCUS: { FOCUS_PARAMS *p = (FOCUS_PARAMS *)prms; return pThis->handle_focus( he, *p ); }
case HANDLE_DRAW: { DRAW_PARAMS *p = (DRAW_PARAMS *)prms; return pThis->handle_draw(he, *p ); }
case HANDLE_TIMER: { TIMER_PARAMS *p = (TIMER_PARAMS *)prms; return pThis->handle_timer(he, *p); }
case HANDLE_BEHAVIOR_EVENT: { BEHAVIOR_EVENT_PARAMS *p = (BEHAVIOR_EVENT_PARAMS *)prms; return pThis->handle_event(he, *p ); }
case HANDLE_METHOD_CALL:
{
METHOD_PARAMS *p = (METHOD_PARAMS *)prms;
if(p->methodID == XCALL)
{
XCALL_PARAMS *xp = (XCALL_PARAMS *)p;
return pThis->handle_script_call(he,*xp);
}
else
return pThis->handle_method_call(he, *p );
}
case HANDLE_DATA_ARRIVED: { DATA_ARRIVED_PARAMS *p = (DATA_ARRIVED_PARAMS *)prms; return pThis->handle_data_arrived(he, *p ); }
case HANDLE_SIZE: { pThis->handle_size(he); return FALSE; }
case HANDLE_SCROLL: { SCROLL_PARAMS *p = (SCROLL_PARAMS *)prms; return pThis->handle_scroll(he, *p ); }
default:
assert(false);
}
return FALSE;
}
Собсвенно это основа. Т.е. твой behavior это набор методов handle_mouse(), handle_draw() и пр.
Очень близко по своей идее к WinProc и WM_LBUTTONDOWN, WM_PAINT и пр.