Compare commits

..

No commits in common. "5e384934033b6e28e4c5891be365ca9aad1f7497" and "d34751248603529ed2934403f19ebddc5f17e6f2" have entirely different histories.

6 changed files with 129 additions and 158 deletions

View File

@ -20,6 +20,7 @@ FluWindow {
launchMode: FluWindowType.SingleTask launchMode: FluWindowType.SingleTask
fitsAppBarWindows: true fitsAppBarWindows: true
appBar: FluAppBar { appBar: FluAppBar {
width: window.width
height: 30 height: 30
darkText: Lang.dark_mode darkText: Lang.dark_mode
showDark: true showDark: true

View File

@ -23,6 +23,7 @@ FluWindow {
launchMode: FluWindowType.SingleTask launchMode: FluWindowType.SingleTask
fitsAppBarWindows: true fitsAppBarWindows: true
appBar: FluAppBar { appBar: FluAppBar {
width: window.width
height: 30 height: 30
darkText: Lang.dark_mode darkText: Lang.dark_mode
showDark: true showDark: true

View File

@ -46,10 +46,12 @@ bool FramelessEventFilter::nativeEventFilter(const QByteArray &eventType, void *
} }
return false; return false;
}else if(uMsg == WM_NCCALCSIZE){ }else if(uMsg == WM_NCCALCSIZE){
NCCALCSIZE_PARAMS* sz = reinterpret_cast<NCCALCSIZE_PARAMS*>(msg->lParam); #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
NCCALCSIZE_PARAMS& sz = *reinterpret_cast<NCCALCSIZE_PARAMS*>(msg->lParam);
*result = WVR_REDRAW; *result = WVR_REDRAW;
sz->rgrc[0].top -= 1; sz.rgrc[0].top -= 1;
return true; return true;
#endif
} }
return false; return false;
#endif #endif
@ -159,16 +161,10 @@ void FluFrameless::componentComplete(){
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
_nativeEvent =new FramelessEventFilter(_window); _nativeEvent =new FramelessEventFilter(_window);
qApp->installNativeEventFilter(_nativeEvent); qApp->installNativeEventFilter(_nativeEvent);
HWND hwnd = reinterpret_cast<HWND>(_window->winId()); HWND hWnd = reinterpret_cast<HWND>(_window->winId());
ULONG_PTR cNewStyle = GetClassLongPtr(hwnd, GCL_STYLE) | CS_DROPSHADOW; ULONG_PTR cNewStyle = GetClassLongPtr(hWnd, GCL_STYLE) | CS_DROPSHADOW;
SetClassLongPtr(hwnd, GCL_STYLE, cNewStyle); SetClassLongPtr(hWnd, GCL_STYLE, cNewStyle);
DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); SetWindowPos(hWnd,nullptr,0,0,0,0,SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE |SWP_FRAMECHANGED);
SetWindowPos(hwnd,nullptr,0,0,0,0,SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE |SWP_FRAMECHANGED);
SetWindowLong(hwnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION);
connect(this,&FluFrameless::stayTopChanged,this,[this,hwnd](){
DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION);
});
#endif #endif
} }
} }

View File

@ -28,7 +28,6 @@ public:
class FluFrameless : public QObject, public QQmlParserStatus class FluFrameless : public QObject, public QQmlParserStatus
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY_AUTO(bool,stayTop)
QML_NAMED_ELEMENT(FluFrameless) QML_NAMED_ELEMENT(FluFrameless)
public: public:
explicit FluFrameless(QObject *parent = nullptr); explicit FluFrameless(QObject *parent = nullptr);

View File

