Измерьте границы текста в GDI+ в C ++ для текста с очертаниямиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Измерьте границы текста в GDI+ в C ++ для текста с очертаниями

Сообщение Anonymous »

Я пытаюсь сделать функцию для расчета границ текста с очертаниями. МЕТОД НОРМАЛЬНОЕ Измерение не может сделать это должным образом. Таким образом, способ, которым я это делаю, является созданием GraphicsPath , используя AddString , чтобы добавить текст, а затем использовать расширение для учета очерчений. После этого я называю GetBounds на пути.
Однако границы неверны. Я устанавливаю размер шрифта на 70, но рассчитанная высота составляет около 50. Ширина также неточна.

Код: Выделить всё

Winpp::Vector2 Winpp::Text::CalculateSize(std::wstring text, Winpp::Font font) {
Gdiplus::GraphicsPath path;
Gdiplus::Point orgn(0, 0);
std::string fn = font.GetFontName();
Gdiplus::FontFamily fm(std::wstring(fn.begin(), fn.end()).c_str());

INT st = Gdiplus::FontStyleRegular;
if (font.IsBold())      st |= Gdiplus::FontStyleBold;
if (font.IsItalic())    st |= Gdiplus::FontStyleItalic;
if (font.IsStrikeout()) st |= Gdiplus::FontStyleStrikeout;
if (font.IsUnderline()) st |= Gdiplus::FontStyleUnderline;

Gdiplus::REAL emSize = font.GetFontSize(); // For example, 70
path.AddString(text.c_str(), text.size(), &fm, st, emSize, orgn, nullptr);

// Optional: path.Widen(&pen); for outlines

Gdiplus::RectF rect;
path.GetBounds(&rect);

return Vector2(std::ceil(rect.Width), std::ceil(rect.Height));
}
Примечание: winpp :: font и winpp :: vector2 - это пользовательские классы, которые я сделал. Я ожидал, что ограничивающая коробка точно соответствует тексту, но результат неверен - высота слишком мала и зажимает почти половину текста, и ширина не включает последний персонаж.

Подробнее здесь: https://stackoverflow.com/questions/797 ... h-outlines
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»