1. 程式人生 > >C# Winform實現MDI程式子窗體與主窗體選單合併

C# Winform實現MDI程式子窗體與主窗體選單合併

這裡只講在MDI中,子選單與父選單合併的簡單方法。

首先在MDI的主窗體中:

1.在主窗體建構函式中,新增如下程式碼,注意要在InitializeComponent呼叫之後,如:

//Add File Menu

MenuItem miFile = mnuMain.MenuItems.Add("&File");

miFile.MergeOrder=1;

miFile.MergeType = MenuMerge.MergeItems;

MenuItem miAddDoc = new MenuItem( "&Add Document",

new EventHandler(this.FileAdd_Clicked),

Shortcut.CtrlA );

miAddDoc.MergeOrder=100;

MenuItem miExit = new MenuItem( "E&xit",

new EventHandler(this.FileExit_Clicked),

Shortcut.CtrlX );

miExit.MergeOrder=110;

miFile.MenuItems.Add(miAddDoc);

miFile.MenuItems.Add("-");// Give a seperator

miFile.MenuItems.Add(miExit);

//Add Window Menu

MenuItem miWindow = mnuMain.MenuItems.Add("&Window");

miWindow.MergeOrder = 10;

miWindow.MenuItems.Add( "&Cascade",

new EventHandler(this.WindowCascade_Clicked));

miWindow.MenuItems.Add( "Tile &Horizontal",

new EventHandler(this.WindowTileH_Clicked));

miWindow.MenuItems.Add( "Tile &Vertical",

new EventHandler(this.WindowTileV_Clicked));

miWindow.MdiList = true

; //Adds the MDI Window List to the bottom of the menu

2.然後為相應的Menu_Click事件定義函式,如:

#region MENU_CLICK_MESSAGE_HANDLE

//File->Add Menu item handler

protected void FileAdd_Clicked(object sender, System.EventArgs e)

{

AddMDIChild() ; //Create new MDI child window

}

//File->Exit Menu item handler

protected void FileExit_Clicked(object sender, System.EventArgs e)

{

this.Close();

}

//Window->Cascade Menu item handler

protected void WindowCascade_Clicked(object sender, System.EventArgs e)

{

this.LayoutMdi(MdiLayout.Cascade);

}

//Window->Tile Horizontally Menu item handler

protected void WindowTileH_Clicked(object sender, System.EventArgs e)

{

this.LayoutMdi(MdiLayout.TileHorizontal);

}

//Window->Tile Vertically Menu item handler

protected void WindowTileV_Clicked(object sender, System.EventArgs e)

{

this.LayoutMdi(MdiLayout.TileVertical);

}

#endregion {MENU_CLICK_MESSAGE_HANDLE}

3.建立子窗體,如:

//Add a new child window if it doesnt exist; else set focus on it

private void AddMDIChild()

{

// MyChildForm is the one I'm looking for

MDIChild myMDIChild = null;

foreach(Form f in this.MdiChildren)

{

if(f is MDIChild)

{

// found it

myMDIChild = (MDIChild) f;

break;

}

}

if( myMDIChild != null)

{

myMDIChild.Show();

myMDIChild.Focus();

}

else

{

myMDIChild = new MDIChild();

myMDIChild.MdiParent = this;

myMDIChild.Show();

myMDIChild.Focus();

}

}

當完成上面的步驟後,主窗體執行的效果如下圖所示:

然後在子窗體中,具體操作如下:

1.在子窗體建構函式中,新增如下程式碼,同樣要在InitializeComponent呼叫之後,如:

//Add File Menu

MenuItem miFile = mnuChildMain.MenuItems.Add("&File");

miFile.MergeType = MenuMerge.MergeItems;

miFile.MergeOrder = 1;

MenuItem miLoadDoc = miFile.MenuItems.Add( "&Load Document",

new EventHandler(this.LoadDocument_Clicked) );

miLoadDoc.MergeOrder = 105;

//Add Formatting Menu

MenuItem miFormat = mnuChildMain.MenuItems.Add("F&ormat");

miFormat.MergeType = MenuMerge.Add;

miFormat.MergeOrder = 5;

//Font Face sub-menu

miSansSerif = new MenuItem("&1." + sansSerifFontFamily.Name,

new EventHandler(this.FormatFont_Clicked));

miSerif = new MenuItem("&2." + serifFontFamily.Name,

new EventHandler(this.FormatFont_Clicked));

miMonoSpace = new MenuItem("&3." + monoSpaceFontFamily.Name,

new EventHandler(this.FormatFont_Clicked));

miSansSerif.Checked = true ;

miFormatFontChecked = miSansSerif ;

miSansSerif.DefaultItem = true ;

miFormat.MenuItems.Add( "Font &Face"

, (new MenuItem[]{ miSansSerif, miSerif, miMonoSpace })

);

//Font Size sub-menu

