#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;
}