User 13204940 Ответов: 1

Пользовательский текстовый редактор проблема ширины символов


Привет,

Я пишу пользовательский текстовый редактор, используя моноширинный шрифт Consolas в 16px. Курсор получает дополнительные 8,8 пикселя левого поля, когда он перемещается над каждым курсором вправо. Однако при использовании длинных строк это становится несинхронным с символами, поэтому их ширина не может быть точно 8,8 пикселей. Я ничего не могу найти в интернете о соотношении сторон Consolas, поэтому не знаю, что мне делать.

Если бы вы могли дать какие-то указания, это было бы действительно полезно.

Код, упомянутый в комментариях:

var start_pos = LineOperations.convert_char_focused_to_actual_char(start_index) * (CHAR_WIDTH + 0.35);
	var end_pos = (LineOperations.convert_char_focused_to_actual_char(end_index) * (CHAR_WIDTH + 0.35)) - start_pos;
	
	text_highlight_history.push(fill_rect(text_highlight_overlay_context, Math.round(start_pos), 23 * line_focused, Math.round(end_pos), 23, Config.text_highlight_colour));


Примечание: convert_char_focused_to_actual_char был тщательно протестирован и работает, как и ожидалось. Он находит положение выбранного символа в строке, рассматривая вкладки как 4 символа.

Что я уже пробовал:

Сужение числа, но мне неудобно использовать такие точные десятичные дроби, так как я не могу гарантировать, что оно будет выглядеть правильно для любой заданной длины строки.

Richard MacCutchan

Вы уверены, что это вопрос Javascript?

[no name]

Потенциально. Текстовый редактор написан на языке Javascript.

Richard MacCutchan

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

[no name]

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

Richard MacCutchan

Извините, но я все еще не совсем понимаю, в чем ваша настоящая проблема. Если вы выводите символы моноширинным шрифтом с левого поля, то они всегда должны точно совпадать с символами других строк.

[no name]

Символы выстраиваются нормально, проблема была в неуместном наборе скобок, который приводил к смещению поля курсора, как будто он отставал от символов.

Теперь у меня есть еще одна проблема, которая заключается в том, когда я пытаюсь выбрать текст. Я получаю начальную позицию символа, и по мере движения мыши я получаю ближайший символ к курсору и, используя наложенный холст, рисую прямоугольник. Однако теперь это отстает, и мне нужно добавить 0,35 к ширине символа, чтобы он выглядел правильно. Однако я не могу попробовать очень длинные строки, поэтому я не уверен, что это точно, независимо от длины строки.

Я обновил свой вопрос соответствующим кодом

Richard MacCutchan

Можете ли вы получить фактическое положение мыши и использовать эти значения для поиска ближайшего целого символа? Я никогда не пробовал этого в Javascript, но в Windows с помощью C/C++ вы можете захватывать позиции мыши и использовать возвращаемые значения.

[no name]

Да, я сделал это, и он отлично вычисляет позиции, но он не рисует прямоугольник достаточно долго. Он рассчитывается на основе ширины символа 8.8, поэтому 8.8 недостаточно велик. Он только немного отстает, но с более длинными строками он будет на несколько символов короче.

Richard MacCutchan

Ваш вопрос цитирует ширину символа как 16px, а интервал-как 8.8.

[no name]

Нет, я пробовал и ошибался и вижу, что при установке размера шрифта 16 пикселей символы имеют ширину около 8,8 пикселей.

Richard MacCutchan

16px не может равняться 8.8 px. Я подозреваю, что вы используете размер шрифта 16 точки.

[no name]

Ширина и высота не одно и то же. Когда я устанавливаю размер шрифта на 16 пикселей, символы имеют высоту 16 пикселей и ширину X пикселей. X составляет приблизительно 8,8.