Windows窗體巢狀問題解決

2022-03-02 20:26:47 字數 1510 閱讀 5922

窗體巢狀

經驗豐富的visual basic開發者知道多文件介面(mdi)應用程式能夠包含子窗體,那些子窗體由mdi父窗體管理。但是如果沒有mdi的能力你怎樣實現包含巢狀窗體?例如乙個mdi子窗體也可能需要包含另乙個窗體。

有時能夠使用使用者控制項(usercontrol)實現這種功能,但是如果你真的需要把乙個窗體巢狀進另乙個窗體,有多種方法可以實現。窗體衍生自control類,這意味著它能被放入另乙個窗體的控制項集合中,使用如下的邏輯:

dim f as new frmembed2()

me.controls.add(f)

f.show()

但是很不幸,這段**將會導致乙個執行時(runtime)異常(見圖1)。

圖1.試圖把乙個窗體新增到另乙個窗體的控制項集合時出現的執行時錯誤

為了避免這種異常,該窗體的toplevel屬性必須設定為false(見下面的**)。

dim f as new frmembed2()

f.toplevel = false

me.controls.add(f)

f.show()

補助說明(c#):

在使用visual studio 2008 開發windows程式的時候,需要在容器控制項中顯示乙個新的form,直接使用如下**出現異常無法將頂級控制項新增到控制項:

myform myform = new myform();

container.controls.add(myform);

網上查閱了相關資料,解決方法很簡單。由於form預設為頂級控制項,所以在容器控制項中加入會出現標題所示異常。

只要在新增控制項的**之前將form設定為非頂級控制項即可解決錯誤。

myform myform = new myform();

myform.toplevel = false;

container.controls.add(myform);

圖2顯示的是使用上面的邏輯實現的乙個窗體嵌入另乙個窗體。嵌入的窗體有乙個標題條(它的顏色是未啟用的系統顏色),因此該嵌入窗體能在容器窗體內四處拖動。在圖2中,該窗體從它的開始位置(左上角)拖到了右下角。

圖2.在容器窗體中有乙個嵌入的窗體。嵌入的窗體能在容器窗體中拖動。

通常在顯示嵌入的窗體前先設定它的位置。這只需要簡單的設定嵌入窗體的left和top屬性。嵌入窗體的位置與容器窗體是相對的。

與mdi子窗體不同,嵌入窗體能覆蓋容器窗體上的控制項。圖3顯示了它們的不同。

圖3.嵌入窗體(左)可以覆蓋容器窗體上的控制項。mdi子窗體(右)不能覆蓋mdi父窗體上的控制項。

在右邊的mdi例子中,沒有辦法使按鈕隱藏在子窗體的後面。但是在左邊該按鈕被嵌入窗體覆蓋了。

當窗體第一次被嵌入時,它將顯示在容器窗體上的已存在的控制項的後面。當它被點選時,它走向前台並停留在那兒。這會打擾使用者,但是能通過插入下面的**防止這種情況發生:

f.bringtofront()

嵌入的窗體可以包含其它的嵌入窗體,沒有實際的限制。圖4顯示了乙個本身包含嵌入的窗體的嵌入窗體。

圖4.乙個包含嵌入窗體的嵌入窗體

巢狀Makefile問題解決一例

先看一下目錄結構 總控makefile如下 1 cflags wall2 cc gcc3 4 5 subdirs server client6 7 export cflags cc8 9 10 11 all subdirs 12 13 subdirs 14 make c 15 16 17 clean...

問題解決 限制窗體的最小尺寸

曾經都是用對話方塊做東西,這次用的sdi。網上好多方法,有在onsize裡面setwindowpos或者movewindow的,也有在onsizing裡面用這兩個函式的。顯然這都不是好辦法,會刷屏亂閃。正確而又優雅的做法非常easy,處理框架窗體的wm getminmaxinfo訊息就可以。比如vo...

表單巢狀問題的解決方法

在html中,表單form是不能夠巢狀使用的,例如 name form1 name form2 form form 這樣是不合法的,那麼如果我們遇到需要用到兩個表單的情況應該怎麼辦呢?解決的方法很簡單,合併兩個表單,動態改變表單提交位置。表單form中的action為空,然後在js 中改變actio...