This commit is contained in:
朱子楚\zhuzi 2024-02-27 16:27:48 +08:00
parent 90809f5042
commit 94c3ec83b3
3 changed files with 46 additions and 40 deletions

View File

@ -112,16 +112,18 @@ bool FramelessEventFilter::nativeEventFilter(const QByteArray &eventType, void *
return true; return true;
} }
*result = 0; *result = 0;
short x = LOWORD(msg->lParam); POINT nativeGlobalPos{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};
short y = HIWORD(msg->lParam); POINT nativeLocalPos = nativeGlobalPos;
::ScreenToClient(hwnd, &nativeLocalPos);
RECT clientRect{0, 0, 0, 0};
::GetClientRect(hwnd, &clientRect);
auto clientWidth = clientRect.right-clientRect.left;
auto clientHeight = clientRect.bottom-clientRect.top;
int margins = _helper->getMargins(); int margins = _helper->getMargins();
QPointer<QQuickWindow> win = _helper->window; bool left = nativeLocalPos.x < margins;
qreal dp = _helper->window->devicePixelRatio(); bool right = nativeLocalPos.x > clientWidth - margins;
QPoint pos = win->mapFromGlobal(QPoint(x/dp, y/dp)); bool top = nativeLocalPos.y < margins;
bool left = pos.x() < margins; bool bottom = nativeLocalPos.y > clientHeight - margins;
bool right = pos.x() > win->width() - margins;
bool top = pos.y() < margins;
bool bottom = pos.y() > win->height() - margins;
*result = 0; *result = 0;
if (_helper->resizeable() && !_helper->fullScreen() && !_helper->maximized()) { if (_helper->resizeable() && !_helper->fullScreen() && !_helper->maximized()) {
if (left && top) { if (left && top) {
@ -146,17 +148,9 @@ bool FramelessEventFilter::nativeEventFilter(const QByteArray &eventType, void *
return true; return true;
} }
QVariant appBar = _helper->getAppBar(); QVariant appBar = _helper->getAppBar();
if(!appBar.isNull()){ if(!appBar.isNull()&& _helper->hoverAppBar()){
auto item = appBar.value<QQuickItem*>(); *result = HTCAPTION;
if(item->contains(pos)){ return true;
QPoint appBarTopLeft = item->mapToItem(_helper->window->contentItem(),QPoint(0, 0)).toPoint();
QRect rcAppBar = QRect(appBarTopLeft, QSize(item->width(), item->height()));
if (rcAppBar.contains(pos) && _helper->hoverAppBar())
{
*result = HTCAPTION;
return true;
}
}
} }
*result = HTCLIENT; *result = HTCLIENT;
return true; return true;

View File

@ -94,6 +94,14 @@ Rectangle{
} }
property bool isRestore: win && Window.Maximized === win.visibility property bool isRestore: win && Window.Maximized === win.visibility
property bool resizable: win && !(win.height === win.maximumHeight && win.height === win.minimumHeight && win.width === win.maximumWidth && win.width === win.minimumWidth) property bool resizable: win && !(win.height === win.maximumHeight && win.height === win.minimumHeight && win.width === win.maximumWidth && win.width === win.minimumWidth)
function containsPointToItem(point,item){
var pos = item.mapToGlobal(0,0)
var rect = Qt.rect(pos.x,pos.y,item.width,item.height)
if(point.x>rect.x && point.x<(rect.x+rect.width) && point.y>rect.y && point.y<(rect.y+rect.height)){
return true
}
return false
}
} }
MouseArea{ MouseArea{
id:mouse_app_bar id:mouse_app_bar
@ -283,30 +291,28 @@ Rectangle{
} }
function _maximizeButtonHover(){ function _maximizeButtonHover(){
var hover = false var hover = false
var pos = btn_maximize.mapToGlobal(0,0)
if(btn_maximize.visible){ if(btn_maximize.visible){
var rect = Qt.rect(pos.x,pos.y,btn_maximize.width,btn_maximize.height) if(d.containsPointToItem(FluTools.cursorPos(),btn_maximize)){
pos = FluTools.cursorPos() hover = true
if(pos.x>rect.x && pos.x<(rect.x+rect.width) && pos.y>rect.y && pos.y<(rect.y+rect.height)){
hover = true;
} }
} }
d.hoverMaxBtn = hover d.hoverMaxBtn = hover
return hover; return hover;
} }
function _appBarHover(){ function _appBarHover(){
var cursorPos = FluTools.cursorPos()
for(var i =0 ;i< d.hitTestList.length; i++){ for(var i =0 ;i< d.hitTestList.length; i++){
var item = d.hitTestList[i] var item = d.hitTestList[i]
var pos = item.mapToGlobal(0,0)
if(item.visible){ if(item.visible){
var rect = Qt.rect(pos.x,pos.y,item.width,item.height) if(d.containsPointToItem(cursorPos,item)){
pos = FluTools.cursorPos()
if(pos.x>rect.x && pos.x<(rect.x+rect.width) && pos.y>rect.y && pos.y<(rect.y+rect.height)){
return false return false
} }
} }
} }
return true if(d.containsPointToItem(cursorPos,control)){
return true
}
return false
} }
function setHitTestVisible(id){ function setHitTestVisible(id){
d.hitTestList.push(id) d.hitTestList.push(id)

View File

@ -94,6 +94,14 @@ Rectangle{
} }
property bool isRestore: win && Window.Maximized === win.visibility property bool isRestore: win && Window.Maximized === win.visibility
property bool resizable: win && !(win.height === win.maximumHeight && win.height === win.minimumHeight && win.width === win.maximumWidth && win.width === win.minimumWidth) property bool resizable: win && !(win.height === win.maximumHeight && win.height === win.minimumHeight && win.width === win.maximumWidth && win.width === win.minimumWidth)
function containsPointToItem(point,item){
var pos = item.mapToGlobal(0,0)
var rect = Qt.rect(pos.x,pos.y,item.width,item.height)
if(point.x>rect.x && point.x<(rect.x+rect.width) && point.y>rect.y && point.y<(rect.y+rect.height)){
return true
}
return false
}
} }
MouseArea{ MouseArea{
id:mouse_app_bar id:mouse_app_bar
@ -283,30 +291,28 @@ Rectangle{
} }
function _maximizeButtonHover(){ function _maximizeButtonHover(){
var hover = false var hover = false
var pos = btn_maximize.mapToGlobal(0,0)
if(btn_maximize.visible){ if(btn_maximize.visible){
var rect = Qt.rect(pos.x,pos.y,btn_maximize.width,btn_maximize.height) if(d.containsPointToItem(FluTools.cursorPos(),btn_maximize)){
pos = FluTools.cursorPos() hover = true
if(pos.x>rect.x && pos.x<(rect.x+rect.width) && pos.y>rect.y && pos.y<(rect.y+rect.height)){
hover = true;
} }
} }
d.hoverMaxBtn = hover d.hoverMaxBtn = hover
return hover; return hover;
} }
function _appBarHover(){ function _appBarHover(){
var cursorPos = FluTools.cursorPos()
for(var i =0 ;i< d.hitTestList.length; i++){ for(var i =0 ;i< d.hitTestList.length; i++){
var item = d.hitTestList[i] var item = d.hitTestList[i]
var pos = item.mapToGlobal(0,0)
if(item.visible){ if(item.visible){
var rect = Qt.rect(pos.x,pos.y,item.width,item.height) if(d.containsPointToItem(cursorPos,item)){
pos = FluTools.cursorPos()
if(pos.x>rect.x && pos.x<(rect.x+rect.width) && pos.y>rect.y && pos.y<(rect.y+rect.height)){
return false return false
} }
} }
} }
return true if(d.containsPointToItem(cursorPos,control)){
return true
}
return false
} }
function setHitTestVisible(id){ function setHitTestVisible(id){
d.hitTestList.push(id) d.hitTestList.push(id)