亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

解決MyGUI中文換行的問題

2020-02-24 14:25:37
字體:
來源:轉載
供稿:網友

這是一篇解決MyGUI中文換行的問題的文章,我相信你已經解決了中文輸入將遇到如何解決中文輸入的問題,中文換行問題是很多gui框架都存在的一個問題,在此就不再廢話了,大家打開mygui的引擎層中的widget的textview 的頭文件和源文件將其替換為:

?

/*!
@file
@author Albert Semenov
@date 09/2009
*/
#ifndef __MYGUI_TEXT_VIEW_DATA_H__
#define __MYGUI_TEXT_VIEW_DATA_H__
#include "MyGUI_Prerequest.h"
namespace MyGUI
{
class CharInfo
{
public:
CharInfo() :
mIsColour(false)
{
mMetrics.mWidth = 0.0f;
mMetrics.mHeight = 0.0f;
mMetrics.mAdvance = 0.0f;
mMetrics.mBearingX = 0.0f;
mMetrics.mBearingY = 0.0f;
}
CharInfo(
const FloatRect& _rect,
float _width,
float _height,
float _advance,
float _bearingX,
float _bearingY) :
mIsColour(false),
mUVRect(_rect)
{
mMetrics.mWidth = _width;
mMetrics.mHeight = _height;
mMetrics.mAdvance = _advance;
mMetrics.mBearingX = _bearingX;
mMetrics.mBearingY = _bearingY;
}
CharInfo(uint32 _colour) :
mIsColour(true),
mColour(_colour)
{ }
bool isColour() const
{
return mIsColour;
}
float getWidth() const
{
return mMetrics.mWidth;
}
float getHeight() const
{
return mMetrics.mHeight;
}
float getAdvance() const
{
return mMetrics.mAdvance;
}
float getBearingX() const
{
return mMetrics.mBearingX;
}
float getBearingY() const
{
return mMetrics.mBearingY;
}
const FloatRect& getUVRect() const
{
return mUVRect;
}
uint32 getColour() const
{
return mColour;
}
private:
bool mIsColour;
FloatRect mUVRect;
struct Metrics
{
float mWidth;
float mHeight;
float mAdvance;
float mBearingX;
float mBearingY;
};
union
{
Metrics mMetrics;
uint32 mColour;
};
};
typedef std::vector<CharInfo> VectorCharInfo;
//struct LineInfo
//{
// LineInfo() :
// width(0),
// offset(0),
// count(0)
// {
// }
// void clear()
// {
// width = 0;
// count = 0;
// simbols.clear();
// offset = 0;
// }
// int width;
// int offset;
// size_t count;
// VectorCharInfo simbols;
//};
struct LineInfo
{
LineInfo() :
width(0),
offset(0),
count(0),
offcount(0)
{
}
void clear()
{
offcount = 0;
width = 0;
count = 0;
simbols.clear();
offset = 0;
}
int offcount;
int width;
int offset;
size_t count;
VectorCharInfo simbols;
};
typedef std::vector<LineInfo> VectorLineInfo;
} // namespace MyGUI
#endif // __MYGUI_TEXT_VIEW_DATA_H__


上面是頭文件,下面是源文件:

?

?

?


