wxWidgets实现无标题栏窗口拖动效果

本文实例为大家分享了wxWidgets实现无标题栏窗口拖动的具体代码,供大家参考,具体内容如下

最近需要做一个自定义的标题栏,而其中最重要的就是要实现窗口的拖动。默认情况下有标题栏,都可以通过拖动系统默认的标题栏,但是自定义的标题栏需要自己实现拖动。

实现无标题窗口的拖动,在MFC中可以在鼠标在窗口中拖动时,发送虚假的消息给窗口来进行实现(注:MFC可以发送鼠标在标题栏拖动的消息)。但是在wxWidgets中,暂时没有看到类似的消息。因工作需要,才学习wxWidgets不久。如果有知道相关消息的朋友,请发消息告诉。而自己实现拖动,大致可以分为三个步骤。

1、在鼠标左键按下时,记录下鼠标位置,使用CaptureMouse来进行鼠标捕获 。注意,这里如果不捕获鼠标,那么也能实现拖动窗口,但是会出现一个小问题,就是当鼠标在窗口边缘快速的拖出窗口的时候,窗口不能进行移动。因为系统对鼠标的移动事件的发送是有事件间隔的,窗口收到该消息时鼠标已经离开了窗口,所以不能正确拖动。一定要记得设置鼠标捕获。

2、当鼠标拖动的时候(在鼠标事件中判断鼠标左键按下且在拖拽),计算鼠标新的位置相对之前的位移向量,并移动窗口到相应的位置。

3、处理鼠标左键抬起事件,在鼠标抬起事件中使用ReleaseMouse来释放之前捕获的鼠标。

4、处理EVT_MOUSE_CAPTURE_LOST(func)事件,在其中释放鼠标捕获。官方文档有说明,对鼠标进行捕获必须处理该事件,并在其中释放鼠标捕获。因为弹出对话框等情况会导致鼠标是按下的,但是父窗口却失去了鼠标焦点的状况,所以必须处理该事件释放鼠标。

下面给出我自己实现的一个可以通过鼠标拖拽实现移动的无标题栏窗口的代码,可以对照上边的介绍看一下具体的实现。这个类实现的是拖动自己,当然可以利用在计算坐标之后获取父窗口来进行移动,那样就可以实现鼠标在子窗口上拖动来实现整个窗口的移动。也就是自定义的标题栏应该具有的基本功能。

头文件:MyTitleWnd.h

#pragma once
#include <wx/wx.h>

class MyTitleWnd:public wxFrame
{
public:
 MyTitleWnd(wxWindow *parent,wxWindowID id=wxID_ANY);
 virtual ~MyTitleWnd();
 void OnMouseMove(wxMouseEvent& event);
 void OnMouseLeave(wxMouseEvent& event);
 void OnMouseLDown(wxMouseEvent& event);
 void OnMouseLUp(wxMouseEvent& event);
 void OnMouseCaptureLost(wxMouseCaptureLostEvent& event);
private:
 wxPoint mLastPt;

 wxString mText;
 DECLARE_EVENT_TABLE()
};

源文件:MyTitleWnd.cpp

#include "MyTitleWnd.h"

BEGIN_EVENT_TABLE(MyTitleWnd, wxFrame)
 EVT_MOUSE_CAPTURE_LOST(MyTitleWnd::OnMouseCaptureLost)
 //EVT_LEFT_DOWN(MyTitleWnd::OnMouseLDown)
 EVT_LEFT_UP(MyTitleWnd::OnMouseLUp)
 EVT_MOUSE_EVENTS(MyTitleWnd::OnMouseMove)
 EVT_LEAVE_WINDOW(MyTitleWnd::OnMouseLeave)
END_EVENT_TABLE()

