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

wxTextCtrl 调整大小问题

如何解决wxTextCtrl 调整大小问题

我正在创建一个 wxWidgets C++ 计算器应用程序。我有一系列用于主要表达式文本和其他内容wxTextCtrl。当然,它们是使用 sizer 定位的,这样当我调整窗口大小时它们会变大或变小。但是,如果我最大化窗口,它们的大小会成功更新,但如果我将其最小化,则不会。

我的应用处于正常状态:

Normal

最大化应用:

Maximized

当我将其最小化时:

Minimized

当我调整窗口大小时,wxTextCtrl 的大小最终会更新并自行更正,但是这个错误有点烦人。

以下是定义这些控件的代码

text_controls.cpp

#include "main.h"

void Main::AddTextControls()
{
    auto sizer = new wxBoxSizer(wxVERTICAL);

    Chronology = new wxTextCtrl(this,wxID_ANY,"",wxDefaultPosition,wxDefaultSize,wxTE_READONLY | wxNO_BORDER | wxTE_RIGHT);
    Chronology->SetBackgroundColour(wxColour(235,235,235));
    Chronology->SetForegroundColour(wxColour(105,105,105));
    Chronology->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        Chronology->SetFont(
            wxFontInfo(wxSize(0,Chronology->GetSize().y / 1.5))
            .Family(wxFONTFAMILY_SWISS)
            .FaceName("Calibri Light")
        );
    });
    sizer->Add(Chronology,4,wxEXPAND);

    Expression = new wxTextCtrl(this,wxTE_READONLY | wxNO_BORDER | wxTE_RIGHT);
    Expression->SetForegroundColour(wxColour(55,55,55));
    Expression->Bind(wxEVT_TEXT,&Main::OnTextChange,this);
    Expression->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        Expression->SetFont(
            wxFontInfo(wxSize(0,Expression->GetSize().y / 1.3))
                .Family(wxFONTFAMILY_SWISS)
                .FaceName("Calibri")
                .Bold()
        );
    });
    sizer->Add(Expression,10,wxEXPAND);

    //memoria
    auto memSizer = new wxBoxSizer(wxHORIZONTAL);

    MemText = new wxTextCtrl(this,"Memoria",wxTE_READONLY | wxNO_BORDER);
    MemText->SetBackgroundColour(wxColour(55,55));
    MemText->SetForegroundColour(wxColour(119,119,119));
    MemText->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        MemText->SetFont(
            wxFontInfo(wxSize(0,MemText->GetSize().y / 1.3))
            .Family(wxFONTFAMILY_SWISS)
            .FaceName("Corbel")
        );
        });
    memSizer->Add(MemText,25,wxEXPAND);

    Memory = new wxTextCtrl(this,"0",wxTE_READONLY | wxNO_BORDER | wxTE_RIGHT);
    Memory->SetBackgroundColour(wxColour(55,55));
    Memory->SetForegroundColour(wxColour(105,105));
    Memory->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        Memory->SetFont(
            wxFontInfo(wxSize(0,Memory->GetSize().y / 1.3))
            .Family(wxFONTFAMILY_SWISS)
            .FaceName("Calibri Light")
        );
        });
    memSizer->Add(Memory,100,wxEXPAND);

    sizer->Add(memSizer,3,wxEXPAND);

    MainSizer->Add(sizer,30,wxEXPAND);
}

有人解决了吗?另外,我对 wxWidgets 很陌生。

编辑: 遵循建议并将此代码添加到我的主框架构造函数中:

Main::Main() : wxFrame(nullptr,"IKE Calculator",wxSize(525,650),wxDEFAULT_FRAME_STYLE)
{
    this->SetMinSize(wxSize(325,450));

    FrameSize = this->GetSize();
    MainSizer = new wxBoxSizer(wxVERTICAL);

    this->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        CallAfter(Layout()); //will be called later
        });

    this->SetBackgroundColour(wxColour(70,73,101));

    AddTextControls();
    AddMainButtons();
    AddButtons();

    this->SetSizer(MainSizer);
    MainSizer->Layout();
}

在 VS2019 中出现 C2064 错误The term doesn't return a function that accepts 0 arguments

编辑:

CallAfter(Layout()); 更改为 CallAfter(&Main::Layout);,但我遇到了同样的错误

解决方法

让我改写您的描述:

“当我手动或通过最大化更改窗口大小时,一切顺利。但是当我从最大化状态恢复窗口时,字体会错误地更新”

如果字体必须根据窗口的大小进行相应的更改,则必须在控件中捕获大小事件。处理程序获取具有控件新大小的 wxSizeEvent 对象。
==>> 所以在你的 evt.GetSize() lambdas 中使用这个新的大小(即 control.GetSize())而不是 control->Bind(wxEVT_SIZE...)

问题来自 wxSizer 的 layout-process 使用控件中的当前字体来计算新大小的事实。因此,当您收到 size-event 时已经太晚了,无法将新的 font-size 考虑在内。
所以,当窗口再次调整大小时,与上一个大小或多或少相同,那么旧字体大小与新字体大小相同,然后一切都匹配。

你能做什么?
捕获整个窗口的大小事件(仍然使用您的处理程序来更改字体)并在处理程序完成后调用 'Layout()':

 MyFrame->Bind(wxEVT_SIZE,[this](wxSizeEvent& evt) {
        evt.Skip();
        CallAfter(Layout()); //will be called later
        });

第二个“布局”(第一个在 sizer 的代码中触发)可能会显示一些闪烁。

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