我对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的CLICK_CB,ENTERITEM_CB和LEAVEITEM_CB不可用(在描述的情况下未触发),我将如何从矩阵的BUTTON_CB或WHEEL_CB处理程序中获取“lin”和“col”?
此外,我如何从表单级别使用的事件处理程序获得“主动控制”(名称,具有焦点的控件类型)?
答案 0 :(得分:1)
这是BUTTON_CB排除CLICK_CB或我做错了什么的正常行为吗?
是的,确实如此。因为BUTTON_CB是IupCanvas回调而CLICK_CB是IupMatrix回调。记住IupMatrix继承自IupCanvas。因此,内部IupMatrix正在使用BUTTON_CB回调来实现多个功能。
因此,在这种情况下,您需要做的是在分配新回调之前保存先前的回调,并从您自己的内部调用旧的回调。像这样:
old_callback = IupGetCallback(mat, "BUTTON_CB");
IupSetCallback(mat, "BUTTON_CB", new_callback);
int new_callback(...)
{
return old_callback(...)
}
实际上,如果给出lin和col的CLICK_CB,ENTERITEM_CB和LEAVEITEM_CB不可用(在描述的情况下没有触发),我将如何从矩阵的BUTTON_CB或WHEEL_CB处理程序中获取“lin”和“col”?
使用函数pos = IupConvertXYToPos(mat,x,y),其中pos = lin * numcol + col。计算lin和col非常简单,因为它们是整数值。
此外,我如何从表单级别使用的事件处理程序获得“主动控制”(名称,具有焦点的控件类型)?
我并没有完全不理你的问题。但我认为IupGetFocus和IupGetClassName可能是你想要的功能。
答案 1 :(得分:1)
我将通过使用安东尼奥的建议回答我自己的问题,以便其他对IUP感兴趣的人可以从这些帖子中受益。
如果我理解得很清楚,不太可能,这就是我如何为我的矩阵制作BUTTON_CB处理程序:
int button(Ihandle *mat, int button, int pressed, int x, int y, char* status)
{
//actually 'name' is Ihandle
//and class name is a 'type'
//in compare with other toolkits
char* name = IupGetClassName(mat);
//so since we have handle already
//we can't be here if we are not in concrete matrix
//and this comparision is not needed
if (strncmp(name, "matrix", sizeof(name)) == 0)
{
//if left mouse button is down
if (button == IUP_BUTTON1 && pressed == 1)
{
//my calculation is not 100% correct
//but good enough for this sample
int pos = IupConvertXYToPos(mat, x, y);
_line = pos/numcol;
_col = pos%numcol;
//if is doubleclick
if (status[5] == 'D')
{
//press ENTER key
//and open another modal dialog
//with argument 'sel'
k_any(mat, K_CR);
printf("Doubleclick\n");
//say HANDLED for IUP
//but not matter when READONLY is "YES"
return IUP_IGNORE;
}
//calculate (public) sel
//for select a clicked line
sel = _line + from - 1;
refreshl(from, sel);
printf("Click\n");
return IUP_IGNORE;
}
}
return IUP_DEFAULT;
}
这项工作符合预期。
如果不对,请进一步建议。