使用 C++ wx-widgets 为程序创建固定大小的主框架

Create fixed size main frame for a program using C++ wx-widgets

我正在观看有关 wx-widgets 和使用 C++ 创建简单 GUI 的快速基础教程。 我想让我的 window 成为固定大小的(无法最大化或拖动到 expand/contract)。目前我在主 class 的构造函数中的代码如下:

main::main() : wxFrame(nullptr, wxID_ANY, "Usage Statistics Viewing Console", wxDefaultPosition, wxSize(1008, 567), wxDEFAULT_FRAME_STYLE)
{       
    m_btn1 = new wxButton(this, 1, "Connect Database", wxPoint(10, 10), wxSize(150, 50));
    m_txt1 = new wxTextCtrl(this, wxID_ANY, " ", wxPoint(10, 70), wxSize(300, 30));
    m_list1 = new wxListBox(this, wxID_ANY, wxPoint(10, 110), wxSize(300, 300));
}

我相信我必须更改 wxFrame 参数,但我在 wx 数据库上搜索了有关该功能的信息,老实说,我没有足够的知识来理解那里的一半内容。我想我可以改变 window 与 "styles" 参数的行为方式。但我都试过了 none 产生了我想要的效果。

如果您查看 documentation for wxFrame,在样式部分下它指出 wxDEFAULT_FRAME_STYLE 被定义为

wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN. 

要使用户无法调整 window 的大小,您只需从该集合中删除 wxRESIZE_BORDER。像这样:

main::main() : wxFrame(nullptr, wxID_ANY, "Usage Statistics Viewing Console",
                       wxDefaultPosition, wxSize(1008, 567),
                       wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxSYSTEM_MENU
                       | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN)
{...

或者如果你熟悉 C 的按位运算,你可以更简洁地写成:

main::main() : wxFrame(nullptr, wxID_ANY, "Usage Statistics Viewing Console",
                       wxDefaultPosition, wxSize(1008, 567),
                       wxDEFAULT_FRAME_STYLE & ~wxRESIZE_BORDER)

我想提供另外 2 条建议。首先,您可以通过将面板用作框架的唯一直接子项,然后让所有其他控件成为面板的子项来改善框架的外观。

wxPanel* panel = new wxPanel(this, wxID_ANY);

m_btn1 = new wxButton(panel, wxID_ANY, "Connect Database", wxPoint(10, 10), wxSize(150, 50));
m_txt1 = new wxTextCtrl(panel, wxID_ANY, " ", wxPoint(10, 70), wxSize(300, 30));
m_list1 = new wxListBox(panel, wxID_ANY, wxPoint(10, 110), wxSize(300, 300));

其次,在某些时候,您应该考虑使用 sizer 来管理控件的大小和位置,而不是在控件构造函数中使用大小和位置参数。 Sizer 学习起来可能有点棘手,但一旦掌握了它们就会大有裨益。还有 wxFormbuilder 或 wxCrafter 等工具可以帮助您使用 sizer 布置表单。