<P>对于任何一个完全C++的人来说,这里是:</P>
<pre class="lang-cpp prettyprint-override"><code>#include <wx/wx.h>
struct CustomData final : public wxClientData {
std::string myString;
};
struct MyApp final : public wxApp {
bool OnInit() final;
};
struct MyWindow final : public wxFrame {
static constexpr int ID_MY_BUTTON{ 42 };
MyWindow();
MyWindow( MyWindow const & ) = delete;
MyWindow & operator=( MyWindow const & ) = delete;
void OnButton( wxCommandEvent & event );
wxDECLARE_EVENT_TABLE();
};
bool MyApp::OnInit() {
MyWindow * const window{ new MyWindow() };
window->Show( true );
return true;
}
MyWindow::MyWindow() {
wxButton * const myButton{ new wxButton( this, ID_MY_BUTTON ) };
CustomData * const myData{ new CustomData() };
myData->myString = "Hello World!";
myButton->SetClientObject( myData );
}
void MyWindow::OnButton( wxCommandEvent & event ) {
wxEvtHandler const * const eventObject{ static_cast< wxEvtHandler * >( event.GetEventObject() ) };
if ( eventObject == nullptr ) {
return;
}
CustomData const * const myData{ static_cast< CustomData const * >( eventObject->GetClientObject() ) };
if ( myData == nullptr ) {
return;
}
std::cout << myData << "\n";
}
wxIMPLEMENT_APP( MyApp );
wxBEGIN_EVENT_TABLE( MyWindow, wxFrame )
EVT_BUTTON( MyWindow::ID_MY_BUTTON, MyWindow::OnButton )
wxEND_EVENT_TABLE()
</code></pre>
<p>不需要删除<code>CustomData</code>实例,wxWidgets会处理它。
这里的关键步骤是:</p>
<ul>
<li>继承<code>wxClientData</code>类以附加数据</li>
<li>使用堆分配的自定义数据对象调用<code>wxEvtHandler::SetClientObject()</code></li>
<li>在回调中,使用<code>wxCommandEvent::GetEventObject()</code>检索按钮</li>
<li>使用<code>wxEvtHandler::GetClientObject()</code>检索自定义数据</li>
</ul>