c++ - wxWidgets中如何转发事件?

标签 c++ wxwidgets

我有一个带有 GLCanvas 和滚动条的窗口,我希望 Canvas 捕获滚动事件并将它们转发到滚动条,然后滚动条用于定位“相机”。所以我这样做了:

MainWindow::MainWindow(wxWindow* parent,wxWindowID id)
{
//...
   GlCanvas->Connect(ID_GLCANVAS1, wxEVT_MOUSEWHEEL, (wxObjectEventFunction)&MainWindow::onMouseWheel, 0L, this);
}

void MainWindow::onMouseWheel(wxMouseEvent & event)
{
    if(event.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL)
    {
        std::cerr << "vertical scroll" << std::endl;
        verticalScroll->ProcessWindowEvent(event);
    }
    else
    {
        std::cerr << "horizontal scroll" << std::endl;
        horizontalScroll->ProcessWindowEvent(event);
    }
}

但是,除了打印输出之外,这没有做任何事情。我该怎么做才能让滚动条处理滚轮事件?

==============解决方案==============

void MainWindow::onMouseWheel(wxMouseEvent & event)
{
    event.Skip();
    double rotation = ((double) event.GetWheelRotation()) / event.GetWheelDelta();

    wxScrollBar * scrollBar;
    double * delta;

    if(event.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL)
    {
        scrollBar = verticalScroll; 
        delta     = &verticalDelta;
        rotation *= -1;
    }
    else
    {
        scrollBar = horizontalScroll;
        delta     = &horizontalDelta;
    }

    if(event.IsPageScroll())
    {
        rotation *= scrollBar->GetPageSize();
    }
    else
    {
        if(event.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL)
        {
            rotation *= event.GetLinesPerAction();
        }
        else
        {
            rotation *= event.GetColumnsPerAction();
        }
    }

    *delta += rotation;

    int scroll = scrollBar->GetThumbPosition();
    int ds = (int) *delta;

    *delta -= ds;
    scroll += ds;

    if(scroll < 0)
    {
        *delta = 0;
        scroll = 0;
    }
    else if(scroll > scrollBar->GetRange())
    {
        *delta = 0;
        scroll = scrollBar->GetRange();
    }

    scrollBar->SetThumbPosition(scroll);
}

最佳答案

你不能把wx事件转发给native控件,你想想,当native控件对wx一无所知的时候,这怎么可能呢? native 控件生成 native 事件,然后将其转换为 wx 事件并提供给您的应用程序,但在另一个方向上什么也没有发生,甚至无法真正完成。

在这种特殊情况下,您可以(相对)轻松地将滚动事件转换为对 ScrollLines()ScrollPages()SetScrollPos()< 的调用。这将允许您使用相同的滚动条控制另一个窗口滚动。

不要忘记在原始处理程序中调用Skip(),让正在滚动的窗口也从实际滚动开始。

关于c++ - wxWidgets中如何转发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990425/

相关文章:

c++ - STL map 容器在构造时是否优化(平衡树)?

c++ - 如何向 C++ 应用程序添加反射?

c++ - 使用 vector 对比使用 vector 对更有效吗?

macos - Alien::wxWidgets 在 OSX10.10 上安装失败

c++ - libvlc 的手册页

c++ - 大面积钻石方形地形生成

python - 运行 dpkg 安装程序以在 wxpython 中安装 deb

c++ - wxwidgets Event Table/Bind() 事件似乎没有触发,Connect() 确实

c++ - 如何在wxWidgets框架中添加图片?

wxwidgets - 使 Boost Python 不删除析构函数中的 C++ 对象