Как установить маски полей в Scintilla?

У меня проблема с пониманием того, как маркеры 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. Я был бы рад, если кто-нибудь может объяснить, как должны быть установлены маски.


person HypnoToad    schedule 21.11.2014    source источник


Ответы (1)


Доступно 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);
person ekhumoro    schedule 21.11.2014