Qt 实现无边框,可移动,可拉伸,靠屏幕边自动分屏显示的自定义窗体

分享一个无边框窗体,可以自由拖动,可以拉伸窗体,并且在靠近屏幕会自动分屏显示,跟windows自带的效果一样。最小化的同时还有动画效果。

效果图:

 

代码是网上找的拼凑过来滴~ 基本上就是重新实现Qt的nativeEvent 方法,捕捉消息。

nativeEvent 入下定义:

bool MaxWin::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
	if (eventType != "windows_generic_MSG")
		return false;

	MSG* msg = static_cast<MSG*>(message);
	QWidget* widget = QWidget::find(reinterpret_cast<WId>(msg->hwnd));
	if (!widget)
		return false;

	switch (msg->message) {

	case WM_NCCALCSIZE: {
		*result = 0;
		return true;
	}

	case WM_NCHITTEST: 
	{
		int x = GET_X_LPARAM(msg->lParam);
		int y = GET_Y_LPARAM(msg->lParam);
		QPoint pt = mapFromGlobal(QPoint(x, y));
		*result = OnTestBorder(pt);
		if (*result == HTCLIENT)
		{
			QWidget* tempWidget = this->childAt(pt.x(), pt.y());
			if (tempWidget == NULL)
			{
				*result = HTCAPTION;
			}
		}
		return true;
	}

	case WM_GETMINMAXINFO: {
		if (::IsZoomed(msg->hwnd)) {

			RECT frame = { 0, 0, 0, 0 };
			AdjustWindowRectEx(&frame, WS_OVERLAPPEDWINDOW, FALSE, 0);
			frame.left = abs(frame.left);
			frame.top = abs(frame.bottom);
			widget->setContentsMargins(frame.left, frame.top, frame.right, frame.bottom);
		}
		else {
			widget->setContentsMargins(0, 0, 0, 0);
		}

		*result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
		return true;
	}
	break;

	default:
		break;
	}

#endif

	return QWidget::nativeEvent(eventType, message, result);
}

 

完整代码:https://download.csdn.net/download/qq_36131739/11728233

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值