Member 13623637 Ответов: 2

Как я могу центрировать текст в прямоугольнике?


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

#include <iostream>
#include <cstring>
#включить <fstream>
#включить <graphics.h>
#include <winbgim.h>

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

Я пробовал разные методы, в основном пытаясь найти некоторые фиксированные переменные для некоторых фиксированных координат (например, прямоугольник(x1+98, x2+91, x3+98, x4+13) и т. д.). Кроме того, я попытался использовать функцию textwidth (x1/2-textwidth/2), но не смог найти метод.

2 Ответов

Рейтинг:
20

Jochen Arndt

Вы должны определить размер текста в пикселях и рассчитать верхнюю и левую позиции для центрирования в заданном прямоугольнике:

int text_w = textwidth(textstring);
int text_h = textheight(textstring);
int rect_w = rect_right - rect_left;
int rect_h = rect_bottom - rect_top;
int x = rect_left + (rect_w - text_w) / 2;
int y = rect_top + (rect_h - text_h) / 2;
rectangle(rect_left, rect_top, rect_right, rect_bottom);
outtextxy(x, y, textstring);


CPallini

Наверное так и должно быть
х = (rect_w - text_w) / 2 + rect_left;
и так далее.

Jochen Arndt

Ой.
Спасибо, Карло.

Рейтинг:
10

CPallini

Конечно textwidth (так же как textheight) - это правильный путь. Если W это ширина прямоугольника и w это ширина текста текст должен быть помещен по адресу x = X + (W-w)/2 (где X это прямоугольник горизонтальное положение и x это горизонтальное положение текста).
Там может быть некоторое дополнительное смещение, но вы должны быть в состоянии определить его экспериментально.


Member 13623637

int gd = DETECT, gm;
    initgraph(&gd, &gm, NULL);
    int rect_left = 123, rect_top = 17 , rect_right = 183 , rect_bottom = 37 ;
    int text_w = textwidth("FII");
    int text_h = textheight("FII");
    int rect_w = rect_right - rect_left;
    int rect_h = rect_bottom - rect_top;
    int x = (rect_w - text_w) / 2;
    int y = (rect_h - text_h) / 2;
    rectangle(rect_left, rect_top, rect_right, rect_bottom);
    outtextxy(x, y, "FII");
    getch();
    closegraph();


Поэтому я попробовал код Йохена Арндта и вот что получилось: изображение. Также попробовал добавить
x = rect_w + ((rect_w - text_w) / 2)
но все что он делает это приближается к прямоугольнику: изображение

Кроме того, CPallini, как я могу узнать горизонтальное положение? Является ли это операцией между rect_top и rect_bottom? Извините, что беспокою вас, ребята, но я вроде как новичок в этом деле.

CPallini

Если вы используете Йохен код затем добавьте rect_left, к икс: именно
х = rect_left + (rect_w - text_w)/2;