/*!
@file
@author Albert Semenov
@date 09/2010
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_TextView.h"
namespace MyGUI
{
namespace
{
template<typename T>
void setMin(T& _var, const T& _newValue)
{
if (_newValue < _var)
_var = _newValue;
}
template<typename T>
void setMax(T& _var, const T& _newValue)
{
if (_var < _newValue)
_var = _newValue;
}
}
class RollBackPoint
{
public:
RollBackPoint() :
position(0),
count(0),
width(0),
rollback(false)
{
}
void set(size_t _position, UString::const_iterator& _space_point, size_t _count, float _width)
{
position = _position;
space_point = _space_point;
count = _count;
width = _width;
rollback = true;
}
void clear()
{
rollback = false;
}
bool empty() const
{
return !rollback;
}
float getWidth() const
{
MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid");
return width;
}
size_t getCount() const
{
MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid");
return count;
}
size_t getPosition() const
{
MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid");
return position;
}
UString::const_iterator getTextIter() const
{
MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid");
return space_point;
}
private:
size_t position;
UString::const_iterator space_point;
size_t count;
float width;
bool rollback;
};
TextView::TextView() :
mLength(0),
mFontHeight(0)
{
}
void TextView::update(const UString& _text, IFont* _font, int _height, Align _align, VertexColourType _format, int _maxWidth)
{
mFontHeight = _height;
// массив для быстрой конвертации цветов
static const char convert_colour[64] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
mViewSize.clear();
RollBackPoint roll_back;
IntSize result;
float width = 0.0f;
size_t count = 0;
mLength = 0;
mLineInfo.clear();
LineInfo line_info;
int font_height = _font->getDefaultHeight();
UString::const_iterator end = _text.end();
UString::const_iterator index = _text.begin();
/*if (index == end)
return;*/
result.height += _height;
for (; index != end; ++index)
{
Char character = *index;
// новая строка
if (character == FontCodeType::CR
|| character == FontCodeType::NEL
|| character == FontCodeType::LF)
{
if (character == FontCodeType::CR)
{
UString::const_iterator peeki = index;
++peeki;
if ((peeki != end) && (*peeki == FontCodeType::LF))
index = peeki; // skip both as one newline
}
line_info.width = (int)ceil(width);
line_info.count = count;
//mLength += line_info.count + 1;
mLength += line_info.offcount;
result.height += _height;
setMax(result.width, line_info.width);
width = 0;
count = 0;
mLineInfo.push_back(line_info);
line_info.clear();
// отменяем откат
roll_back.clear();
continue;
}
// тег
else if (character == L'#')
{
// берем следующий символ
++ index;
if (index == end)
{
--index; // это защита
continue;
}
character = *index;
// если два подряд, то рисуем один шарп, если нет то меняем цвет
if (character != L'#')
{
// парсим первый символ
uint32 colour = convert_colour[(character - 48) & 0x3F];
// и еще пять символов после шарпа
for (char i = 0; i < 5; i++)
{
++ index;
if (index == end)
{
--index; // это защита
continue;
}
colour <<= 4;
colour += convert_colour[ ((*index) - 48) & 0x3F ];
}
// если нужно, то меняем красный и синий компоненты
texture_utility::convertColour(colour, _format);
line_info.simbols.push_back( CharInfo(colour) );
continue;
}
}
GlyphInfo* info = _font->getGlyphInfo(character);
if (info == nullptr)
continue;
if (FontCodeType::Space == character)
{
roll_back.set(line_info.simbols.size(), index, count, width);
}
else if (FontCodeType::Tab == character)
{
roll_back.set(line_info.simbols.size(), index, count, width);
}
float char_width = info->width;
float char_height = info->height;
float char_advance = info->advance;
float char_bearingX = info->bearingX;
float char_bearingY = info->bearingY;
if (_height != font_height)
{
float scale = (float)_height / font_height;
char_width *= scale;
char_height *= scale;
char_advance *= scale;
char_bearingX *= scale;
char_bearingY *= scale;
}
float char_fullAdvance = char_bearingX + char_advance;
// перенос слов
if (_maxWidth != -1
&& (width + char_fullAdvance) > _maxWidth
/*&& !roll_back.empty()*/)
{
--index;
// откатываем до последнего пробела
/*width = roll_back.getWidth();
count = roll_back.getCount();
index = roll_back.getTextIter();
line_info.simbols.erase(line_info.simbols.begin() + roll_back.getPosition(), line_info.simbols.end());*/

// запоминаем место отката, как полную строку
/*line_info.width = (int)ceil(width);
line_info.count = count;
mLength += line_info.count + 1;
result.height += _height;
setMax(result.width, line_info.width);
width = 0;
count = 0;
mLineInfo.push_back(line_info);
line_info.clear();*/
// запоминаем место отката, как полную строку
line_info.width = (int)ceil(width);
line_info.count = count;
line_info.offcount = 0;
mLength += line_info.count;// + 1;
result.height += _height;
setMax(result.width, line_info.width);
width = 0;
count = 0;
mLineInfo.push_back(line_info);
line_info.clear();
// отменяем откат
roll_back.clear();
continue;
}
line_info.simbols.push_back(CharInfo(info->uvRect, char_width, char_height, char_advance, char_bearingX, char_bearingY));
width += char_fullAdvance;
count ++;
}
line_info.width = (int)ceil(width);
line_info.count = count;
mLength += line_info.count;
mLineInfo.push_back(line_info);
setMax(result.width, line_info.width);
// теперь выравниванием строки
for (VectorLineInfo::iterator line = mLineInfo.begin(); line != mLineInfo.end(); ++line)
{
if (_align.isRight())
line->offset = result.width - line->width;
else if (_align.isHCenter())
line->offset = (result.width - line->width) / 2;
}
mViewSize = result;
}
size_t TextView::getCursorPosition(const IntPoint& _value)
{
const int height = mFontHeight;
size_t result = 0;
int top = 0;
for (VectorLineInfo::const_iterator line = mLineInfo.begin(); line != mLineInfo.end(); ++line)
{
// это последняя строка
bool lastline = !(line + 1 != mLineInfo.end());
// наша строчка
if (top + height > _value.top || lastline)
{
top += height;
float left = (float)line->offset;
int count = 0;
// ищем символ
for (VectorCharInfo::const_iterator sim = line->simbols.begin(); sim != line->simbols.end(); ++sim)
{
if (sim->isColour())
continue;
float fullAdvance = sim->getAdvance() + sim->getBearingX();
if (left + fullAdvance / 2.0f > _value.left)
{
break;
}
left += fullAdvance;
count ++;
}
result += count;
break;
}
if (!lastline)
{
top += height;
result += line->count + line->offcount;

}
}
return result;
}
IntPoint TextView::getCursorPoint(size_t _position)
{
setMin(_position, mLength);
size_t position = 0;
int top = 0;
float left = 0.0f;
for (VectorLineInfo::const_iterator line = mLineInfo.begin(); line != mLineInfo.end(); ++line)
{
left = (float)line->offset;
if (position + line->count >= _position)
{
for (VectorCharInfo::const_iterator sim = line->simbols.begin(); sim != line->simbols.end(); ++sim)
{
if (sim->isColour())
continue;
if (position == _position)
break;
position ++;
left += sim->getBearingX() + sim->getAdvance();
}
break;
}
position += line->count + line->offcount;

top += mFontHeight;
}
return IntPoint((int)left, top);
}
const IntSize& TextView::getViewSize() const
{
return mViewSize;
}
size_t TextView::getTextLength() const
{
return mLength;
}
const VectorLineInfo& TextView::getData() const
{
return mLineInfo;
}
} // namespace MyGUI


