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

Calling wxSizeEvent at the end of sizing event

我在 child 框架上绘制图像,当用户调整框架大小时,图像的位置也会更新。这会导致一些闪烁,虽然我在某种程度上解决了这个问题,但我想在用户完成调整大小时(鼠标左键向上)时更新位置。因此,不会多次调用 OnSize,只会调用一次,那就是当 调整框架尺寸时

例如,当 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. 在 parent 或 child 框架上的某处单击鼠标按钮(左上)之前,我无法调整框架的大小。
  2. 即使我调整它的大小,我也无法解除绑定函数,因为在 child window.
  3. 的客户区单击时 MessageBox 不断弹出

有没有办法实现仅 one/a 对 OnSize 函数的调用(除了在函数中使用静态计数器)。

我不确定在调整大小时是否会生成空闲事件,但我认为不会。如果这是正确的,那么做你想做的事情就像在你的 wxEVT_SIZE 处理程序中设置一个标志 m_shouldResize 并在 wxEVT_IDLE 中检查它一样简单,如果是真的则实际调整图像的大小。

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