QT 无边框QWidget通过拖拽实现窗口大小变化封装

#ifndef XRESIZEWIDGET_H
#define XRESIZEWIDGET_H

#include <QWidget>

class XFramelessResizeWidget : public QWidget
{
    Q_OBJECT
public:
    explicit XFramelessResizeWidget(QWidget *parent = 0);

    // QWidget interface
protected:
    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
    bool winEvent(MSG *message, long *result);

private:
    int m_leftPadding = 5;
    int m_topPadding = 5;
    int m_rightPadding = 5;
    int m_bottomPadding = 5;
};

#endif // XRESIZEWIDGET_H

#include "xframelessresizewidget.h"

#include "Windows.h"
#include <QDebug>

#ifndef GET_X_LPARAM
    #define GET_X_LPARAM(lParam)    ((int)(short)LOWORD(lParam))
#endif

#ifndef GET_Y_LPARAM
    #define GET_Y_LPARAM(lParam)    ((int)(short)HIWORD(lParam))
#endif

XFramelessResizeWidget::XFramelessResizeWidget(QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
}


bool XFramelessResizeWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    bool re = false;
    if ("windows_generic_MSG" == eventType)
    {
        re = winEvent((MSG*)message, result);
    }
    return re;
}



bool XFramelessResizeWidget::winEvent(MSG *message, long *result)
{
    bool bre = true;
    do
    {
        if(WM_NCHITTEST != message->message)
        {
            bre = false;
            break;
        }

        int xPos = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();
        int yPos = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();

        if(xPos <= m_leftPadding && xPos >= 0 && yPos <= m_topPadding && yPos >= 0)
        {
            *result = HTTOPLEFT;
            break;
        }

        if(xPos >= (width() - m_rightPadding) && xPos < width() && yPos <= m_topPadding && yPos >= 0)
        {
            *result = HTTOPRIGHT;
            break;
        }

        if(xPos <= m_leftPadding && xPos >= 0 && yPos >= (this->height() - m_bottomPadding) && yPos <= height())
        {
            *result = HTBOTTOMLEFT;
            break;
        }

        if(xPos >= (this->width() - m_rightPadding) && xPos <= width() && yPos >= (this->height() - m_bottomPadding) && yPos <= height())
        {
            *result = HTBOTTOMRIGHT;
            break;
        }

        if(xPos <= m_leftPadding && xPos >= 0)
        {
            *result = HTLEFT;
            break;
        }

        if(xPos >= (this->width() - m_rightPadding) &&  xPos <= width())
        {
            *result = HTRIGHT;
            break;
        }

        if(yPos < m_topPadding && yPos >= 0)
        {
            *result = HTTOP;
            break;
        }

        if(yPos>= (this->height() - m_bottomPadding) && yPos <= height())
        {
            *result = HTBOTTOM;
            break;
        }

        bre = false;
    }while(false);

    return bre;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值