0

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 を除外するのは正常な動作ですか、それとも何か間違っていますか?

実際、CLICK_CB、ENTERITEM_CB、および lin と col を提供する LEAVEITEM_CB が利用できない場合 (記述された状況で起動されない)、行列の BUTTON_CB または WHEEL_CB ハンドラー内から "lin" と "col" を取得するにはどうすればよいですか?

さらに、フォームのレベルで使用されるイベント ハンドラーから「アクティブ コントロール」(名前、フォーカスのあるコントロールの種類) を取得するにはどうすればよいでしょうか?

4

2 に答える 2

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

期待通りの作品です。
何か問題がある場合は、さらに提案してください。

于 2013-04-19T22:14:18.703 に答える