У меня принципиальная путаница в понимании системы событий IUP. Теперь я говорю о матрице.
Вот как он создается:
Ihandle *create_mat(void)
{
mat = IupMatrix(NULL);
IupSetAttribute(mat, "READONLY", "YES");
IupSetCallback(mat, "CLICK_CB", (Icallback)click);
IupSetCallback(mat, "BUTTON_CB", (Icallback)button);
return mat;
}
Вот обратные вызовы:
int click(Ihandle *mat, int lin, int col)
{
char* value = IupMatGetAttribute(mat, "", lin, col);
if (!value) value = "NULL";
printf("click_cb(%d, %d)\n", lin, col);
return IUP_DEFAULT;
}
int button(Ihandle *mat, int button, int pressed, int x, int y, char* status)
{
printf("button %d, %d, %d, %d %s\n", button, pressed, x, y, status);
return IUP_DEFAULT;
}
Проблема в том, что мне нужны оба обратных вызова, но в показанной ситуации событие CLICK не запускается.
Если я отключу BUTTON_CB, то будет запущено событие CLICK. Но мне нужны оба, для щелчка, двойного щелчка левой кнопкой, отпускания правой кнопки и т. Д.
Это нормальное поведение, когда BUTTON_CB исключает CLICK_CB, или я делаю что-то не так?
На самом деле, как мне получить «lin» и «col» из обработчика BUTTON_CB или WHEEL_CB матрицы, если CLICK_CB, ENTERITEM_CB и LEAVEITEM_CB, которые дают lin и col, недоступны (не запускаются в описанной ситуации)?
И еще, как мне получить «активный элемент управления» (имя, тип элемента управления с фокусом) от обработчиков событий, используемых на уровне формы?