IUP,矩阵上的鼠标事件

时间:2013-04-18 20:34:58

标签: iup

我对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”?

此外,我如何从表单级别使用的事件处理程序获得“主动控制”(名称,具有焦点的控件类型)?

2 个答案:

答案 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;
}

这项工作符合预期。
如果不对,请进一步建议。