MyTitleWnd::MyTitleWnd(wxWindow *parent, wxWindowID id/*=wxID_ANY*/)
 :wxFrame(parent, id,"", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
{

}

MyTitleWnd::~MyTitleWnd()
{
}

void MyTitleWnd::OnMouseMove(wxMouseEvent &event)
{
 if(event.LeftIsDown()&&event.Dragging())
 {
 wxPoint pt = event.GetPosition();
 wxPoint wndLeftTopPt = GetPosition();
 int distanceX = pt.x - mLastPt.x;
 int distanceY = pt.y - mLastPt.y;

 wxPoint desPt;
 desPt.x = distanceX + wndLeftTopPt.x;
 desPt.y = distanceY + wndLeftTopPt.y;
 this->Move(desPt);

 }

 if (event.LeftDown())
 {
 this->CaptureMouse();
 mLastPt = event.GetPosition();
 }
}

void MyTitleWnd::OnMouseLeave(wxMouseEvent& event)
{
 if (event.LeftIsDown() && event.Dragging())
 {
 wxPoint pt = event.GetPosition();
 wxPoint wndLeftTopPt = GetPosition();
 int distanceX = pt.x - mLastPt.x;
 int distanceY = pt.y - mLastPt.y;

 wxPoint desPt;
 desPt.x = distanceX + wndLeftTopPt.x;
 desPt.y = distanceY + wndLeftTopPt.y;
 this->Move(desPt);

 }
}

void MyTitleWnd::OnMouseLDown(wxMouseEvent& event)
{
 this->CaptureMouse();
}

void MyTitleWnd::OnMouseLUp(wxMouseEvent& event)
{
 if (HasCapture())
 ReleaseMouse();
}

void MyTitleWnd::OnMouseCaptureLost(wxMouseCaptureLostEvent& event)
{
 if (HasCapture())
 ReleaseMouse();
}

好了,最后贴出效果图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++获取任务栏打开程序窗口示例

    复制代码 代码如下: // File: OpenProgramOnTaskbar.h #pragma once#include <vector> struct TaskInfo {    // 程序名称    CString strProgramName; // 窗口句柄    HWND hWnd;}; class TaskbarInfo{public:    // 回调函数    static BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lP

  • wxWidgets实现无标题栏窗口拖动效果

    本文实例为大家分享了wxWidgets实现无标题栏窗口拖动的具体代码,供大家参考,具体内容如下 最近需要做一个自定义的标题栏,而其中最重要的就是要实现窗口的拖动.默认情况下有标题栏,都可以通过拖动系统默认的标题栏,但是自定义的标题栏需要自己实现拖动. 实现无标题窗口的拖动,在MFC中可以在鼠标在窗口中拖动时,发送虚假的消息给窗口来进行实现(注:MFC可以发送鼠标在标题栏拖动的消息).但是在wxWidgets中,暂时没有看到类似的消息.因工作需要,才学习wxWidgets不久.如果有知道相关消息的

  • C# 实现窗口无边框,可拖动效果

    具体代码如下所示: #region 无边框拖动效果 [DllImport("user32.dll")]//拖动无窗体的控件 public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int

  • Pyqt实现无边框窗口拖动以及窗口大小改变

    本文实例为大家分享了Pyqt实现无边框窗口拖动及大小改变的具体代码,供大家参考,具体内容如下 做个记录,绘制边框阴影可以忽略这里不是主要 根据网上某位仁兄Qt的实现转过来的大笑,上完整代码 # coding:utf-8 from PyQt4.Qt import * import sys PADDING=4 sys.setrecursionlimit(10000) class ShadowWidget(QWidget): def __init__(self,parent=None): super(

  • c#实现无标题栏窗口的拖动

    当把窗体的FormBorderStyle属性设为None后会导致边框没了,结果窗体无法用鼠标拖动.最大.最下化和关闭-- 下面解决窗体可拖动问题:1.首先导入命名空间: 复制代码 代码如下: using System.Runtime.InteropServices; 2.然后如下代码: 复制代码 代码如下: [DllImport("user32.dll")]        public static extern IntPtr SendMessage(IntPtr hWnd,int m

  • 基于JavaScript实现窗口拖动效果

    写法类似于上一篇,水平进度条拖拽,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .nav{ width: 100%; height: 20px; background-co

  • PyQt5实现无边框窗口的标题拖动和窗口缩放

    网上找了半天都找不到好用的PyQt5无边框窗口的实现,借鉴部分前辈的窗口拖放代码,自己实现了一下无边框窗口,问题可能还有一点,慢慢改吧 先做个笔记 py文件 #!/usr/bin/env python #-*- coding:utf-8 -*- from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QVBoxLayout from PyQt5.QtCore import Qt, QPoint from PyQt5.QtGui impo

  • 使用bootstrap实现多窗口和拖动效果

    有时开发一些特效,自己感觉挺爽的,像操作自己电脑一样操作你的网页,这里就介绍一个使用bootstrap的一点多窗口和拖动效果吧! 这里,我们不使用静态打开的的方式,low...,1.添加一个a链接 触发,打开按钮;2.编写动态打开js脚本; 3.编写modal中间内容;4.添加拖动效果;5.打开多个modal , 调用dragModal(new Array('modalId1','modalId2')); 1.添加一个a链接 触发,打开按钮: <a href="javascript:;&q

  • javascript 事件处理、鼠标拖动效果实现方法详解

    先看看要拖动的层(模拟窗口)的效果图吧. 要实现的拖动效果:鼠标左键在窗口上方的标题栏上按下,同时移动鼠标,窗口跟着移动.窗口: 复制代码 代码如下: <div id="win"> <div id="win_header"></div> </div> 一点准备工作: 要让窗口能自由移动,那么窗口的定位(position)应该采用绝对定位(absolute): 给窗口添加标题栏,这里使用一个放在窗口顶部的层实现,同时将标

  • javascript实现简单的鼠标拖动效果实例

    本文实例讲述了javascript实现简单的鼠标拖动效果.分享给大家供大家参考.具体分析如下: 用鼠标拖动一个元素,放到网页的任意一个位置上,这是很常见的,例如很多博客模板版块位置可以自己拖动到相应位置. 下面先写一个简单的可以实现鼠标拖动的效果. 当鼠标按下的时候,记录鼠标当前位置和元素左边距离的差值. 当鼠标移动的时候,给元素的位置赋值,就是鼠标的位置,减去刚才的差值. 当鼠标放开的时候,给鼠标移动和鼠标放开赋值null,让它们不要再有任何动作. 要点一: disx = oevent.cli

  • Qt透明无边框窗口的实现示例

    最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.无边框.透明基本样式等功能 0x00 如何透明窗口? 第一步:开启窗口的透明层. setWindowFlags(Qt::FramelessWindowHint); /* 注意:如果单纯开启窗口透明层效果,在Windows系统中必须设置, 其他系统可忽略. */ setAttribute(Qt::WA_TranslucentBackground); 第二步: 重写paintEvent事件并使用QPainter画透明层. void paintE

随机推荐