Управление панелью инструментов: традиционный подход
//=========================================================
// Модуль управления панелью инструментов
// Версия, выполненная с применением традиционного подхода
//======
// Обработчик события нажатия кнопки мыши на панели
//
int toolbar_btn_press(PtWidget_t *widget, ApInfo_t *apinfo,
PtCallbackInfo_t *cbinfo)
{
toolbar_t *tb = tb_data(widget) ;
// Указатель на данные панели
PhRect_t *rect ; // Координаты курсора мыши
PhEvent_t *event = cbinfo->event ;
// Произошедшее событие
PhPointerEvent_t *edata = PhGetData( event ) ;
// Дополнительная информация о событии
if( edata->buttons&Ph_BUTTON_MENU )
{
// Была нажата правая кнопка мыши
rect = PhGetRects( event ) ;
tb->drag_pos = rect->ul ;
// Запомнить координаты курсора мыши
PtWindowToFront( tb->wgt ) ;
// Поместить окно панели поверх всех остальных окон
tb->menu = 1 ;
// Запомнить, что была нажата правая кнопка мыши
} ;
return( Pt_CONTINUE ) ;
} ;
//======
// Обработчик события отпускания кнопки мыши на панели
//
int toolbar_btn_release(PtWidget_t *widget, ApInfo_t *apinfo,
PtCallbackInfo_t *cbinfo)
{
toolbar_t *tb = tb_data(widget) ;
// Указатель на данные панели
PhEvent_t *event = cbinfo->event ;
// Произошедшее событие
PhPointerEvent_t *edata = PhGetData( event ) ;
// Дополнительная информация о событии
if( event->subtype==Ph_EV_RELEASE_REAL
&& edata->buttons&Ph_BUTTON_MENU )
// Была отпущена правая кнопка мыши
if( tb->menu == 1 )
// Перед этим была нажата правая кнопка мыши
ApCreateModule( ABM_toolbar_menu, NULL, NULL ) ;
// Отобразить меню
tb->menu = 0 ;
return( Pt_CONTINUE ) ;
} ;
//======
// Обработчик события перемещения мыши с нажатой кнопкой
//
int toolbar_btn_move(PtWidget_t *widget, ApInfo_t *apinfo,
PtCallbackInfo_t *cbinfo)
{
toolbar_t *tb = tb_data(widget) ;
// Указатель на данные панели
PhRect_t *rect ; // Координаты события
PhEvent_t *event = cbinfo->event ;
// Произошедшее событие
PhPointerEvent_t *edata = PhGetData( event ) ;
// Дополнительная информация о событии
// Если не нажата правая кнопка мыши, ничего не делать
if( !edata->buttons&Ph_BUTTON_MENU ) return Pt_CONTINUE ;
// Переместить тулбар вслед за курсором мыши.
rect = PhGetRects( event ) ;
tb->menu = 0 ;
toolbar_move( tb, rect->ul.x - tb->drag_pos.x,
rect->ul.y - tb->drag_pos.y ) ;
return( Pt_CONTINUE ) ;
} ;
//======
// Обработчик события пересечения курсором мыши
// границы панели
int toolbar_boundary(PtWidget_t *widget, ApInfo_t *apinfo,
PtCallbackInfo_t *cbinfo)
{
toolbar_t *tb = tb_data(widget) ;
// Указатель на данные панели
tb->menu = 0 ;
return( Pt_CONTINUE ) ;
} ;