Матрица IUP Выбор полной строки

Пытаясь использовать матрицу IUP, я обнаружил, что ее использование очень интуитивно понятно, и она работает на удивление быстро даже на слабом компьютере. Итак, я вижу, что могу получить от этого контроля большую часть того, что мне нужно. Но, поскольку IUP имеет очень оригинальный способ установки свойств, я не могу заставить эту матрицу вести себя как обычный список из нескольких столбцов или список MS.

Вот как я его форматирую:

Ihandle *create_mat(void)
{
mat = IupMatrix(NULL);

IupSetAttribute(mat, "READONLY", "YES");
IupSetAttribute(mat, "HIDEFOCUS", "YES");
IupSetAttribute(mat, "FRAMECOLOR", "220 220 220");
IupSetAttribute(mat, "NUMCOL", "5");
IupSetAttribute(mat, "NUMCOL_VISIBLE", "5");
IupSetAttribute(mat, "NUMLIN", "30");
IupSetAttribute(mat, "NUMLIN_VISIBLE", "30");
IupSetAttribute(mat, "RESIZEMATRIX", "YES");
IupSetAttribute(mat, "MARKMODE", "LIN");
IupSetAttribute(mat, "MARKAREA", "CONTINUOUS");
IupSetAttribute(mat, "MULTIPLE", "NO");
IupSetAttribute(mat, "BORDER", "NO");
IupSetAttribute(mat, "CURSOR", "ARROW");
IupSetAttribute(mat, "ALIGNMENT", "ARIGHT");
IupSetAttribute(mat, "ALIGNMENT1", "ALEFT");
IupSetAttribute(mat, "ALIGNMENT5", "ACENTER");
//
IupSetAttribute(mat, "WIDTH0", "30");
IupSetAttribute(mat, "WIDTH1", "150");
IupSetAttribute(mat, "WIDTH2", "50");
IupSetAttribute(mat, "WIDTH3", "50");
IupSetAttribute(mat, "WIDTH4", "50");
//
IupSetAttribute(mat, "0:0", "Row H");
IupSetAttribute(mat, "0:1", "Col1");
IupSetAttribute(mat, "0:2", "Col2");
IupSetAttribute(mat, "0:3", "Col3");
IupSetAttribute(mat, "0:4", "Col4");
IupSetAttribute(mat, "0:5", "Col5");
//
IupSetCallback(mat, "CLICK_CB", (Icallback)click);
IupSetCallback(mat, "LEAVEITEM_CB", (Icallback)leave);
IupSetCallback(mat, "ENTERITEM_CB", (Icallback)enter);
IupSetCallback(mat, "WHEEL_CB", (Icallback)wheel);

return mat;
}

Все свойства и события с обратными вызовами работают должным образом. Поскольку у меня есть немного специфический способ использования/управления данными, необходимо, чтобы при нажатии на любую ячейку была выбрана полная строка или когда я также меняю положение с помощью клавиатуры.

Я также хотел бы иметь возможность выбирать полную строку с кодом, как он выбирает, щелкая заголовок строки.
Помимо щелчка (который я улавливаю, как и ожидалось), как проверить двойной щелчок на матрице?

И, наконец, не самое главное, но было бы неплохо узнать, существует ли способ получить выбранную строку в системном цвете (в основном синем) вместо серого?

Как проще всего добиться этой функциональности?
(Windows7/64)


iup
person Wine Too    schedule 11.04.2013    source источник


Ответы (1)


Самая простая форма для выбора строки так, как вы хотите, — это использовать обратный вызов ENTERITEM_CB:

static int enteritem_cb(Ihandle *ih, int lin, int col)
{
  IupSetAttribute(ih,"MARKED", NULL);  /* clear all marks */
  IupMatSetAttribute(ih,"MARK", lin, 0, "Yes");
  IupSetfAttribute(ih,"REDRAW", "L%d", lin);
  return IUP_DEFAULT;
}

В настоящее время нет возможности изменить выбранный цвет линии. На самом деле, потому что это не определенный цвет. Отмеченные ячейки рисуются с ослаблением основного и фонового цветов.

person Antonio Scuri    schedule 12.04.2013
comment
Спасибо за совет, который мне немного помогает. Поскольку я должен игнорировать события клавиш UP/DOWN и брать их на себя (загружать фрагменты из файла), событие ENTERITEM не происходит, когда строка изменяется с клавиатуры. Но ничего, я решил проблему. MARKED, NULL мне не хватило. Кроме того, легко получить выбранную строку в матрице любого цвета после отмены встроенного режима MARKMODE. Существовало ли какое-либо сообщество (например, форумы), где человек мог бы получить оперативные ответы на проблемы с IUP или внести свой вклад в такой красивый и уникальный проект? - person Wine Too; 12.04.2013
comment
Да, у IUP есть список рассылки: lists.sourceforge.net/lists/listinfo/iup- пользователи - person Antonio Scuri; 29.04.2013