如何解决wxTextCtrl 调整大小问题
我正在创建一个 wxWidgets C++ 计算器应用程序。我有一系列用于主要表达式文本和其他内容的 wxTextCtrl
。当然,它们是使用 sizer 定位的,这样当我调整窗口大小时它们会变大或变小。但是,如果我最大化窗口,它们的大小会成功更新,但如果我将其最小化,则不会。
我的应用处于正常状态:
最大化应用:
当我将其最小化时:
当我调整窗口大小时,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 举报,一经查实,本站将立刻删除。