Duilib教程 自動布局1

2022-03-09 12:22:20 字數 3488 閱讀 1217

我們要實現乙個帶標題欄和狀態列的程式,同時要支援拉伸,即包括最小化、最大化,圖如下:

在duidesigner中,拖動視窗邊框,即可看到效果,標題欄和狀態列的位置都不變,即隨視窗大小而改變。

看屬性,發現,status和title都有屬性 height,而中間的,什麼屬性都沒有。在視窗設定如下:

可以知道,pos即可以設定float屬性為false的拉伸操作,所以不只是layout可以隨視窗(準確的說應該是擁有它的layout)自由拉伸,普通的控制項也可以,只要float為false。

float意思為浮動,當它為true時,它就浮動在視窗上面,位置永遠不會變(相對於擁有它的layout)。

當它為false時,它浮不起來,停在水上,隨波逐流,所以能夠被流水(layout)改變它的大小。

注意,只有right和bottom才有效。如果不為0,那麼它就是該高度,即不隨父layout改變大小(位置不能更改)。為0就是跟父layout更改大小。

在上面這個示例中,關閉按鈕並不隨著視窗改變位置,因為我們看到了,它的float為true。如果我們想要它永遠停在最右邊呢?

看下面的xml:

xml version="1.0" encoding="utf-8" standalone="yes" 

?>

<

window

size

="695,542"

>

<

verticallayout

width

="657"

height

="517"

bkcolor

="#ffa0a0a4"

>

<

horizontallayout

name

="title"

height

="32"

bkcolor

="#ff63a6f1"

>

<

button

text

="x"

bordersize

="1"

maxwidth="60"

pos="608,0,0,0"

width

="60"

height

="30"

bkcolor

="#ff008067"

bkcolor2

="#0000c020"

bordercolor

="#00ffff00"

textcolor

="#ff000000"

disabledtextcolor

="#ffa7a6aa"

align

="center"

/>

horizontallayout

>

<

horizontallayout

name

="mid"

bkcolor

="#ffbababa"

/>

<

horizontallayout

name

="status"

height

="30"

bkcolor

="#ff808080"

/>

verticallayout

>

window

>

我們加了乙個 float 的 control,以及將關閉按鈕的 maxwidth設定為60,同時float設定為false(float屬性預設為false)。

這樣設定的意思是:關閉按鈕最大寬度為60,所以它不能被拉得更寬。

在它的左邊有乙個float,它可以被任意拉伸。所以當視窗被拉伸時,關閉按鈕為60,左邊的control就被拉伸到視窗寬 - 60

如果最右邊要加最大化、最小化按鈕,實現原理也是一樣的。當然,你可以在最右邊加乙個layout,在這個layout上加上最小化、最大化、關閉按鈕,這樣層次感更強,也更容易管理和修改。

Duilib教程 自動布局1

我們要實現乙個帶標題欄和狀態列的程式,同時要支援拉伸,即包括最小化 最大化,圖如下 在duidesigner中,拖動視窗邊框,即可看到效果,標題欄和狀態列的位置都不變,即隨視窗大小而改變。看屬性,發現,status和title都有屬性 height,而中間的,什麼屬性都沒有。在視窗設定如下 可以知道...

Duilib教程 自動布局2

在上一節中,我簡單介紹了控制項隨父layout自由移動的設定。在這一節,我將介紹一種常見的情況 嵌入視窗。uimanager.cpp 第750行 case wm size event.type uievent windowsize event.psender m pfocus event.dwtim...

Duilib教程 自動布局2

在上一節中,我簡單介紹了控制項隨父layout自由移動的設定。在這一節,我將介紹一種常見的情況 嵌入視窗。uimanager.cpp 第750行 case wm size event.type uievent windowsize event.psender m pfocus event.dwtim...