微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wxTE_MULTILINE 标志打破 wxTextCtrl 字体缩放

如何解决wxTE_MULTILINE 标志打破 wxTextCtrl 字体缩放

我正在使用 wxWidgets 构建一个应用程序。我有一个 wxTextCtrl 像这样创建:

Expression = new wxTextCtrl(this,wxID_ANY,"",wxDefaultPosition,wxDefaultSize,wxTE_READONLY | wxNO_BORDER | wxTE_RIGHT );
Expression->SetForegroundColour(wxColour(55,55,55));
Expression->Bind(wxEVT_TEXT,[this](wxCommandEvent& evt) { Expression_Update(); evt.Skip(); });
Expression->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) { Expression_Update(); evt.Skip(); });
sizer->Add(Expression,10,wxEXPAND);

它绑定到一个 Expression_Update() 函数,该函数应该正确缩放其字体。

void Main::Expression_Update()
{
    wxString text = Expression->GetValue();
    const int MaxWidth = GetSize().GetWidth();

    int X,Y = Expression->GetSize().GetHeight();

    wxFont* font = new wxFont(
        wxSize(wxSize(0,Y / 1.3)),wxFONTFAMILY_SWISS,wxFONTSTYLE_norMAL,wxFONTWEIGHT_BOLD,false,"Calibri"
    );

    Expression->GetTextExtent(text,&X,nullptr,NULL,font);

    if ((X + EXP_ANTI_CLIPPING_COEF) > MaxWidth)
    {
        do
        {
            int const fontHeight = font->GetPixelSize().GetHeight();
            font->SetPixelSize(wxSize(0,fontHeight - 2));
            Expression->GetTextExtent(text,font);
        } while ((X + EXP_ANTI_CLIPPING_COEF) > MaxWidth);
    }

    Expression->SetFont(*font);
    delete font;
}

代码运行良好。但是,如果我将 wxTE_MULTILINE 标志添加到构造函数中:

Expression = new wxTextCtrl(this,wxTE_READONLY | wxNO_BORDER | wxTE_RIGHT | wxTE_MULTILINE );

...当我调整窗口大小时,wxTextCtrl 会越来越大,直到填满整个框架。 我自己做了一些调试,我发现了问题:

int X,Y = Expression->GetSize().GetHeight();

如果没有 wxTE_MULTILINE 标志,Y 的起始值为 88,并在我调整大小时根据控件的高度正确更改。但是设置了多行标志后,Y 从 88 开始,当我调整窗口大小时,无论窗口高度是否增加,该值都会更改为 164,而当我再次调整大小时,会更改为 308,依此类推。

TLDR: GetSize().GetHeight() 方法返回错误的高度值,导致字体越来越大,直到文本控件填满整个窗口。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。