gpt4 book ai didi

c++ - wxWidgets - 创建一个无边框的可移动框架

转载 作者:太空狗 更新时间:2023-10-29 23:09:27 29 4
gpt4 key购买 nike

我正在尝试将我用 C# 编写的应用程序之一 - Windows 窗体转换为 C++ - wxWidgets。

我的应用程序是无边框的,在表单顶部有一个薄薄的透明面板,可用于移动表单。 (我使用了这个问题中的技巧:Make a borderless form movable?)

现在,我基本上想在 wxWidgets 中做同样的事情,我在互联网上搜索了如何处理 wxPanel 上的鼠标按下事件,并找到了几个例子,但都在他们的文章/问题中使用了 wxPython,我完全不了解 Python。

那么如何在 C++ 中做同样的事情 - wxWidgets?

最佳答案

一种方法是让窗口为其每个子窗口的鼠标按下事件注册一个事件处理程序。这样,如果满足特定条件(例如,在单击时按住 Alt 键),窗口就可以控制鼠标。

其中一些内容在 wxwidgets\samples\shaped\shaped.cpp 示例中进行了说明,但基本上您可以这样做:

在添加所有子窗口后向您的窗口添加一个方法:

void MyFrame::BindChildEvents()
{
visit_recursively(this,
[] (wxWindow *window, MyFrame *thiz) {
// Bind all but the main window's event
if(window != thiz)
{
window->Bind(wxEVT_LEFT_DOWN, &MyFrame::OnChildLeftDown, thiz);
}
},
this
);
}

您可以滚动自己的窗口树遍历,但我在这里使用这个小辅助函数:

template<typename F, typename... Args>
void
visit_recursively(wxWindow *window, F func, Args&&... args)
{
for(auto&& child : window->GetChildren())
{
visit_recursively(child, func, std::forward<Args>(args)...);
}
func(window, std::forward<Args>(args)...);
}

然后设置鼠标按下事件拦截处理程序:

void MyFrame::OnChildLeftDown(wxMouseEvent& event)
{
// If Alt is pressed while clicking the child window start dragging the window
if(event.GetModifiers() == wxMOD_ALT)
{
// Capture the mouse, i.e. redirect mouse events to the MyFrame instead of the
// child that was clicked.
CaptureMouse();

const auto eventSource = static_cast<wxWindow *>(event.GetEventObject());
const auto screenPosClicked = eventSource->ClientToScreen(event.GetPosition());
const auto origin = GetPosition();

mouseDownPos_ = screenPosClicked - origin;
}
else
{
// Do nothing, i.e. pass the event on to the child window
event.Skip();
}
}

然后您通过随鼠标移动窗口来处理鼠标运动:

void MyFrame::OnMouseMove(wxMouseEvent& event)
{
if(event.Dragging() && event.LeftIsDown())
{
const auto screenPosCurrent = ClientToScreen(event.GetPosition());
Move(screenPosCurrent - mouseDownPos_);
}
}

一定要在 wxEVT_LEFT_UPwxEVT_MOUSE_CAPTURE_LOST 事件中调用 ReleaseMouse()

关于c++ - wxWidgets - 创建一个无边框的可移动框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5082507/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com