Как установить маржинальные маски в Scintilla?

У меня проблемы с пониманием того, как маркеры сцинтиллы связаны с полем.
Допустим, я хочу 3 поля. 1-й для белья (здесь нет проблем), 2-й только для маркеров стрел и 3-й только для кругов. Из документации я знаю, что мне нужно указать маржинальные маски для привязки маркера к марже, но я не понимаю, как указать маску. Я немного попробовал, но так и не получил желаемого результата. (Либо стрелки отображались на обоих полях (2-й и 3-й), либо символ не был выделен, а линия была выделена цветом). Надеюсь, что кто-то может просветить меня, как установить маржинальные маски.

/* 2nd marker margin -> only arrows */
Call(SCI_SETMARGINTYPEN, 1, SC_MARGIN_SYMBOL);
Call(SCI_SETMARGINWIDTHN, 1, 20);
Call(SCI_SETMARGINSENSITIVEN, 1, 1);
Call(SCI_SETMARGINMASKN, 1, SC_MARK_ARROW);    // <=== ???
DefineMarker(1, SC_MARK_ARROW, 0xffffff, 0x0000ff);

/* 3rd marker margin -> only circles */
Call(SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL);
Call(SCI_SETMARGINWIDTHN, 2, 50);
Call(SCI_SETMARGINSENSITIVEN, 2, 1);

DefineMarker(2, SC_MARK_CIRCLE, 0xffffff, 0x00ff00);
Call(SCI_SETMARGINMASKN, 2, SC_MARK_CIRCLE);    // <=== ???

Call(SCI_MARKERADD, 1, 1);
Call(SCI_MARKERADD, 1, 2);

Таким образом, я получаю маркер стрелки на поле 1, но только выделенную линию и нет маркера круга для поля 2. Я был бы рад, если бы кто-то мог объяснить, как должны быть установлены маски.

2

Решение

Доступно 32 маркера, а числа от 0 до 24 не имеют предопределенного использования. Числа от 25 до 31 используются для складывания, но если вам это не нужно, вы также можете использовать эти числа.

Первый шаг — выбрать номер для каждого из маркеров, которые вы хотите установить: скажем, 4 для стрел и 5 для кругов (вероятно, для них должны быть определены некоторые константы).

Маска поля является 32-битным значением. Чтобы установить его, вам нужно перевернуть бит, соответствующий каждому из номеров маркеров, которые должны быть включены для этого поля:

    Call(SCI_SETMARGINMASKN, 1, 1 << 4); // 2nd margin, arrow marker
Call(SCI_SETMARGINMASKN, 2, 1 << 5); // 3rd margin, circle marker

Тогда вам нужно определить сами маркеры:

    DefineMarker(4, SC_MARK_ARROW, 0xffffff, 0x0000ff);
DefineMarker(5, SC_MARK_CIRCLE, 0xffffff, 0x00ff00);

Таким образом, вы можете, наконец, добавить их к определенной строке:

    Call(SCI_MARKERADD, 1, 4);
Call(SCI_MARKERADD, 1, 5);
3

Другие решения


По вопросам рекламы [email protected]