miSmall = new MenuItem("&Small", new EventHandler(this.FormatSize_Clicked));

miMedium = new MenuItem("&Medium", new EventHandler(this.FormatSize_Clicked));

miLarge = new MenuItem("&Large", new EventHandler(this.FormatSize_Clicked));

miMedium.Checked = true ;

miMedium.DefaultItem = true ;

miFormatSizeChecked = miMedium ;

miFormat.MenuItems.Add( "Font &Size"

, (new MenuItem[]{ miSmall, miMedium, miLarge })

);

2.然後為相應的Menu_Click事件定義函式,如:

#region MENU_CLICK_MESSAGE_HANDLE

//File->Load Document Menu item handler

protected void LoadDocument_Clicked(object sender, System.EventArgs e)

{

MessageBox.Show(this.Text) ;

}

//Format->Font Menu item handler

protected void FormatFont_Clicked(object sender, System.EventArgs e)

{

MenuItem miClicked = (MenuItem)sender;

miClicked.Checked = true;

miFormatFontChecked.Checked = false;

miFormatFontChecked = miClicked ;

if (miClicked == miSansSerif)

{

currentFontFamily = sansSerifFontFamily ;

}

else if (miClicked == miSerif)

{

currentFontFamily = serifFontFamily ;

}

else

{

currentFontFamily = monoSpaceFontFamily ;

}

rtbDoc.Font = new Font(currentFontFamily, fontSize);

}

//Format->Size Menu item handler

protected void FormatSize_Clicked(object sender, System.EventArgs e)

{

MenuItem miClicked = (MenuItem)sender;

miClicked.Checked = true;

miFormatSizeChecked.Checked = false;

miFormatSizeChecked = miClicked;

if (miClicked == miSmall)

{

fontSize = FontSizes.Small ;

}

else if (miClicked == miLarge)

{

fontSize = FontSizes.Large ;

}

else

{

fontSize = FontSizes.Medium ;

}

rtbDoc.Font = new Font(currentFontFamily, fontSize);

}

#endregion {MENU_CLICK_MESSAGE_HANDLE}

3.窗體的私有成員:

private struct FontSizes

{

public static float Small = 8f;

public static float Medium = 12f;

public static float Large = 24f;

}

private float fontSize = FontSizes.Medium;

private MenuItem miFormatFontChecked;

private MenuItem miFormatSizeChecked;

private MenuItem miSmall ;

private MenuItem miMedium ;

private MenuItem miLarge ;

private MenuItem miSansSerif ;

private MenuItem miSerif ;

private MenuItem miMonoSpace ;

private FontFamily currentFontFamily ;

private FontFamily monoSpaceFontFamily;

private FontFamily sansSerifFontFamily;

private System.Windows.Forms.MainMenu mnuChildMain;

private FontFamily serifFontFamily;

這樣,子窗體的程式碼也完成了,展現的效果如下圖所示:

其實在做MDI子窗體上的選單要和主窗體上的選單合併,主要是設定每個選單的MergeOrder,對於每個選單的MergeOrder設定不同的值,從而達到合併後的效果。以下用表格說明:

主窗體MergeOrder

子窗體MergeOrder

File(1)

Window(10)

File(1)

Format(5)

AddDocument( 100)

Load Document(105)

Exit(110)

注:紅色表示每個選單的MergeOrder

合併後的效果如下:

合併後的選單

File(1)

Format(5)

Window(10)

AddDocument( 100)

Load Document(105)

Exit(110)

注:紅色表示每個選單的MergeOrder

所以如果想在MDI子窗體上的選單和主窗體上的選單合併後,達到所預期的效果,就必須好好涉及它們之間的MergeOrder,大致如下:

1.如果和主窗體原有的選單列進行合併,首先把根選單的MergeOrder設定與主窗體相應選單一樣的MergeOrder值,同時設定MenuItemMergeTypeMenuMerge.MergeItems,合併後在此列選單中的位置,就看每個選單的MergeOrder了。

2.如果想在主窗體新增新的選單列,MenuItemMergeTypeMenuMerge. Add,選單列插入的位置,要看其MergeOrder了。

相關推薦

C# Winform實現MDI式子窗體窗體選單合併

這裡只講在MDI中,子選單與父選單合併的簡單方法。 首先在MDI的主窗體中: 1.在主窗體建構函式中,新增如下程式碼,注意要在InitializeComponent呼叫之後,如: //Add File Menu MenuItem miFile = mnuMain.Men

C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法

comm c# 基於 prot void 地址 tp服務器 plugin ant 本文實例講述了C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法,主要是通過重寫WndProc來實現的。分享給大家供大家參考。具體方法如下: 主要功能代碼如下:const i

C# WinForm 多線中彈出MessageBox阻塞窗口的實現方法

ebo message con gpo question 調用 C# 窗口 clas public DialogResult ShowMessage(string text, string caption, MessageBoxButtons buttons

C#Winform實現無邊框窗體滑鼠拖動

