您的位置:首页 > 编程语言 > Qt开发

Qt学习之路之无边窗口的移动

2014-12-25 10:01 316 查看
实现无边窗口的移动,笔者也迷惑不解了一段时间。下面给出一个例子,实现无边窗口的移动。

move_widget.h

#pragma once
#include <QWidget>
#include <QLineEdit>
#include <windows.h>
#include <WindowsX.h>

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

protected:
	bool nativeEvent(const QByteArray &eventType, void *message, long *result);

private:
	QLineEdit *lineEdit;
};


move_widget.cpp

#include "line_widget.h"

LineWidget::LineWidget(QWidget *parent /*= 0*/) : QWidget(parent)
{
	//---lineEdit 控件
	lineEdit = new QLineEdit(this);
	lineEdit->setMaxLength(8);
	lineEdit->setGeometry(30, 15, 100, 20);

	//---指定窗口大小
	resize(300, 60);

	//--设置无边窗口
	setWindowFlags(Qt::FramelessWindowHint);
}

/*
	函数名:nativeEvent
	函数参数:const QByteArray &eventType, void *message, long *result
	函数返回值:  true/ false
*/
//-----窗口移动
bool LineWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
	MSG* msg = reinterpret_cast<MSG*>(message);
	switch (msg->message)
	{
	case WM_NCHITTEST:
		int xPos = GET_X_LPARAM(msg->lParam) - this->pos().x();
		int yPos = GET_Y_LPARAM(msg->lParam) - this->pos().y();
		int iCri = 10;														//--------------------- int critical 临界值
		//---------------------------------------------------------------------- 移动窗体
		if (this->childAt(xPos, yPos) == 0)					// ---------------------child at 判断当前鼠标是否位于控件
		{
			*result = HTCAPTION;
		}
		else
		{
			return false;
		}
		return true;
	}
	return false;
}


说明: 笔者的这个 实现,必须包含2个头文件:
#include <windows.h>

#include <WindowsX.h>


上面的这个例子中,实现窗口移动的函数是:

bool nativeEvent(const QByteArray &eventType, void *message, long *result);

就是这样啦~~~~~

赶紧试试试试呗~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: