使用 Xcode、C++ 和 wxWidgets 制作应用程序包
Making an application bundle with Xcode, C++ and wxWidgets
我是 macos 的新手,我正在尝试弄清楚如何制作应用程序包,这样我的代码就不会只是一个 executable 文件。
我正在使用 xcode 12.5 版并使用 c++ 语言和 wxWidgets 库编写测试 gui 应用程序。
现在我试着用一个按钮和一个菜单栏(屏幕顶部的栏有不同的菜单,如 File 或 About )制作一个简单的图形用户界面。我遇到了 2 个问题:
- 第一个也是最主要的是,当 executable 启动时,菜单栏没有响应,它只有在聚焦于另一个程序然后聚焦回 executable 时才起作用,然后菜单是可点击的并且可以工作。我读到发生这种情况是因为我将程序构建为 executable 而不是应用程序包。虽然,在 xcode 中无法弄清楚如何做到这一点,并且互联网也没有完全回答如何做到这一点。
- 只触摸鼠标垫时按钮没有点击效果(必须点击才能做出蓝色的点击效果),需要按住按钮才能看到按钮变色。
代码:
应用的cpp文件(继承自wxApp)
bool instaStalkApp::OnInit(){
instaFrame = new instaStalkFrame("InstaStalk", wxPoint(50,50), wxSize(P_WIDTH,P_HEIGHT));
instaFrame->Show(true);
SetTopWindow(instaFrame);
mainPanel = new instaStalkPanel(instaFrame, ID_PANEL_MAIN, wxPoint(-1,-1), wxSize(P_WIDTH, P_HEIGHT), wxTAB_TRAVERSAL, "panel");
testButton = new instaButton(mainPanel, ID_TEST_BUTTON_1, "test1" , wxPoint(P_WIDTH / 2 ,P_HEIGHT / 2), wxSize(100,20), "test1but");
return true;
}
按钮头文件class:
#ifndef instaButton_hpp
#define instaButton_hpp
#include <stdio.h>
#include <wx/wx.h>
class instaButton : public wxButton {
private:
public:
instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name);
void On_Button1Click(wxCommandEvent &event);
wxDECLARE_EVENT_TABLE();
};
#endif /* instaButton_hpp */
按钮事件 table :
wxBEGIN_EVENT_TABLE(instaButton, wxButton)
EVT_BUTTON(ID_TEST_BUTTON_1, instaButton::On_Button1Click)
wxEND_EVENT_TABLE()
自定义按钮的cpp文件
#include <wx/wx.h>
#include "instaButton.hpp"
instaButton::instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name) : wxButton(parent, id, label, pos, size, 0, wxDefaultValidator, name){
}
void instaButton::On_Button1Click(wxCommandEvent &event){
wxLogMessage("hi");
}
带有菜单栏的框架的cpp文件:
#include <wx/wx.h>
#include "instaStalkFrame.hpp"
#include "instaStalkPanel.hpp"
#include "consts.hpp"
instaStalkFrame::instaStalkFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size){
menuFile = new wxMenu;
menuFile->Append(ID_TEST, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
menuBar = new wxMenuBar;
menuBar->Append( menuFile, "&File" );
menuBar->Append( menuHelp, "&Help" );
SetMenuBar(menuBar);
}
void instaStalkFrame::OnExit(wxCommandEvent& event){
Close(true);
}
void instaStalkFrame::OnAbout(wxCommandEvent& event){
wxMessageBox( "This is a wxWidgets' Hello world sample",
"About Hello World", wxOK | wxICON_INFORMATION );
}
void instaStalkFrame::OnTest(wxCommandEvent& event){
wxLogMessage("Test!");
}
为了制作应用程序包:
您应该已经在 Xcode 中创建了一个 OSX 应用程序项目。查看wxWiki(我知道它适用于Xcode的旧版本,但它仍然适用,您可以尝试在较新版本中匹配它)。
如果您想稍后再做 - 您可以尝试从 thr wxWidgets 发行版构建 minimal
示例,查看它使用什么来创建一个包并将其复制到您的测试程序中。但是你绝对应该在 Xcode 中创建一个 Application Bundle 项目来简化你的生活。
创建捆绑包后,菜单将开始工作。如你所愿。
我认为悬停效果没有实现。你可以在wx-users ML上询问。
如果您需要更多指导,请告诉我们。
我是 macos 的新手,我正在尝试弄清楚如何制作应用程序包,这样我的代码就不会只是一个 executable 文件。
我正在使用 xcode 12.5 版并使用 c++ 语言和 wxWidgets 库编写测试 gui 应用程序。
现在我试着用一个按钮和一个菜单栏(屏幕顶部的栏有不同的菜单,如 File 或 About )制作一个简单的图形用户界面。我遇到了 2 个问题:
- 第一个也是最主要的是,当 executable 启动时,菜单栏没有响应,它只有在聚焦于另一个程序然后聚焦回 executable 时才起作用,然后菜单是可点击的并且可以工作。我读到发生这种情况是因为我将程序构建为 executable 而不是应用程序包。虽然,在 xcode 中无法弄清楚如何做到这一点,并且互联网也没有完全回答如何做到这一点。
- 只触摸鼠标垫时按钮没有点击效果(必须点击才能做出蓝色的点击效果),需要按住按钮才能看到按钮变色。
代码:
应用的cpp文件(继承自wxApp)
bool instaStalkApp::OnInit(){
instaFrame = new instaStalkFrame("InstaStalk", wxPoint(50,50), wxSize(P_WIDTH,P_HEIGHT));
instaFrame->Show(true);
SetTopWindow(instaFrame);
mainPanel = new instaStalkPanel(instaFrame, ID_PANEL_MAIN, wxPoint(-1,-1), wxSize(P_WIDTH, P_HEIGHT), wxTAB_TRAVERSAL, "panel");
testButton = new instaButton(mainPanel, ID_TEST_BUTTON_1, "test1" , wxPoint(P_WIDTH / 2 ,P_HEIGHT / 2), wxSize(100,20), "test1but");
return true;
}
按钮头文件class:
#ifndef instaButton_hpp
#define instaButton_hpp
#include <stdio.h>
#include <wx/wx.h>
class instaButton : public wxButton {
private:
public:
instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name);
void On_Button1Click(wxCommandEvent &event);
wxDECLARE_EVENT_TABLE();
};
#endif /* instaButton_hpp */
按钮事件 table :
wxBEGIN_EVENT_TABLE(instaButton, wxButton)
EVT_BUTTON(ID_TEST_BUTTON_1, instaButton::On_Button1Click)
wxEND_EVENT_TABLE()
自定义按钮的cpp文件
#include <wx/wx.h>
#include "instaButton.hpp"
instaButton::instaButton(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos, const wxSize &size, const wxString &name) : wxButton(parent, id, label, pos, size, 0, wxDefaultValidator, name){
}
void instaButton::On_Button1Click(wxCommandEvent &event){
wxLogMessage("hi");
}
带有菜单栏的框架的cpp文件:
#include <wx/wx.h>
#include "instaStalkFrame.hpp"
#include "instaStalkPanel.hpp"
#include "consts.hpp"
instaStalkFrame::instaStalkFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size){
menuFile = new wxMenu;
menuFile->Append(ID_TEST, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
menuBar = new wxMenuBar;
menuBar->Append( menuFile, "&File" );
menuBar->Append( menuHelp, "&Help" );
SetMenuBar(menuBar);
}
void instaStalkFrame::OnExit(wxCommandEvent& event){
Close(true);
}
void instaStalkFrame::OnAbout(wxCommandEvent& event){
wxMessageBox( "This is a wxWidgets' Hello world sample",
"About Hello World", wxOK | wxICON_INFORMATION );
}
void instaStalkFrame::OnTest(wxCommandEvent& event){
wxLogMessage("Test!");
}
为了制作应用程序包:
您应该已经在 Xcode 中创建了一个 OSX 应用程序项目。查看wxWiki(我知道它适用于Xcode的旧版本,但它仍然适用,您可以尝试在较新版本中匹配它)。
如果您想稍后再做 - 您可以尝试从 thr wxWidgets 发行版构建 minimal
示例,查看它使用什么来创建一个包并将其复制到您的测试程序中。但是你绝对应该在 Xcode 中创建一个 Application Bundle 项目来简化你的生活。
创建捆绑包后,菜单将开始工作。如你所愿。
我认为悬停效果没有实现。你可以在wx-users ML上询问。
如果您需要更多指导,请告诉我们。