我一直试图解决这个问题好几个小时,但我的wxWidgets知识(我是初学者)和在线寻找答案都没有帮助我。
我创建了一个名为 Field 的类,其中包含三个参数 int x , int y 和 wxBitmapButton button 。现在,我想要做的是,当单击按钮时,连接到按钮的事件处理程序将读取 x 和 y 来自相同的类实例,其中包含用过的按钮。
基本上我想要实现的是通过单击Field ::按钮来读取给定坐标Field :: x,Field :: y。有人可以帮我完成这项任务吗?
答案 0 :(得分:1)
我认为Field
本身不是一个小部件(如果它是,事情是相似的,你只需要改变它的创建方式)。编写它的一种方法是:
struct Field
{
Field(int x_, int y_) : x(x_), y(y_) { }
void set_button(wxBitmapButton* btn)
{
button = btn;
button->Bind(wxEVT_BUTTON, [this](wxCommandEvent&)
{
//Do whatever you want with x and y
//(they're accessed through the captured this pointer).
//For example:
wxMessageBox(std::to_wstring(x) + ", " + std::to_wstring(y));
});
}
int x;
int y;
wxBitmapButton* button = nullptr;
};
要测试它,你可以创建一个这样的简单窗口:
struct test_frame : wxFrame
{
test_frame() : wxFrame(nullptr, wxID_ANY, L"Test"), fld(3, 7) { }
//fld doesn't have to be a member of the wxFrame-derived class;
//it just needs to live at least as long as the button it references.
//This is just an example that satisfies that condition.
Field fld;
};
并初始化这样的一切:
auto main_frame = new test_frame();
auto btn = new wxBitmapButton(main_frame, wxID_ANY, your_bitmap);
main_frame->fld.set_button(btn);
main_frame->Show();
当点击按钮时,您会弹出一个消息框,显示3, 7
(或x
和y
中的任何值)。
所有这些代码假设您有一个合理的最新编译器 - 它使用了相当多的C ++ 11功能,如您所见。当然,它可以通过许多其他方式完成,但现代C ++使事情变得如此美好和轻松,我无法抗拒......