#include "MainPanel.h" #include "InstallWidget.h" CMainPanel::CMainPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxPanel(parent, id, pos, size, style, name) { top_sizer_ = new wxBoxSizer(wxVERTICAL); handle_ = new CFunPack(); InitPanel(); } CMainPanel::~CMainPanel() { delete handle_; } void CMainPanel::InitPanel() { // 创建 wxStaticBoxSizer,并设置标题 base_box_sizer_ = new wxStaticBoxSizer(wxVERTICAL, this, wxT("一、基本信息")); // 创建水平 sizer 来放置控件 sizer_select_ = new wxBoxSizer(wxHORIZONTAL); // 创建控件,并将其父级设置为正确的窗口(即 `this`,代表主窗口或面板) label_select_ = new wxStaticText(this, wxID_ANY, wxT("要打包的二进制文件:")); text_select_ctrl_ = new wxTextCtrl(this, wxID_ANY); text_select_ctrl_->SetMinSize(wxSize(300, -1)); btn_select_ = new wxButton(this, wxID_ANY, wxT("选择文件")); btn_select_->Bind(wxEVT_BUTTON, &CMainPanel::selectBinaryFile, this); // 将控件添加到水平 sizer 中 sizer_select_->Add(text_select_ctrl_, 1, wxALL | wxEXPAND, g_Border); sizer_select_->Add(btn_select_, 0, wxALL | wxALIGN_LEFT, g_Border); // 将水平 sizer 添加到带标题的 sizer 中, wxALIGN_CENTER_VERTICAL 仅水平可用 base_box_sizer_->Add(label_select_, 0, wxALL | wxEXPAND, g_Border); base_box_sizer_->Add(sizer_select_, 0, wxALL | wxEXPAND, g_Border); sizer_output_ = new wxBoxSizer(wxHORIZONTAL); btn_output_ = new wxButton(this, wxID_ANY, wxT("选择目录")); btn_output_->Bind(wxEVT_BUTTON, &CMainPanel::selectDir, this); text_output_ctrl_ = new wxTextCtrl(this, wxID_ANY); label_output_ = new wxStaticText(this, wxID_ANY, wxT("输出目录:")); base_box_sizer_->Add(label_output_, 0, wxALL | wxEXPAND, g_Border); sizer_output_->Add(text_output_ctrl_, 1, wxALL | wxEXPAND, g_Border); sizer_output_->Add(btn_output_, 0, wxALL, g_Border); base_box_sizer_->Add(sizer_output_, 0, wxALL | wxEXPAND, g_Border); env_box_sizer_ = new wxStaticBoxSizer(wxVERTICAL, this, wxT("二、搜索库范围")); env_list_ = new wxListBox(this, wxID_ANY); env_oper_sizer_ = new wxBoxSizer(wxHORIZONTAL); btn_add_env_ = new wxButton(this, wxID_ANY, wxT("添加")); btn_del_env_ = new wxButton(this, wxID_ANY, wxT("删除")); btn_add_env_->Bind(wxEVT_BUTTON, &CMainPanel::addEnv, this); btn_del_env_->Bind(wxEVT_BUTTON, &CMainPanel::delEnv, this); env_oper_sizer_->Add(btn_add_env_, 0, wxALL | wxALIGN_LEFT, g_Border); env_oper_sizer_->Add(btn_del_env_, 0, wxALL | wxALIGN_LEFT, g_Border); env_box_sizer_->Add(env_oper_sizer_, 0, wxALL, g_Border); env_box_sizer_->Add(env_list_, 1, wxALL | wxEXPAND, g_Border); // 固定垂直方向的点在 top_sizer_->Add(base_box_sizer_ 第二个参数改成 0 top_sizer_->Add(base_box_sizer_, 0, wxALL | wxEXPAND, g_Border); top_sizer_->Add(env_box_sizer_, 1, wxALL | wxEXPAND, g_Border); oper_sizer_ = new wxBoxSizer(wxHORIZONTAL); btn_gen_ = new wxButton(this, wxID_ANY, wxT("生成")); btn_exit_ = new wxButton(this, wxID_ANY, wxT("退出")); btn_install_ = new wxButton(this, wxID_ANY, wxT("安装到菜单栏")); btn_gen_->Bind(wxEVT_BUTTON, &CMainPanel::genResult, this); btn_exit_->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { GetParent()->Close(); }); btn_install_->Bind(wxEVT_BUTTON, &CMainPanel::installDialog, this); // 创建一个伸缩的占位符 sizer auto* stretch_sizer = new wxBoxSizer(wxHORIZONTAL); stretch_sizer->AddStretchSpacer(1); // 添加伸缩空间 // 添加伸缩的占位符 sizer 到主 sizer oper_sizer_->Add(btn_install_, 0, wxALL, g_Border); oper_sizer_->Add(stretch_sizer, 1, wxALL | wxEXPAND); oper_sizer_->Add(btn_gen_, 0, wxALL, g_Border); oper_sizer_->Add(btn_exit_, 0, wxALL, g_Border); oper_sizer_->SetSizeHints(this); // 排列的时候在 sizer 里面排列 top_sizer_->Add(oper_sizer_, 0, wxALL | wxEXPAND, g_Border); // 设置主窗口的 sizer SetSizer(top_sizer_); } void CMainPanel::installDialog(wxCommandEvent& event) { CInstallDialog dialog(GetParent(), wxT("安装")); // dialog.SetSize(wxSize(400, 500)); dialog.SetSize(wxSize(400, -1)); dialog.ShowModal(); // if (dialog.ShowModal() == wxID_OK) // Show modal dialog and check return code // { // wxLogMessage("OK pressed"); // } // else // { // wxLogMessage("Cancel pressed"); // } } void CMainPanel::selectDir(wxCommandEvent& event) { wxDirDialog dirDialog(this, wxT("Select Directory"), wxEmptyString, wxDD_DIR_MUST_EXIST); if (dirDialog.ShowModal() == wxID_CANCEL) return; // 用户取消选择 wxString selectedDir = dirDialog.GetPath(); text_output_ctrl_->SetValue(selectedDir); } void CMainPanel::genResult(wxCommandEvent& event) { wxArrayString arrayStrings; // 获取 wxListBox 中的所有项 unsigned int count = env_list_->GetCount(); for (unsigned int i = 0; i < count; ++i) { wxString item = env_list_->GetString(i); arrayStrings.Add(item); } wxString out_dir = text_output_ctrl_->GetValue(); if (handle_->gen(text_select_ctrl_->GetValue(), out_dir, arrayStrings)) { // 显示消息框 wxMessageBox(wxT("成功"), // 消息内容 wxT("成功"), // 标题 wxOK | wxICON_INFORMATION, // 按钮和图标 this // 父窗口 ); return; } wxMessageBox(wxT("失败"), // 消息内容 wxT("失败"), // 标题 wxOK | wxICON_INFORMATION, // 按钮和图标 this // 父窗口 ); } void CMainPanel::delEnv(wxCommandEvent& event) { int selection = env_list_->GetSelection(); if (selection != wxNOT_FOUND) { // 删除选中的项 env_list_->Delete(selection); } } void CMainPanel::addEnv(wxCommandEvent& event) { wxDirDialog dirDialog(this, wxT("Select Directory"), wxEmptyString, wxDD_DIR_MUST_EXIST); if (dirDialog.ShowModal() == wxID_CANCEL) return; // 用户取消选择 wxString selectedDir = dirDialog.GetPath(); // 检查列表中是否已经存在此目录 for (unsigned int i = 0; i < env_list_->GetCount(); ++i) { if (env_list_->GetString(i) == selectedDir) return; // 目录已存在,不再添加 } // 添加目录到列表 env_list_->Append(selectedDir); } void CMainPanel::selectBinaryFile(wxCommandEvent& event) { wxFileDialog openFileDialog( this, _("Open file"), "", "", "*", wxFD_OPEN | wxFD_FILE_MUST_EXIST ); if (openFileDialog.ShowModal() == wxID_CANCEL) return; wxString filePath = openFileDialog.GetPath(); text_select_ctrl_->SetValue(filePath); }