【问题标题】:wxFrame::IsActive() in wxGTKwxGTK 中的 wxFrame::IsActive()
【发布时间】:2014-02-19 22:31:19
【问题描述】:

活动窗口没有从 wxGTK 下的 IsActive() 返回 true。

我的软件有一个主窗口和一组工具窗口,都是从 wxFrame 派生的。 当主窗口移动时,它会捕获移动事件并在所有工具窗口中调用位置方法,以便它们一起移动。

每个工具窗口都可以独立移动,当用户移动它们时,我需要捕捉移动事件并更新它们相对于主窗口的位置。要检查它们是否被用户或主窗口移动,我使用 IsActive()。这在 wxMSW 和 wxOSX 下运行良好,但在 wxGTK 下运行良好。

void ToolBox::OnMove(wxMoveEvent& event)
{
    wxPoint shift;

    if(IsActive()) {
        wxPoint newpos = GetPosition();
        (calculate new postion)
    }   
}

工具箱来源于wxFrame

这是 wxGTK 中的错误吗?更好的方法?

【问题讨论】:

    标签: c++ gtk wxwidgets


    【解决方案1】:

    在 GTK 下,框架在获得焦点时会变为活动状态,因此根据您的 WM 的焦点策略,如果您只是通过标题栏拖动它,则它可能不会被视为处于活动状态,如果这实际上并没有给出它重点。

    我不确定这是否可以在 wxGTK 级别更正,但您绝对可以通过设置 movedByProgram 标志来解决此问题,每次您在代码中调用 Move() 并在 wxEVT_MOVE 中重置时都会设置该标志处理程序。然后你就可以通过检查这个标志是否未设置来检测用户的移动。

    【讨论】:

    • 感谢您的信息。这是一个巧妙的解决方法,但不幸的是并不完全有效。它可以检测到用户移动正常,但是在主窗口的控制下移动窗口只有在非常缓慢的情况下才有效。更快的移动似乎会触发重置标志后发生的其他移动事件。目前在 Ubuntu 中使用 Unity 进行测试。到目前为止,最好的解决方法是允许通过在其面板中检测鼠标单击来明确设置窗口处于活动状态,但这并不理想。即使使用窗口中的控件仍然会得到对 IsActive() 的错误响应。
    • 尝试在下一个wxEVT_IDLE 中重置标志,这有点骇人听闻,但应该解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多