精华内容
下载资源
问答
  • 间接,没了标题栏,也没有办法拖拽标题栏移动窗口位置了 隐含,鼠标移动到窗口边缘时,鼠标形态不再改变,无法实现鼠标拖拽窗口边缘改变窗口大小 So,想使用自定义窗体也是需要付出代价。如果我既想自定义...

    QT自定义Widget实现鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变

    通过setWindowFlags(Qt::FramelessWindowHint);可以隐藏掉Qt自带的窗口标题,这句话写的简单,可是窗口引起的改变可不少:

    • 最直观的,标题栏没了
    • 间接的,没了标题栏,也没有办法拖拽标题栏移动窗口位置了
    • 隐含的,鼠标移动到窗口边缘时,鼠标形态不再改变,无法实现鼠标拖拽窗口边缘改变窗口大小

    So,想使用自定义的窗体也是需要付出代价的。如果我既想自定义窗体,也想要让自定义的窗体,兼具鼠标拖动窗口移动位置及鼠标拖拽窗口边缘窗口大小改变的特性呢,那就继续往下看吧。

    最新get到一个比较有趣的实现方式,想借着实现以上两个功能点来秀一哈。
    下面直接上代码:
    实现鼠标拖拽移动窗体的代码:

    /*MoveWgt.h*/
    #ifndef MOVEWGT_H
    #define MOVEWGT_H
    #include <QObject>
    #include <QWidget>
    #include <QMouseEvent>
    #define Move_Wgt                                                           \
    private:                                                                   \
    void mousePressEvent(QMouseEvent *event)                                   \
    {                                                                          \
        m_isPressed = true;                                                    \
        m_startMovePos = event->globalPos()-this->frameGeometry().topLeft();   \
    }                                                                          \
    void mouseMoveEvent(QMouseEvent *event)                                    \
    {                                                                          \
        if(m_isPressed)                                                        \
        {                                                                      \
            move(this->mapToGlobal(event->pos() - m_startMovePos));            \
        }                                                                      \
    }                                                                          \
    void mouseReleaseEvent(QMouseEvent *)                                      \
    {                                                                          \
        m_isPressed = false;                                                   \
    }                                                                          \
    private:                                                                   \
        bool m_isPressed = false;                                              \
        QPoint m_startMovePos;
    
    #endif // MOVEWGT_H
    

    实现拖拽改变窗体大小的代码:

    /*DragWgt.h*/
    #ifndef DRAGWGT1_H
    #define DRAGWGT1_H
    #include <QObject>
    #include <QWidget>
    #include <QMouseEvent>
    #include "Windows.h"
    #define Drag_Wgt                                                                          \
    bool nativeEvent(const QByteArray &eventType, void *message, long *result)                \
    {                                                                                         \
        MSG* pMsg = (MSG*)message;                                                            \
        switch (pMsg->message)                                                                \
        {                                                                                     \
        case WM_NCHITTEST:                                                                    \
        {                                                                                     \
            QPoint pos = mapFromGlobal(QPoint(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)));   \
            bool bHorLeft = pos.x() < g_nBorder;                                              \
            bool bHorRight = pos.x() > width() - g_nBorder;                                   \
            bool bVertTop = pos.y() < g_nBorder;                                              \
            bool bVertBottom = pos.y() > height() - g_nBorder;                                \
            if (bHorLeft && bVertTop)                                                         \
            {                                                                                 \
                *result = HTTOPLEFT;                                                          \
            }                                                                                 \
            else if (bHorLeft && bVertBottom)                                                 \
            {                                                                                 \
                *result = HTBOTTOMLEFT;                                                       \
            }                                                                                 \
            else if (bHorRight && bVertTop)                                                   \
            {                                                                                 \
                *result = HTTOPRIGHT;                                                         \
            }                                                                                 \
            else if (bHorRight && bVertBottom)                                                \
            {                                                                                 \
                *result = HTBOTTOMRIGHT;                                                      \
            }                                                                                 \
            else if (bHorLeft)                                                                \
            {                                                                                 \
                *result = HTLEFT;                                                             \
            }                                                                                 \
            else if (bHorRight)                                                               \
            {                                                                                 \
                *result = HTRIGHT;                                                            \
            }                                                                                 \
            else if (bVertTop)                                                                \
            {                                                                                 \
                *result = HTTOP;                                                              \
            }                                                                                 \
            else if (bVertBottom)                                                             \
            {                                                                                 \
                *result = HTBOTTOM;                                                           \
            }                                                                                 \
            else                                                                              \
            {                                                                                 \
                return false;                                                                 \
            }                                                                                 \
            return true;                                                                      \
        }                                                                                     \
            break;                                                                            \
        default:                                                                              \
            break;                                                                            \
        }                                                                                     \
        return QWidget::nativeEvent(eventType, message, result);                              \
    }                                                                                         \
    private:                                                                                  \
        int g_nBorder = 4;
    
    #endif // DRAGWGT_H
    
    

    咋用到程序里面呢?直接上代码:

    #ifndef TESTWGT_H
    #define TESTWGT_H
    
    #include <QWidget>
    #include "movewgt.h"
    #include "dragwgt.h"
    
    namespace Ui {
    class TestWgt;
    }
    
    class TestWgt : public QWidget
    {
        Q_OBJECT
        
        //对的,就是这两行代码,其他的请略过
        Move_Wgt//-------------实现窗体鼠标按住拖拽可移动
        Drag_Wgt//-------------实现鼠标拖拽边缘窗体大小改变
        
    public:
        explicit TestWgt(QWidget *parent = nullptr);
        ~TestWgt();
    
    private:
        Ui::TestWgt *ui;
    };
    
    #endif // TESTWGT_H
    

    注意奥,因为在MoveWgt.h中已经定义过 mousePressEvent、 mouseMoveEvent、 mouseReleaseEvent三个函数,所以在TestWgt中不能再重写该函数,否则编译会出现函数重定义的问题,DragWgt.h文件中相同。如果在自己的类中有需要重写以上函数的需要,可以不采用宏导入的这种方式,功能的实现方式不变,具体的就不在此赘述了。

    展开全文
  • VC/MFC拖动窗口任意位置移动窗口

    千次阅读 2013-06-08 22:34:21
    除了拖动标题栏移动窗口以外,我们也可以拖动窗口任意位置(除控件)位置而使对话框移动。 这里只讲述基于对话框的程序 class c**dlg:public CDialog { //Construction public: Crect startRect; //窗口的...

    除了拖动标题栏移动窗口以外,我们也可以拖动窗口任意位置(除控件)位置而使对话框移动。

    这里只讲述基于对话框的程序

    class c**dlg:public CDialog
    {
    //Construction
    public:
    	Crect startRect;     //窗口的初始位置所在的矩形
    	bool isMouseDown;    //鼠标是否按下
    	CPoint startPoint;   //鼠标按下的位置
    	.......

    其次添加OnLButtonDown消息响应函数

    void c**dlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	isMouseDown=true;
    	startPoint = point;
    	this->GetWindowRect(startRect);
    	CDialog::OnLButtonDown(nFlags, point);
    }

    添加OnMouseMove消息响应函数

    void c**dlg::ONMouseMove(UINT nFlags, CPoint point)
    {
    	if(isMouseDown == true)
    	{
    		int Dx = point.x - startPoint.x;
    		int Dy = point.y - startPoint.y;
    		startRect.left += Dx;
    		startRect.right += Dx;
    		startRect.top +=Dy;
    		startRect.bottom +=Dy;             //获取新的位置
    		this->MoveWindow(&startRect);     //将窗口移到新的位置
    	}
    	CDialog::OnMouseMove(nFlags, point);
    }

    当释放鼠标时不再拖动窗口,所以要添加OnLButtonUp消息响应函数

    void c**dlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
    	isMouseDown = false;
    	//CDialog::OnLButtonUp(nFlags,Point);
    }


     


     

    展开全文
  • 在WinForm程序中,要移动没有标题栏的窗口,基本实现思路是监听需要拖动窗口控件鼠标事件,然后将鼠标位置发送给窗口进行相应位移就可以了。通过借用Windows API也可以很容易实现这一点,比如像下面这样。...
  • 除了拖动标题栏移动窗口以外,我们也可以拖动窗口任意位置(除控件)位置而使对话框移动。 这里只讲述基于对话框程序 首先在对话框类中定义几个变量 class C***Dlg : public CDialo

    除了拖动标题栏移动窗口以外,我们也可以拖动窗口任意位置(除控件)位置而使对话框移动。

    这里只讲述基于对话框的程序

    首先在对话框类中定义几个变量

    class C***Dlg : public CDialog
    {
    // Construction
    public:
    CRect startRect;            //窗口的初始位置所在的矩形
    bool isMouseDown;       //鼠标是否按下
    CPoint startPoint;         //鼠标按下的位置

    ……

    其次添加OnLButtonDown消息响应函数

    void C***Dlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    isMouseDown=true;
    startPoint = point;
    this->GetWindowRect(startRect);

    CDialog::OnLButtonDown(nFlags, point);
    }
    添加OnMouseMove消息响应函数

    void C***Dlg::OnMouseMove(UINT nFlags, CPoint point)
    {

    if(isMouseDown == true)
    {
        int Dx = point.x - startPoint.x;
        int Dy = point.y - startPoint.y;
      
        startRect.left += Dx;
        startRect.right += Dx;
        startRect.top +=Dy;
        startRect.bottom +=Dy;             //获取新的位置

        this->MoveWindow(&startRect);     将窗口移到新的位置
    }

    CDialog::OnMouseMove(nFlags, point);
    }

    当释放鼠标时不再拖动窗口,所以要添加OnLButtonUp消息响应函数

    void CUserLoginDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
    isMouseDown=false;
    // CDialog::OnLButtonUp(nFlags, point);
    }

     

    ============================================================

    另外可以在主窗体上实现鼠标左键按下功能里面加上窗体标题拖动的消息也可以,但要在主对话框中实现

    void Cxxx::OnLButtonDown(UINT nFlags, CPoint point)
    {
    //点任意位置移动窗口
     PostMessage (WM_NCLBUTTONDOWN , HTCAPTION ,MAKELPARAM(point.x , point. y ));

    }

    展开全文
  • 在WinForm程序中,要移动没有标题栏的窗口,基本实现思路是监听需要拖动窗口控件鼠标事件,然后将鼠标位置发送给窗口进行相应位移就可以了。通过借用Windows API也可以很容易实现这一点,比如像下面这样。...

    在WinForm程序中,要移动没有标题栏的窗口,基本的实现思路是监听需要拖动窗口内的控件的鼠标事件,然后将鼠标位置发送给窗口进行相应的位移就可以了。通过借用Windows API也可以很容易实现这一点,比如像下面这样。

    public class Win32Api
    {
        public const int WM_SYSCOMMAND = 0x112;
        public const int SC_DRAGMOVE = 0xF012;
    
        [DllImport("user32.Dll", EntryPoint = "ReleaseCapture")]
        public extern static void ReleaseCapture(); // 鼠标捕获
        [DllImport("user32.Dll", EntryPoint = "SendMessage")]
        public extern static void SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); // 将消息发送给指定的窗口
    }
    
    private void pnlHeader_MouseDown(object sender, MouseEventArgs e)
    {
        Win32Api.ReleaseCapture();
        Win32Api.SendMessage(this.Handle, Win32Api.WM_SYSCOMMAND, Win32Api.SC_DRAGMOVE, 0);
    }
    
    

    当然,你还可以向这样向窗口发送消息,来实现拖动自定义标题栏移动窗口

    public const int WM_NCLBUTTONDOWN = 0x00A1;
    public const int HTCAPTION = 2;
    
    private void pnlHeader_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            // 释放控件已捕获的鼠标
            pnlHeader.Capture = false;
    
            // 创建并发送WM_NCLBUTTONDOWN消息
            Message msg =
                Message.Create(this.Handle, Win32Api.WM_NCLBUTTONDOWN,
                    new IntPtr(Win32Api.HTCAPTION), IntPtr.Zero);
            this.DefWndProc(ref msg);
        }
    }
    
    展开全文
  • 1、无标题栏,自定义边框,可以根据需要修改,做简单; 2、像QQ面板一样,需要时,可以根据需要向上加组件; 3、可以拖动修改大小,拖动移动位置; 4、2种效果比较,demo_02是最终效果,有点小问题,就是左、上...
  • 呵呵,当然是欺骗windows,本来是移动标题栏可以拖动窗体,那么我们现在是拖动客户区来移动,当我们拖动标题栏时候windows产生一个WM_NCHITTEST消息,这个消息确定鼠标点击哪个位置,这个消息返回一个值,从而...
  • 对消息WM_NCHITTEST进行处理,然后做鼠标位置的判断,如果鼠标位置在要移动窗口的客户区,则返回为鼠标在标题栏的信号,也就是欺骗windows,让它误认为你在点击标题栏,于是,你就可以正常拖动窗口了。 具体的函数...
  • 使用VC实现可拖动窗口

    千次阅读 2011-10-13 14:38:16
    有很多漂亮的小程序,它们的...通常标准的Windows窗口只有在标题栏上按下鼠标才可以拖动,那么如何实现窗口的任意位置可以拖动呢? 稍有经验的程序员会立刻想到:响应鼠标按下消息,然后在鼠标移动时移动窗口。对于
  • 移动标准窗口是通过用鼠标单击窗口标题条来实现,但对于没有标题条窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。有两种方法可以达到这一目标。   方法一:    当窗口确定鼠标位置时,...
  • MFC-移动无边框窗口

    千次阅读 2016-03-29 16:52:08
    一般的窗口都是有标题栏的,我们经常是拖动标题栏来进行窗口的移动,但是有些软件是无标题栏无边框的,这时候就需要写代码来让鼠标点击窗口任意位置可以让窗口移动了.1.添加两个成员变量,一个用来标记移动状态,一个...
  • 设计窗口应用时候,希望窗体能简洁异型,不要标题栏,能够按住窗体任意位置拖动窗口。以下代码可以实现: Winform Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove...
  • 在参考jQuery中文网站中的例子时,我发现他们在div窗口标题栏触发click事件时,将div的位置移上了一些,而mouseup的事件注册在整个div窗口上,这个思路让我很受启发,解决了鼠标移动很快而div不能跟上导致的错误,...
  • 无边框窗体是好看了,但少了控制按钮,少了标题栏的拖动移动位置,少了窗口大小调整,这些需要自己实现加上去。控制按钮和拖动功能,最好实现方式是借助一个panel来实现,这样不仅可以让控制按钮和标签显示在同一...
  •  有一个背景遮罩,支持标题栏的拖拽,在标题栏以外,在标题栏区域之外的区域拖拽是没有效果的,拖拽功能限定,他的拖拽功能被限定在可是可视区域内。  拖曳的思路:  获取鼠标的位置,鼠标移动的时候,获取鼠标
  • VC實現窗口拖動

    2013-02-03 10:56:22
    通常标准的Windows窗口只有在标题栏上按下鼠标才可以拖动,那么如何实现窗口的任意位置可以拖动呢? 稍有经验的程序员会立刻想到:响应鼠标按下消息,然后在鼠标移动时移动窗口。对于程序基础好的程序员,可以按...
  • 实现一个功能:点击并拖动该聊天窗口的标题栏可以把该窗口移动到页面的任意位置。 要求 1、鼠标点击标题栏的位置距离浏览器窗口边缘的距离,上下不能小于50px,左右不能小于100px。 2、将聊天窗口应用于复杂页面时...
  • var templeft,temptop,tempheight//窗口的位置(将窗口放在页面中间的辅助变量) var dialogcssText,dialogbodycssText;//拼出dialog和dialogbody的样式字符串 templeft = (document.body.clientWidth-width)/2; ...
  • 多进程客户端框架是目前客户端开发主流,chrome浏览器就是典型多进程架构,...现在拖动标题栏移动位置,再双击第二列,效果如下: 如图所示:移动位置后,弹出列表框里面选项依然在原位置(黑线框柱
  • 当窗口未处于最大化状态时可单击图像窗口标题栏拖动移动窗口的位置 可以单击窗口右上角的 和 按钮或者将光标放置在窗口的边界然后拖动鼠标来进行调整窗口大小 2.1 调整图像的显示 2.1.1 改变图像窗口的位置和...
  • 最近尝试做QT无标题栏窗口移动,在Linux系统上,去掉标题栏移动窗口无法拖动到边缘里面,而有标题栏可以实现,查找资料,发现windows操作系统上可以通过其他方式实现,重写WinEvent截取信号。查找到一篇很有用...
  • 4.改变文档窗口的位置和大小 当文档窗口未处于最大化状态时在文档窗口的标题栏单击并拖动鼠标即可移动窗口的位置 要调整文档窗口的尺寸用户可利用文档窗口右上角的最小化按钮 和最大化按钮 还可通过将光标置于文档...
  • 将鼠标移动到窗体布局窗口上时,鼠标变成移动形状,这时拖动窗体可以改变程序启动时窗体位于屏幕中的位置。程序启动后“Forml”窗体位于屏幕上方中间位置,而“form1.frm”窗体则位于屏幕中间。 通过在窗体布局窗口...
  • 任何功能,包括您创建自定义功能都可以分配标题栏按钮,借此即可实现更快捷鼠标访问,惯用键盘用户也可以分配自定义键盘快捷键。功能还可以分配给 DisplayFusion 多显示器任务栏跳转列表菜单,这样就可以...
  • (6)将鼠标指针移动到“任务”空白处,单击鼠标右键,在弹出的快捷菜单中单击纵向平铺窗口按钮。 (7)在两个窗口中拖动滚动条,观察文件的内容。通过汉子可以比较两个窗口的内容变化,体会用HTML语言编辑网页的...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 170
精华内容 68
关键字:

拖动窗口标题栏可以移动窗口的位置