在大小调整事件结束时调用wxSizeEvent

时间:2017-09-07 00:58:48

标签: c++ wxwidgets

我有一个子框架,我在其上绘制图像,当用户调整框架大小时,图像的位置会更新。这会导致一些闪烁,虽然我在某种程度上解决了这个问题,但我希望在用户完成调整大小时更新位置(鼠标左键)。因此,对OnSize的多次调用只会有一次调用,而且#39;当框架的尺寸完成时

例如,当运行Matlab的图像处理工具箱并且框架加载了图像时,当用户调整框架大小时,图像的位置不会改变,但是一旦调整大小,图像的位置就会改变。完成(向左按钮)。

我有以下方法,但无法使其正常工作:

void FrmImageEditor::OnSize(wxSizeEvent & event)
{
    if (IsIconized() || !IsShown()) return;

    std::function<void(wxMouseEvent& evt)> fncBind, fncUnbind;
    fncBind = std::function<void(wxMouseEvent& evt)>([&](wxMouseEvent& evt) 
    { 
        wxMessageBox("Left up"); 
        Connect(wxEVT_SIZE, wxSizeEventHandler(FrmImageEditor::OnSize)); 
        m_UnbindTheEvent= true;
        ReleaseMouse(); 
    });

    CaptureMouse();
    Disconnect(wxEVT_SIZE, wxSizeEventHandler(FrmImageEditor::OnSize));
    if(!m_UnbindTheEvent) Bind(wxEVT_LEFT_UP,fncBind );
    if(m_UnbindTheEvent) Unbind(wxEVT_LEFT_UP, fncBind);

上述代码在以下方面不起作用:

  1. 直到我在父框架或子框架上的某处单击鼠标按钮(左上),我无法调整框架的大小。
  2. 即使我调整大小,我也无法取消绑定绑定函数,因为当单击子窗口的客户区时,MessageBox会一直弹出。
  3. 有没有办法只实现一个/两个调用OnSize函数(除了在函数中使用静态计数器)。

1 个答案:

答案 0 :(得分:0)

我不确定在调整大小期间是否会生成空闲事件,但我不认为它们是。如果这是正确的,那么执行您想要的操作就像在m_shouldResize处理程序中设置标记wxEVT_SIZE并在wxEVT_IDLE中检查它并在实际上调整图像大小一样简单。

如果仍然发出空闲事件太快,您可以使用相同的逻辑,但改为使用计时器事件。