@ -16,6 +16,7 @@ Window {
property bool fitsAppBarWindows: false property bool fitsAppBarWindows: false
property Item appBar: FluAppBar { property Item appBar: FluAppBar {
title: window.title title: window.title
width: window.width
height: 30 height: 30
showDark: window.showDark showDark: window.showDark
showClose: window.showClose showClose: window.showClose
@ -86,6 +87,14 @@ Window {
} }
lifecycle.onVisible(visible) lifecycle.onVisible(visible)
} }
Component{
id:com_frameless
FluFrameless{
}
}
FluLoader{
id:loader_frameless
}
QtObject{ QtObject{
id:d id:d
property bool isFirstVisible: true property bool isFirstVisible: true
@ -110,24 +119,53 @@ Window {
target: window target: window
function onClosing(event){closeListener(event)} function onClosing(event){closeListener(event)}
} }
Component{
id:com_frameless
FluFrameless{
stayTop: window.stayTop
}
}
Component{ Component{
id:com_background id:com_background
Rectangle{ Rectangle{
color: window.backgroundColor color: window.backgroundColor
} }
} }
FluLoader{
anchors.fill: parent
sourceComponent: background
}
FluLoader{
id:loader_app_bar
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: {
if(window.useSystemAppBar){
return 0
}
return window.fitsAppBarWindows ? 0 : window.appBar.height
}
sourceComponent: window.useSystemAppBar ? undefined : com_app_bar
}
Component{ Component{
id:com_app_bar id:com_app_bar
Item{ Item{
data: window.appBar data: window.appBar
} }
} }
Item{
id:container
anchors{
top: loader_app_bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true
}
FluLoader{
property string loadingText: "加载中..."
property bool cancel: false
id:loader_loading
anchors.fill: container
}
Component{ Component{
id:com_loading id:com_loading
Popup{ Popup{
@ -190,78 +228,27 @@ Window {
} }
} }
} }
FluLoader{ FluInfoBar{
anchors.fill: parent id:infoBar
sourceComponent: background root: window
} }
FluLoader{ WindowLifecycle{
id:loader_frameless id:lifecycle
} }
Item{ Rectangle{
id:layout_content
anchors.fill: parent anchors.fill: parent
anchors.margins: { anchors.topMargin: FluTools.isWin() ? 1/Screen.devicePixelRatio : 0
if(FluTools.isWin() && !window.useSystemAppBar){ color:"transparent"
return window.visibility === Window.Maximized ? 8 : 0 border.width: window.resizeBorderWidth
border.color: window.resizeBorderColor
visible: {
if(window.useSystemAppBar){
return false
} }
return 0 if(window.visibility == Window.Maximized || window.visibility == Window.FullScreen){
} return false
onWidthChanged: {
window.appBar.width = width
}
FluLoader{
id:loader_app_bar
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: {
if(window.useSystemAppBar){
return 0
}
return window.fitsAppBarWindows ? 0 : window.appBar.height
}
sourceComponent: window.useSystemAppBar ? undefined : com_app_bar
}
Item{
id:container
anchors{
top: loader_app_bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true
}
FluLoader{
property string loadingText: "加载中..."
property bool cancel: false
id:loader_loading
anchors.fill: container
}
FluInfoBar{
id:infoBar
root: window
}
WindowLifecycle{
id:lifecycle
}
Rectangle{
anchors.fill: parent
color:"transparent"
anchors.topMargin: FluTools.isWin() ? 1/Screen.devicePixelRatio : 0
border.width: window.resizeBorderWidth
border.color: window.resizeBorderColor
visible: {
if(window.useSystemAppBar){
return false
}
if(window.visibility == Window.Maximized || window.visibility == Window.FullScreen){
return false
}
return true
} }
return true
} }
} }
function destoryOnClose(){ function destoryOnClose(){

View File

@ -15,6 +15,7 @@ Window {
property bool fitsAppBarWindows: false property bool fitsAppBarWindows: false
property Item appBar: FluAppBar { property Item appBar: FluAppBar {
title: window.title title: window.title
width: window.width
height: 30 height: 30
showDark: window.showDark showDark: window.showDark
showClose: window.showClose showClose: window.showClose
@ -85,6 +86,14 @@ Window {
} }
lifecycle.onVisible(visible) lifecycle.onVisible(visible)
} }
Component{
id:com_frameless
FluFrameless{
}
}
FluLoader{
id:loader_frameless
}
QtObject{ QtObject{
id:d id:d
property bool isFirstVisible: true property bool isFirstVisible: true
@ -109,24 +118,53 @@ Window {
target: window target: window
function onClosing(event){closeListener(event)} function onClosing(event){closeListener(event)}
} }
Component{
id:com_frameless
FluFrameless{
stayTop: window.stayTop
}
}
Component{ Component{
id:com_background id:com_background
Rectangle{ Rectangle{
color: window.backgroundColor color: window.backgroundColor
} }
} }
FluLoader{
anchors.fill: parent
sourceComponent: background
}
FluLoader{
id:loader_app_bar
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: {
if(window.useSystemAppBar){
return 0
}
return window.fitsAppBarWindows ? 0 : window.appBar.height
}
sourceComponent: window.useSystemAppBar ? undefined : com_app_bar
}
Component{ Component{
id:com_app_bar id:com_app_bar
Item{ Item{
data: window.appBar data: window.appBar
} }
} }
Item{
id:container
anchors{
top: loader_app_bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true
}
FluLoader{
property string loadingText: "加载中..."
property bool cancel: false
id:loader_loading
anchors.fill: container
}
Component{ Component{
id:com_loading id:com_loading
Popup{ Popup{
@ -189,77 +227,26 @@ Window {
} }
} }
} }
FluLoader{ FluInfoBar{
anchors.fill: parent id:infoBar
sourceComponent: background root: window
} }
FluLoader{ WindowLifecycle{
id:loader_frameless id:lifecycle
} }
Item{ Rectangle{
id:layout_content
anchors.fill: parent anchors.fill: parent
anchors.margins: { color:"transparent"
if(FluTools.isWin() && !window.useSystemAppBar){ border.width: window.resizeBorderWidth
return window.visibility === Window.Maximized ? 8 : 0 border.color: window.resizeBorderColor
visible: {
if(window.useSystemAppBar){
return false
} }
return 0 if(window.visibility == Window.Maximized || window.visibility == Window.FullScreen){
} return false
onWidthChanged: {
window.appBar.width = width
}
FluLoader{
id:loader_app_bar
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: {
if(window.useSystemAppBar){
return 0
}
return window.fitsAppBarWindows ? 0 : window.appBar.height
}
sourceComponent: window.useSystemAppBar ? undefined : com_app_bar
}
Item{
id:container
anchors{
top: loader_app_bar.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
clip: true
}
FluLoader{
property string loadingText: "加载中..."
property bool cancel: false
id:loader_loading
anchors.fill: container
}
FluInfoBar{
id:infoBar
root: window
}
WindowLifecycle{
id:lifecycle
}
Rectangle{
anchors.fill: parent
color:"transparent"
border.width: window.resizeBorderWidth
border.color: window.resizeBorderColor
visible: {
if(window.useSystemAppBar){
return false
}
if(window.visibility == Window.Maximized || window.visibility == Window.FullScreen){
return false
}
return true
} }
return true
} }
} }
function destoryOnClose(){ function destoryOnClose(){