【问题标题】:wxWidget mouse processingwxWidget鼠标处理
【发布时间】:2021-02-13 13:44:47
【问题描述】:

我在 windows 10 下使用 wxWidget-3.1.4 我尝试处理课堂上的鼠标事件。 头文件类:

#include "wx/wxprec.h"
#include <wx/wfstream.h>


class MainWindow : public wxFrame
{
public:
   MainWindow(const wxString& title);

   void OnQuit(wxCommandEvent& event);
   void OnOpenImage(wxCommandEvent& WXUNUSED);
   void OnEditImage(wxCommandEvent& WXUNUSED);

   //will redirect mouse event to class ImageDrawing
   void OnMouseWheel(wxMouseEvent& event);
   void OnMouseMove(wxMouseEvent& event);
   void OnMouseDown(wxMouseEvent& event);
   void OnMouseUp(wxMouseEvent& event);
private:
   //wx Panel for drawing image
   wxPanel* m_background;
   wxImage* m_Image;
 ...
}; 

Cpp 文件:

MainWindow::MainWindow(const wxString& title): wxFrame(NULL, wxID_ANY, title)
{
    m_background = new wxPanel(this, wxID_ANY);
    m_background->Bind(wxEVT_PAINT, &MainWindow::OnPaint, this);
}
void MainWindow::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(true);
}

void MainWindow::OnOpenImage(wxCommandEvent& WXUNUSED(event))
{
    wxString file = OpenFileDialog("Open Image file", "png files (*.png)|*.png");
    openImage(file, true);
}

void MainWindow::OnEditImage(wxCommandEvent& WXUNUSED(event))
{
    wxString file = OpenFileDialog("Open Image file", "png files (*.png)|*.png");
    // some logic
}
void MainWindow::OnMouseWheel(wxMouseEvent& event)
{
    std::cout<<"OnMouseWheel(event)";
}
void MainWindow::OnMouseMove(wxMouseEvent& event)
{
    std::cout<<"OnMouseMove(event)";
}
void MainWindow::OnMouseDown(wxMouseEvent& event)
{
    std::cout<<"OnMouseDown(event)";
}
void MainWindow::OnMouseUp(wxMouseEvent& event)
{
    std::cout<<"OnMouseUp(event)";
}
wxBEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_MENU(Minimal_Quit, MainWindow::OnQuit)
EVT_MENU(Open_Image, MainWindow::OnOpenImage)
EVT_MENU(Edit_Image, MainWindow::OnEditImage)

EVT_MOTION(MainWindow::OnMouseMove)
EVT_MOUSEWHEEL(MainWindow::OnMouseWheel)
EVT_LEFT_DOWN(MainWindow::OnMouseDown)
EVT_LEFT_UP(MainWindow::OnMouseUp)
EVT_RIGHT_DOWN(MainWindow::OnMouseDown)
EVT_RIGHT_UP(MainWindow::OnMouseUp)
wxEND_EVENT_TABLE()

问题是事件菜单工作正常,OnMouseWheel 工作正常,但所有其他鼠标事件都不起作用。谷歌搜索问题表明,这是因为父组件(在我的情况下为 wxFrame)包含一些子组件,例如 wxPanel,并且该子组件可以拦截事件。 那么为什么 OnMouseWheel 有效而其他所有无效。如果我在事件表中将 wxFrame 更改为 wxPanel 并且我没有使用 m_background,则会出现相同的行为。

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    我能够通过在构造函数中应用以下更改来解决这个问题:

    MainWindow::MainWindow(const wxString& title): wxFrame(NULL, wxID_ANY, title)
    {
        m_background = new wxPanel(this, wxID_ANY);
        m_background->Bind(wxEVT_PAINT, &MainWindow::OnPaint, this);
        m_background->Connect(wxEVT_MOTION, wxMouseEventHandler(MainWindow::OnMouseMove));
        m_background->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(MainWindow::OnMouseDown));
        m_background->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(MainWindow::OnMouseUp));
    }
    

    在每个函数中,如果您想访问某个类成员或参数,您需要执行以下操作:

    void MainWindow::OnMouseMove(wxMouseEvent& event)
    {
        MainWindow* pointer = dynamic_cast<MainWindow*>(this->GetParent());
        if(pointer->m_path.size() > 0)
            pointer->m_drawing->OnMove(event);
    }
    

    而不是 this,您需要使用 指针,原因是 this 现在指向 m_background。

    最后一步是从 wx_EVENT_TABLE 中删除这个函数

    【讨论】:

    • 这是完全可以理解的。您根本没有在 Bind() 中使用 sink 参数,因此 wxWidgets 不知道谁将处理该事件。我很惊讶代码实际上是有效的。顺便说一句,你为什么要使用 Bind() 和 Connect()?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2013-11-17
    • 2012-09-11
    • 2018-08-15
    相关资源
    最近更新 更多