Пользовательский текстовый редактор проблема ширины символов
Привет,
Я пишу пользовательский текстовый редактор, используя моноширинный шрифт 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.