修改了這兩個以后,然后將edit控件改為多行支持和自動換行,這樣就實現了mygui的中文自動換行問題。

好啦,以上就是解決MyGUI中文換行的問題,你都了解清楚了嗎?相信經過小編這詳細的解說,你一定get到點子上了,如果你是個愛學習的同學,那怎可錯過繼續關注武林技術頻道呢,是不。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频免费观看高清中文| 国产一区二区动漫| 欧美高清videos高潮hd| 国外视频精品毛片| 欧美丝袜一区二区| 亚洲小视频在线观看| 亚洲日本欧美中文幕| 欧美区二区三区| 性欧美暴力猛交69hd| 欧美日韩美女在线| 国产偷国产偷亚洲清高网站| 国产精品久久久久久婷婷天堂| 中文字幕日韩在线视频| 欧美激情视频网| 国产精品久久久久国产a级| 中日韩美女免费视频网站在线观看| 91丝袜美腿美女视频网站| 精品福利樱桃av导航| 国产午夜精品视频| 国产成人黄色av| 国产精品欧美一区二区| 欧美在线亚洲在线| 成人中文字幕在线观看| 精品久久久久久久久中文字幕| 国产精品一区二区三区免费视频| 精品国产视频在线| 国产日韩精品一区二区| 福利一区福利二区微拍刺激| 久热国产精品视频| 国产欧美日韩精品丝袜高跟鞋| 不卡av在线网站| 日韩成人在线视频观看| 日本在线精品视频| 欧美日韩中文字幕在线视频| 成人免费观看49www在线观看| 日韩美女视频免费看| 久久97精品久久久久久久不卡| 欧美激情亚洲国产| 日韩电影大全免费观看2023年上| 亚洲高清久久久久久| 久久精品成人欧美大片古装| 日韩a**站在线观看| 美女国内精品自产拍在线播放| 主播福利视频一区| 欧美电影免费观看高清| 久久大大胆人体| 欧美激情在线狂野欧美精品| 日韩成人中文字幕在线观看| 国产成人avxxxxx在线看| 亚洲精品免费av| 亚洲人精品午夜在线观看| 亚洲一区精品电影| 日韩成人在线观看| 国产裸体写真av一区二区| 欧美日韩中文在线观看| 97超级碰碰人国产在线观看| 久久久国产精品免费| 国产拍精品一二三| 91免费精品国偷自产在线| 亚洲综合在线做性| 成人免费网站在线观看| 成人黄色激情网| 欧美日韩在线看| 欧美国产日韩一区二区三区| 日韩在线资源网| 国产精品视频不卡| 亚洲美女www午夜| 欧美高清视频在线| 欧美成人性色生活仑片| 日韩电影在线观看永久视频免费网站| 日本高清视频精品| 另类天堂视频在线观看| 欧美精品国产精品日韩精品| 国产精品一区二区三区久久| 在线看日韩av| 成人网欧美在线视频| 97成人超碰免| 久久久国产精彩视频美女艺术照福利| 国产一区二区日韩精品欧美精品| 一区二区欧美在线| 亚洲色图五月天| 亚洲日韩第一页| 国产精品精品一区二区三区午夜版| 黑人巨大精品欧美一区免费视频| 精品日韩中文字幕| 亚洲天堂av图片| 亚洲成人在线视频播放| 亚洲一区二区三| 国产精品视频自拍| 高跟丝袜一区二区三区| 国产精品第一页在线| 国产成人精品日本亚洲专区61| 国产一区二区三区欧美| 欧美华人在线视频| 国产一区二区三区在线播放免费观看| 精品久久久久久久久久久久久| 午夜欧美大片免费观看| 国产精品91久久久久久| 国产精品扒开腿做爽爽爽的视频| 国模私拍视频一区| 伊人伊成久久人综合网站| 18久久久久久| 亚洲精品久久久久久久久| 97视频色精品| 久久精品亚洲国产| 亚洲欧洲视频在线| 国产精品视频区| 欧美极品少妇xxxxⅹ免费视频| 992tv在线成人免费观看| 日韩精品亚洲元码| 欧美一级淫片videoshd| 亚洲欧美在线x视频| 国产日韩欧美91| 亚洲人成77777在线观看网| 国产成人综合亚洲| 欧美日韩黄色大片| 亚洲欧美日韩精品| 亚洲国产日韩欧美在线图片| 欧美三级xxx| 亚洲女人初尝黑人巨大| 亚洲少妇中文在线| 中文字幕精品网| 欧美国产日韩免费| 午夜精品久久久久久久99热| 亚洲高清不卡av| 亚洲午夜久久久影院| 久久久久久久久久国产| 国内免费精品永久在线视频| 97超级碰碰人国产在线观看| 精品久久久久久久久久久久久久| 日本精品在线视频| 日韩av网站在线| 欧美视频在线免费| 欧美在线播放视频| 姬川优奈aav一区二区| 日韩av第一页| 精品国产区一区二区三区在线观看| 欧美在线视频在线播放完整版免费观看| 亚洲欧美国内爽妇网| xxx成人少妇69| 久久91亚洲人成电影网站| 欧美在线视频网| 国产在线观看91精品一区| 国产精品美女午夜av| 久久成人免费视频| 欧美性xxxx在线播放| 日韩在线高清视频| 91免费国产视频| 久久久久久久久91| 日韩av快播网址| 国产在线精品播放| 国产精品久久久久久久久久久久| 亚洲四色影视在线观看| 国产精品久久久久7777婷婷| 91网站免费观看| 97在线视频国产| 久久久亚洲天堂| 午夜剧场成人观在线视频免费观看| 一本色道久久88综合日韩精品| 久久综合色影院| 亚洲人成电影在线观看天堂色| 亚洲在线视频观看| 中文字幕一区二区精品| 久久久精品2019中文字幕神马|