如何实现一个可拖动的无标题栏窗口

无标题栏窗口的实现很简单。先将窗口从wxMiniFrame继承,然后在窗口的构造函数中设置一下窗口的样式。

MainFrame::MainFrame(const wxPoint& pos, const wxSize& size)
   : wxMiniFrame(NULL, wxID_ANY, wxEmptyString, pos, size)
{
    SetWindowStyleFlag(wxFRAME_NO_TASKBAR | wxNO_BORDER);
}

 

但是,窗口的移动通常都是通过鼠标点住标题栏拖动窗口来实现的,那么现在没有了标题栏,该如何移动窗口呢?我们知道,当鼠标拖动窗口时,它在窗口中的位置是始终不变的。所以如果能够在鼠标移动过程中,通过改变窗口在桌面上的坐标,并且始终保持鼠标相对于窗口的坐标不变,即可实现鼠标的拖动效果。

在具体的设计中,先在鼠标的MouseDown事件中记录下鼠标相对于窗口的偏移,在鼠标的MouseMove事件中根据鼠标在桌面上的位置实时设置窗口的位置,即可达到鼠标拖动窗口的操作。利用此方法实现鼠标拖动,与常规的标题栏鼠标拖动在效果上有一点区别。通过标题栏拖动时,鼠标移动过程中不重画窗口,只有松开鼠标后才在固定位置重画窗口,因此其速度较快。而采用本方法的拖动过程中,每移动一步都需要重画窗口,因此对速度稍有影响,在慢一些的机器上可能会出现轻微的拖尾现象。

void MainFrame::OnMouseMove(wxMouseEvent& event)
{
    if (event.Dragging() && event.LeftIsDown())
    {
        wxPoint pt = ClientToScreen(event.GetPosition());
        int x = pt.x - m_delta.x;
        int y = pt.y - m_delta.y;
        Move(x, y);
    }
}

 

void MainFrame::OnMouseLeftDown(wxMouseEvent& event)
{
    CaptureMouse();
    wxPoint pt = ClientToScreen(event.GetPosition());
    wxPoint origin = GetPosition();
    int dx = pt.x - origin.x;
    int dy = pt.y - origin.y;
    m_delta = wxPoint(dx, dy);
}

 

void MainFrame::OnMouseLeftUp(wxMouseEvent& WXUNUSED(event))
{
    if (HasCapture())
    {
        ReleaseMouse();
    }
}

 

 

from:http://hi.baidu.com/zshua_404/blog/item/e73dea0baefdda1895ca6ba2.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值