【发布时间】:2021-06-01 13:32:20
【问题描述】:
如何使用 WxWidget 使 cpp Windows 中的 wxStaticText(单行)中的文本垂直居中?
例如,如果我使用默认字体大小增加 wxStaticText(单行)的高度,则文本顶部对齐,我希望它垂直居中。
【问题讨论】:
如何使用 WxWidget 使 cpp Windows 中的 wxStaticText(单行)中的文本垂直居中?
例如,如果我使用默认字体大小增加 wxStaticText(单行)的高度,则文本顶部对齐,我希望它垂直居中。
【问题讨论】:
我认为文本控件不支持垂直文本对齐样式。据我所知,如果你想创建一个文本垂直居中的文本控件,唯一的方法就是伪造它。
这可以通过创建一个无边框文本控件然后将该文本控件居中在另一个窗口中来完成,该窗口的唯一目的是看起来像文本控件的边框
wxPanel* pseudoText = new wxPanel(<parent>, wxID_ANY, wxDefaultPosition,
wxDefaultSize,
wxBORDER_THEME|wxTAB_TRAVERSAL);
wxTextCtrl* text = new wxTextCtrl(pseudoText, wxID_ANY, wxString(),
wxDefaultPosition, wxDefaultSize,
wxTE_CENTRE|wxBORDER_NONE);
pseudoText->SetBackgroundColour(text->GetBackgroundColour());
wxBoxSizer* szr = new wxBoxSizer(wxVERTICAL);
szr->AddStretchSpacer();
szr->Add(text, wxSizerFlags().Expand());
szr->AddStretchSpacer();
pseudoText->SetSizer(szr);
在 Windows 上,这看起来像是一个文本垂直居中的文本控件:
边框略有错误,但我认为这是可以做到的最好的。
【讨论】:
你的 wxStaticText 应该包含在 sizer 中。如果不是,那么我建议您阅读有关 sizer 的内容并开始使用它们。市面上有一些不错的(免费和商业)UI 编辑器,使用起来非常容易。
wxStaticText 本身只有将文本水平居中的选项(可能是底层操作系统的限制),但是当您将 wxStaticText 控件添加到 sizer 时,您可以指定任何对齐方式(CENTER_VERTICALLY、CENTER_HORIZONTALLY 等...)。
例子:
wxBoxSizer *mysizer=new wxBoxSizer...
wxStaticText *sometext=new wxStaticText...
mysizer->Add(sometext, 0, wxALIGN_CENTER_VERTICAL);
重要的是,sizer 本身填充了您希望将文本垂直居中的整个空间。查看 wxWidgets sizer 示例。您需要对 sizer 的工作原理有一个基本的了解。
【讨论】:
wxBoxSizer* topsizer = new wxBoxSizer(wxHORIZONTAL); wxTextCtrl* NameText = new wxTextCtrl(p, wxID_ANY, "", wxDefaultPosition, wxSize(250, 30)); topsizer->Add(NameText, 0, wxALIGN_CENTER_VERTICAL);
...topsizer->AddStretchSpacer(1); topsizer->Add(NameText, 0, wxALIGN_CENTER_VERTICAL); topsizer->AddStretchSpacer(1);... 两侧的 2 个垫片应该将文本控件推到中心。