C# Winform實現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
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 doesn’t 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值,同時設定MenuItem的MergeType為MenuMerge.MergeItems,合併後在此列選單中的位置,就看每個選單的MergeOrder了。
2.如果想在主窗體新增新的選單列,MenuItem的MergeType為MenuMerge. 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)。可以把協程理解相互配合工作的函式,函式之間可以相互切換,並且能夠從上次切換的狀態重新開始執