在有時候我們為了實現軟體的美觀,我們需要把窗體的邊框隱藏,但是問題也會隨之而來,在屬性中設定了FormBorderStyle應該為None,邊框便可以隱藏,但是我們在使用軟體時卻無法拖動窗體,

C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法,可通過重寫WndProc來實現

主要功能程式碼如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const i

C#Winform實現程式關閉隱藏窗體,二次程式啟動時顯示

思路:本程式啟動時候,儲存當前窗體控制代碼到檔案, 關閉時候隱藏窗體,不殺死程序,不退出. 下次啟動無需重新建立窗體,直接顯示原窗體,可以實現安卓程式的程序後臺隱藏效果. 點選桌面圖示,又同時可以防止多個程序多開的現象,避免多個程序衝突 好處:登入過的使用者,無需重新登入,

C#】winform窗體窗體傳值,子窗體窗體傳值

【1】子窗體與父窗體傳值 【2】子窗體與子窗體傳值: 前提:Form1座位父窗體,然後它new出來了兩個個子窗體分別為Form2與Form3; 要求:可以及時把Form2中產生的資料,傳遞給Form

C# Winform 跨線更新UI控件常用方法總結(轉)

sum tex ase adc 而是 this obj 出現 turn 出處:http://www.tuicool.com/articles/FNzURb 概述 C#Winform編程中,跨線程直接更新UI控件的做法是不正確的,會時常出現“線程間操作無效: 從不是創建控件的

c#自己實現池功能(二)

mod 線程池 sharp ise except mar 函數 rac 試圖 介紹 在上一篇c#自己實現線程池功能(一)中,我們基本實現了一個能夠執行的程序。而不能真正的稱作線程池。因為是上篇中的代碼有個致命的bug那就是沒有任務是並非等待,而是瘋狂的進行while循環

C# winform實現記住用戶登錄的登錄狀態

end lose 用戶名 clas for 用戶 final con ring namespace DMS { public class LoginInfo { public string AccountID {

使用Spring框架實現服務暴露調用

java 分布式 程序員 一、前言 Spring框架提供了通過HTTP協議實現遠程調用的方式,具體是調用方使用HttpInvokerProxyFactoryBean生成一個代理對象,通過代理對象遠程通過http服務調用服務提供方法的服務並,服務提供方通過HttpInvokerServiceExpo

C# WinForm實現Windows 7 Aero磨砂玻璃效果

代碼 ear bool 效果 lac err mis 桌面 onload 代碼 using System; using System.Collections.Generic; using System.ComponentModel; using System

c# winform 實現打印功能(未完)

ble preview raw using ntp review winform setup print 1.打印控件介紹(Document屬性設置為PrintDocument1;ShowDialog()方法顯示對話窗) PrintDialog控件(打印會話):用於選擇打印

多線動態規劃算法求解TSP(Traveling Salesman Problem) 並附C語言實現

影響 () 高效率 let ever 好的 出現 我們 運算 TSP問題描述:   旅行商問題,即TSP問題(Travelling Salesman Problem)又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所

c# Winform 多線操作

dst oss vat event component private 過程 pre ini 主要是對一個過程需要的時間很長執行時會出現界面假死的情況 方法1: Application.DoEvents(),這種方法當你拖動窗體時,界面不會假死。但在你拖動時代碼不再執行,也

機房收費系統之細化篇(跨日期下機,MDI窗體的運用,MDI窗體窗體的互動)

      最近在細化機房收費系統時,發現在下機窗體出現了很多消費時間為負值的情況,有時還會彈出Bug,仔細一看原來是跨日期的消費時間問題,那麼如何設定跨日期的下機呢?在機房收費系統中的MDI 窗體如何運用呢?下面就這兩個問題進行梳理分享。 一、跨日期的下機 核

C#Winform 實現資料的匯出為txt或者CSV或者excel

//filePath 為儲存到本地磁碟的位置 private void Export(string filePath) { using (FileStream fs=new FileStream(filePath,FileMode.Create,

附例項!實現iframe父窗體窗體的通訊

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文由前端林子發表於雲+社群專欄 本文主要會介紹如何基於MessengerJS,實現iframe父窗體與子窗體間的通訊,傳遞資料資訊。同時本文會提供一個可執行的例項程式碼,實現在父窗體中,獲取到來自子窗體的資料

C#winform實現滑鼠響應左鍵按下,並記下其座標

private void Form1_MouseClick(object sender, MouseEventArgs e) { this.label1.Text = "相對座標:" +this.PointToClient(Mous

C語言實現(coroutine)

Donald Knuth 說過: “子程式就是協程的一種特例。” 程式設計過程中,最常用的就是函式呼叫,這時對於呼叫方來說,被調函式就是子程式(subroutine)。可以把協程理解相互配合工作的函式,函式之間可以相互切換,並且能夠從上次切換的狀態重新開始執