應用程序實例——用戶信息管理
下面用我們學過的知識創建一個應用程序實例,演示MDI窗體的用法,此窗體包括菜單,工具欄和狀態欄。用戶選擇“創建用戶”菜單中“創建學員賬戶”菜單項,或者單擊工具欄上的“創建”按鈕后,將顯示“frmNewUser”窗體。使用“菜單管理”命令可動態添加上下文菜單,狀態欄顯示日期和當前窗體名稱,選擇“退出系統”菜單可退出系統。 創建步驟如下: 1、創建一個名為“UserManage”的Windows應用程序。 2、將Form1改為frmUserManage,作為主窗體,將其“IsMdiContainer”屬性值設置為true,這個窗體成為子窗體的窗器。 3、將菜單欄(MenuStrip)、工具欄(ToolStrip)、和狀態欄(StatusStrip)控件拖到窗體上,建成界面。  4、將以下代碼添加到frmUserManage的Load事件中。 private void frmUserManage_Load(object sender, EventArgs e) { this.toolStripStatusLabel1.Text = DateTime.Now.ToString(); } 以上代碼實現窗體載入時,在狀態欄的Label標簽中顯示當前時間。 5、在項目上右擊,打開關聯菜單,選擇“添加新項”—“Windows窗體”命令,打開“添加新項”對話框,修改名稱為“frmNewUser”,單擊“確定”按鈕。窗體界面如下:
 6、將以下代碼添加到“創建學生用戶的菜單”中 private void 創建學生用戶ToolStripMenuItem_Click(object sender, EventArgs e) { frmNewUser user = new frmNewUser(); user.MdiParent = this; user.WindowState = FormWindowState.Maximized; user.Show(); this.toolStripStatusLabel2.Text = this.ActiveMdiChild.ToString(); }  以上代碼實現選擇“創建學生用戶”菜單時,打開frmNewUser窗體,作為子窗體打開,並在主窗體的狀態欄中顯示當前活動窗體的信息。 7、將以下代碼加到“退出”菜單項和工具欄的“退出”按鈕中。 private void 退出EToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } 8、將以下代碼添加到“用戶管理”菜單項的Click事件中。 private void 用戶管理ToolStripMenuItem_Click(object sender, EventArgs e) { ContextMenuStrip mnuContext = new ContextMenuStrip(); this.ContextMenuStrip = mnuContext; mnuContext.Items.Add("創建用戶"); mnuContext.Items.Add("查詢用戶"); mnuContext.Items.Add("退出系統"); } 該代碼用於動態創建應用程序上下文菜單。 9、對於實現的功能鍵,添加一個提示信息,代碼如下: private void toolStripButton2_Click(object sender, EventArgs e) { MessageBox.Show("正在建設中"); } 編譯並運行,首先出現的是主窗體,單擊“創建”按鈕,frmNewUser窗體作為子窗體顯示在主窗體中。  C# winForm 將窗體狀態欄StatusStrip示例(顯示當前時間)
實現效果:通過StatusStrip顯示窗體狀態欄,同時將狀態欄分成三部分: 居左邊顯示相關文字信息,中間空白顯示,居右邊顯示時間信息。 1.創建窗體及添加StatusStrip 默認StatusStrip名稱為statusStrip1 2.在statusStrip1的Items屬性中 添加三個StatusLabel 默認名稱為toolStripStatusLabel1,2,3 按1,2,3的順序排列 3.修改toolStripStatusLabel1的Text屬性 為相關文字如"歡迎使用本系統" 4.修改toolStripStatusLabel2的Text屬性 為空 Sprint屬性為True BorderSides屬性為Left,Right 5.修改toolStripStatusLabel3的Text屬性 為空 在Form的Load事件中 修改其顯示為當前時間 this.toolStripStatusLabel3.Text = "登錄時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); 6.如果要使狀態欄時間信息隨操作系統當前時間不停的改變 則可以通過增加Timer控件來實現 增加Timer控件 timer1 編寫其Tick事件為 private void timer1_Tick(object sender, EventArgs e) { this.toolStripStatusLabel3.Text = "系統當前時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); } 在Form的Load事件中 對timer1進行相關設置 private void MainForm_Load(object sender, EventArgs e) { this.toolStripStatusLabel3.Text = "系統當前時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); this.timer1.Interval=1000; this.timer1.Start(); } |
|
C#windows服務中的Timer控件的使用
C#windows服務程序中的Timer控件的使用是什么情況呢?那么本文就C#windows服務程序中的Timer控件的使用問題向你介紹相關的操作。 C# windows服務程序中的Timer控件的使用問題是如何解決的呢? 今天和同事一起研究了下C# windows服務程序中的Timer控件的使用的寫法. 我們在建立一個C# windows服務程序后,要用到計時器的話一般都會想到Timer控件,於是到工具器把Timer控件拉過來,雙擊寫事件,設置時間,哇,成功了.... 但服務一跑起來,唉,怎么回事,時間到了怎么沒有執行事件呢? 后來,我找很多資料才知道,這個Timer控件是winForm下的,不能用在C# windows服務程序中. 怎么辦呢....... 打開"工具箱"---右鍵---"選擇項"---找到Timer控件,看好了,這個Timer控件的是system.Timer下的.可不是System.Windows.Form.然后添加.  雙擊...寫事件... OK,搞定 C#windows服務程序中的Timer控件的使用的相關操作就向你介紹到這里,希望對你了解C#windows服務程序中的Timer控件的使用有所幫助。 |
Windows Forms高級界面組件-Timer控件實例
要求顯示計算機運行的時間長度和應用程序運行的時間長度,界面如圖
 代碼如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace Example_1 { /// <summary> /// Summary description for Form1. /// </summary> public class frmTickCounter : System.Windows.Forms.Form { private System.Windows.Forms.Label lblComputer; private System.Windows.Forms.Label lblApplication; private System.Windows.Forms.GroupBox grpElapsed; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Timer tmrTickTimer; private System.ComponentModel.IContainer components; private int compuTime; public frmTickCounter() { InitializeComponent(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.grpElapsed = new System.Windows.Forms.GroupBox(); this.lblApplication = new System.Windows.Forms.Label(); this.lblComputer = new System.Windows.Forms.Label(); this.btnClose = new System.Windows.Forms.Button(); this.tmrTickTimer = new System.Windows.Forms.Timer(this.components); this.grpElapsed.SuspendLayout(); this.SuspendLayout(); // // grpElapsed // this.grpElapsed.Controls.Add(this.lblApplication); this.grpElapsed.Controls.Add(this.lblComputer); this.grpElapsed.Font = new System.Drawing.Font( "Microsoft Sans Serif ", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); this.grpElapsed.Location = new System.Drawing.Point(8, 8); this.grpElapsed.Name = "grpElapsed "; this.grpElapsed.Size = new System.Drawing.Size(600, 120); this.grpElapsed.TabIndex = 0; this.grpElapsed.TabStop = false; this.grpElapsed.Text = "開機時長 "; // // lblApplication // this.lblApplication.Location = new System.Drawing.Point(16, 72); this.lblApplication.Name = "lblApplication "; this.lblApplication.Size = new System.Drawing.Size(576, 26); this.lblApplication.TabIndex = 1; // // lblComputer // this.lblComputer.Location = new System.Drawing.Point(16, 32); this.lblComputer.Name = "lblComputer "; this.lblComputer.Size = new System.Drawing.Size(576, 26); this.lblComputer.TabIndex = 0; // // btnClose // this.btnClose.Location = new System.Drawing.Point(488, 136); this.btnClose.Name = "btnClose "; this.btnClose.Size = new System.Drawing.Size(115, 26); this.btnClose.TabIndex = 1; this.btnClose.Text = "關閉 "; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // tmrTickTimer // this.tmrTickTimer.Enabled = true; this.tmrTickTimer.Interval = 20; this.tmrTickTimer.Tick += new System.EventHandler(this.tmrTickTimer_Tick); // // frmTickCounter // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(616, 173); this.Controls.Add(this.btnClose); this.Controls.Add(this.grpElapsed); this.Name = "frmTickCounter "; this.Text = "時鍾 "; this.Load += new System.EventHandler(this.frmTickCounter_Load); this.grpElapsed.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new frmTickCounter()); } private void frmTickCounter_Load(object sender, System.EventArgs e) { compuTime = Environment.TickCount; } private void tmrTickTimer_Tick(object sender, System.EventArgs e) { //Environment類提供有關當前環境和平台的信息以及操作它們的方法 long curTickValue = Environment.TickCount; long difference = curTickValue - compuTime; long computerHours, computerMinutes, computerSeconds; long applicationHours, applicationMinutes, applicationSeconds; //converting milliseconds into hours, minutes and seconds computerHours = (curTickValue / (3600 * 999)) % 24; computerHours = (curTickValue / (3600 * 999)) % 24; computerMinutes = (curTickValue / (60 * 999)) % 60; computerSeconds = (curTickValue / 999) % 60; applicationHours = (difference / (3600 * 999)) % 24; applicationMinutes = (difference / (60 * 999)) % 60; applicationSeconds = (difference / 999) % 60; this.lblComputer.Text = String.Format( "本計算機已運行了 {0} 小時 {1} 分 {2} 秒 ", computerHours.ToString(), computerMinutes.ToString(), computerSeconds.ToString()); this.lblApplication.Text = String.Format( "本應用程序已運行了 {0} 小時 {1} 分 {2} 秒 ", applicationHours.ToString(), applicationMinutes.ToString(), applicationSeconds.ToString()); } private void btnClose_Click(object sender, System.EventArgs e) { this.Close(); } } } 以上代碼是別人源碼,我雖然在機器上運行過,但對其每行的意義不是很了解,希望朋友們多多指導! |
Windows Forms高級界面組件-Timer控件
Timer控件提供了一種可在程序運行時操控時間的機制。它是一種非可視化控件,不向用戶提供用戶界面,因此在運行時不會顯示在界面上。它類似與時鍾,在指定的時間間隔不斷記時,時間一到即觸發事件,執行預設的動作。 Timer控件的主要屬性 Enabled:用於設置是否啟用定時器 Interval:設置時鍾周期,單位ms Timer控件的主要事件 Tick::設定的時間到,觸發該事件 Timer控件的主要方法 Start():啟動時鍾進行計時。 Stop():停止時鍾 Interval屬性用來決定每隔多長的時間要引發回送,其設置值的單位是毫秒(也就是千分之一秒),默認值則是60000毫秒,也就是60秒。這里需要大家注意的是,將Timer控件的Interval屬性設置成較小的值會使得回送頻率增加,也很容易使得Web服務器的流量大增,對整體資源耗用與效率都會造成不良的影響。因此盡量在確實需要的時候使用Timer控件來定時更新頁面上的內容。 每當Timer控件的Interval屬性所設置的間隔時間到達而進行回送時,就會在服務器上引發Tick事件。我們通常會為Tick事件處理函數編寫程序代碼,以便能夠根據自己的需求來定時執行特定操作。 另外一個常用的屬性就是Enabled,用戶可以將Enabled屬性設置成false以便讓Timer控件停止計時,而當需要讓Timer控件再次開始計時的時候,只需再將Enabled屬性設置成True即可。 Timer控件在UpdatePanel控件的內外是有區別的。當Timer控件在UpdatePanel控件內部時,JavaScript計時組件只有在一次回傳完成進才會重新建立。也就說直到網頁回傳之前,定時器間隔時間不會從頭計算。例如,用戶設置Timer控件的Interval屬性值為6000ms(6s),但是回傳操作本身卻花了2s才完成,則下一次的回傳將發生在前一次回傳被引發之后的8s。而如果Timer控件位於UpdatePanel控件之外,則當回傳正在處理時,下一次的回傳仍將發在前一次回傳被引發之后的6s。也就是說,UpdatePanel控件的內容被更新之后的4s,就會再次看到該控件被更新。 C#解決StatusStrip控件上的項目不能靠右對齊的問題
在C#中用到了狀態欄控件StatusStrip,但當我想把StatusStrip上某個StatusLabel靠右對齊時出了問題。 按照MSDN中的辦法,是設置ToolStripStatusLabel的Alignment屬性為Right。不過我在設計界面的屬性窗口中找不到Alignment。 就算加入代碼toolStripStatusLabel2.Alignment = ToolStripItemAlignment.Right; 也還是沒什么效果。 后來我找到兩種方法解決這個問題: 方法一: 在狀態欄所有項目(StatusLabel、ProgressBar、DropDownButton等)前添加一個空白的StatusLabel (Text屬性為空),並將其Spring屬性設為True。 Spring屬性的作用是設置該項是否填滿剩余空間,設為True以后,當程序運行時后面的項就都擠到右邊,實現靠右對齊了。 如果更進一步,需要一部分項靠左,一部分靠右,那就在兩部分中間插入空白StatusLabel,同時設其Spring屬性為True。 這種方法比較簡單,不用手工添加代碼。首選! 方法二: 這個方法是我無意中發現的。 設置StatusStrip控件的LayoutStyle屬性為HorizontalStackWithOverflow 或 StackWithOverflow。 然后在代碼中修改狀態欄上某項的Alignment為Right,這次就有靠右的效果了。 例如:this.toolStripStatusLabel1.Alignment = ToolStripItemAlignment.Right; 注意如果是多個項,那靠左對齊的從左往右排列,靠右對齊的從右往左排列。 問題是基本解決了,只是我還是不知道為什么在屬性窗口里ToolStripStatusLabel沒有Alignment屬性。從網上搜集的帖子看,好像其他人都沒這個問題啊? Windows Forms高級界面組件-使用狀態欄控件
狀態欄(StatusStrip)控件通常顯示在窗體的底部,向用戶提供有關應用程序狀態的信息。如Word應用程序使用狀態欄提供頁碼、行數和列數的信息。 StatusStrip派生於ToolStrip,通常由ToolStripStatusLabel對象組成,用於顯示指示狀態的文本或圖標,或者有可以用圖形顯示進程完成狀態的ToolStripProgressBar,其中ToolStatusLabel是默認項,表示StatusStrip控件中的一個面板。ToolStripStatusLabel除具有標簽通用的屬性外,還有AutoSize和DoubleClickEnable兩個常用的屬性。 ToolStripStatusLabel控件屬性:
屬 性 |
值 |
AutoSize |
AutoSize在默認狀態下是打開的,這不是非常直觀,因為在改變狀態欄上標簽的文本時,不希望該標簽來回移動,除非標簽上的信息是靜態的,否則總是應把這個屬性改為false |
DoubleClickEnable |
在這個屬性中,可以指定是否引發DoubleClick事件。也就是說,用戶可以在應用程序的另一個地方修改信息。例如,讓用戶雙擊包含Bold的面板,在文本中啟用或禁用黑體格式 |
先了解一下StatusStrip:首選StatusStrip是Form中的一個控件,同時也是一個大的控件,其中含有許多子控件,這些子控件存放在控件群中。 將StatusStrip控件拖到窗體中,單擊該控件右上角的黑色三角,打開“StatusStrip任務欄”,單擊“編輯項”選項,打開“項集合編輯器選項卡”。“StatusStrip”項集合編輯器用於添加、移除和重新排序StasusStrip的ToolStripItem控件,以及查看和設置StatusStrip及ToolStripItem屬性。 單擊“項集合編輯器”左邊組合框,選擇要添加的狀態欄類型,單擊“添加”按鈕,添加的狀態欄項目顯示在“成員”列表框中。采用此方法,可將ToolStripStatusLabel、ToolStripProgressBar、ToolStripDropDownButton、ToolStripSplitButton控件中的一個或多個添加到“成員”列表框中。 這樣我們要使用StatusStrip時,首先要定義StatusStrip,然后定義ToolStrip控件,再次定義ToolStrip控件群,第三將ToolStrip控件加入到控件群中,第四將控件群加入到StatusStrip中,最后要將StatusStrip加入到窗體中。 舉例說明: 本例是在Form窗體中加入任務欄,並在任務欄左邊顯示「Test」。 一、在設計模式下的添加方法為: 在窗體上添加一個StatusStrip控件。在StatusStrip上添加一個ToolStripLabel控件。將ToolStripLabel控件的Text屬性設置成在運行時顯示的消息(即為Test)。 二、 在代碼模式下添加過程即為: 1. 定義StatusStrip 2. 定義控件(ToolStripLabel) 3. 定義控件群(ToolStripItem) 4. 將控件加入控件群(Items.AddRange) 5. 將StatusStrip加入到Form中 public Form1() { InitializeComponent(); #region AddStatusStrip //1. 定義要增加的StatusStrip StatusStrip sb = new StatusStrip(); //2. 定義StatusStrip項目中的控件,其中ToolStripLabel是一個相似於label的控件,現在用於顯示文字 ToolStripLabel tsl = new ToolStripLabel(); //要顯示的文字內容 tsl.Text = "Test"; //3. 定義StatusStrip中要項目 ToolStripItem[] tsi = new ToolStripItem[1]; tsi[0] = tsl; //4. 將項目加入到StatusStrip中 sb.Items.AddRange(tsi); //5. 將StatusStrip加入到窗體中 this.Controls.Add(sb); #endregion |
|
|
Windows Forms高級界面組件-使用工具欄控件實例
我們使用以前創建的菜單欄,在窗體中繼續添加工具欄,其中包括工具欄的標准工具和另外3外按鈕:加粗、斜體、和加下划線。添加組合框用於選擇字體。 實現步驟如下: 一、打開以前的項目MenuTest,打開其中的窗體文件Form1。  2、在窗體中添加ToolStrip控件,可以看到窗體的下方顯示有“toolStrip”控件。
 3、添加標准工具欄,單擊“toolStrip1”工具欄右上角黑色按鈕,打開“ToolStrip”任務欄,單擊“插入標准項”選項,即可在工具欄中插入標准工具欄按鈕。
 4、單擊工具欄上的提示按鈕中黑色三角,打開下拉列表框,在其中單擊“Button”按鈕,可在工具欄中添加一個按鈕。修改“Text”屬性為“B”,“DisplayStyle”屬性設置為“Text”。 5、執行上邊的相同步驟,在工具欄中添加一個按鈕,將其“Text”屬性設置為“I”,並將“Font”屬性中的“Italic”屬性值設置為true,“I”以斜體的方式顯示。 6、單擊工具欄上的提示按鈕中黑色三角,打開下拉列表框,在其中單擊“SplitButton”按鈕,可添加帶下拉選項的按鈕。將“DisplayStyle”屬性設置為“Text”,“Text”屬性值設置為“U”,並將“Font”屬性中的“Underline”屬性值設置為true,“U”以下划線的方式顯示。在打開的菜單項中輸入“下划線”,“雙下划線”等。
 7、繼續上面的操作,在工具欄上添加“ToolStripComBox”控件,編輯其“Items”屬性,在項目集合編輯器中輸入“黑體”,“宋體”,“楷體”,“仿宋”等 8、編譯並執行程序。結果如圖
 說明:為工具欄中的工具添加功能的方法和菜單基本相同,在設計窗體中雙擊“工具”按鈕,即可打開按鈕的Click事件,在此處添加處理代碼實現。 Windows Forms高級界面組件-使用工具欄控件
為了使用使用方便,許多應用程序的下面提供了一組附加的小按鈕,單擊這些按鈕可以激活最常用的功能,而不用在菜單欄的菜單中導航。這組按鈕就是工具欄(ToolStrip)。 使用ToolStrip及相關聯的類,可以創建具有Office,IE或自定義外觀和行為的工具欄及其他用戶界面元素。 工具欄上的按鈕通常包含圖片,不包含文本,但它可以既包含圖片又包含文本。例如Word中的工具欄按鈕就不包含文本。包含文本的工具欄按鈕有Internet Explorer中的工具欄。除了按鈕之外,工具欄上偶爾也會有組合框和文本框。如果把鼠標指針停留在工具欄的一個按鈕上,就會顯示一個工具提示,給出該按鈕的用途信息,特別是只顯示圖標時,這是很有幫助的。 ToolStrip與MenuStrip一樣,也具有專業化的外觀和操作方式。在用戶查看工具欄時,希望能把它移動到自己希望的任意位置上。ToolStrip就允許用戶這么做。 第一次把ToolStrip添加到窗體的設計界面上時,它看起來非常類似於前面的MenuStrip,但存在兩個區別:ToolStrip的最左邊有4個垂直排列的點,這與Visual Studio中的菜單相同。這些點表示工具欄可以移動,也可以停靠在父應用程序窗口中。第二個區別是在默認情況下,工具欄顯示的是圖像,而不是文本,所以工具欄上項的默認控件是按鈕。工具欄顯示的下拉菜單允許選擇菜單項的類型。 ToolStrip與MenuStrip完全相同的一個方面是,Action窗口包含Insert Standard Items鏈接。單擊這個鏈接,不會得到與MenuStrip相同的菜單項數,而會得到New、Open、Save、Print、Cut、Copy、Paste和Help等菜單項。 一、ToolStrip控件的屬性
屬 性 |
描 述 |
GripStyle |
這個屬性控制着4個垂直排列的點是否顯示在工具欄的最左邊。隱藏柵格后,用戶就不能移動工具欄了 |
(續表)
屬 性 |
描 述 |
LayoutStyle |
設置這個屬性,就可以控制工具欄上的項如何顯示,默認為水平顯示 |
Items |
這個屬性包含工具欄中所有項的集合 |
ShowItemToolTip |
這個屬性允許確定是否顯示工具欄上某項的工具提示 |
Stretch |
默認情況下,工具欄比包含在其中的項略寬或略高。如果把Stretch屬性設置為true,工具欄就會占據其容器的總長 |
ToolStrip控件為Windows工具欄對象提供容器,必須聯合使用其他控件,包括按鈕,組合框,文框等其他控件,才能完成工具欄的設計。下面是和ToolStrip相關聯的控件
控 件 |
描 述 |
ToolStripButton |
這個控件表示一個按鈕。用於帶文本和不帶文本的按鈕 |
ToolStripLabel |
這個控件表示一個標簽。這個控件還可以顯示圖像,也就是說,這個控件可以用於顯示一個靜態圖像,放在不顯示其本身信息的另一個控件上面,例如文本框或組合框 |
ToolStripSplitButton |
這個控件顯示一個右端帶有下拉按鈕的按鈕,單擊該下拉按鈕,就會在它的下面顯示一個菜單。如果單擊控件的按鈕部分,該菜單不會打開 |
ToolStripDropDownButton |
這個控件非常類似於ToolStripSplitButton,惟一的區別是去除了下拉按鈕,代之以下拉數組圖像。單擊控件的任一部分,都會打開其菜單部分 |
ToolStripComboBox |
這個控件顯示一個組合框 |
ToolStripProgressBar |
這個項可以在工具欄上嵌入一個進度條 |
ToolStripTextBox |
這個控件顯示一個文本框 |
ToolStripSeparator |
前面在菜單示例中見過這個控件,它為各個項創建水平或垂直分隔符 |
ToolStrip控件和MeunStrip一樣,也具有專業化的外觀和操作方式,把ToolStrip控件添加到窗體的設計界面上時,和MenuStrip很相似,只是在右邊多個排列的4個點,這些點表示工具欄是可以移動的,可以停靠在父應用程序窗口中。默認情況下,工具欄顯示的是圖像,不是文本。 |
|
Windows Forms高級界面組件-快捷菜單
快捷菜單通常所說的就是上下文菜單,敢就是程序運行時單擊右鍵彈出的菜單。Word,Excel,Windows教有快捷菜單,使用Word時,有時需要反復使用復制、粘貼等操作,完成這些操作有多種方法,最簡單和易用的方法是從Word顯示的選項中右擊並選取適當選項,此時顯示的菜單就是上下文菜單,也就是快捷菜單。快捷菜單會隨着右擊位置不同而變化。VS2008中使用ContextMenuStrip控件創建快捷菜單。 ContextMenuStrip控件和MenuStrip控件使用方式相似。創建步驟如下: 1、創建項目ContextMenuText。 2、將工具箱的ContextMenuStrip控件拖放到窗體中。 3、設計菜單內容,方法和前面的菜單設計相同。設計好的菜單如下圖 4、設置窗體“Form1”的ContextMenuStrip屬性為窗體添加的快捷菜單屬性“contextMenuStrip1”,運行程序,在窗體上右擊鼠標,即可彈出快捷菜單,效果如圖
 注意:快捷菜單是與某個控件相關聯的,創建了快捷菜單后,一定要設置相關聯控件的ContextMenu屬性為該快捷菜單,否則是不會起作用的。
 上面是使用窗體設計器設計快捷菜單方法,編寫代碼可在程序運行中實現。代碼如下: private void CreateContextMenu() { ContextMenuStrip cmnu=new ContextMenuStrip();//創建快捷菜單對象 cmnu.RenderMode=ToolStripRenderMode.System;//設置快捷菜單的繪制樣式 //在快捷菜單中添加項 cmun.Items.Add("復制"); cmun.Items.Add("粘貼"); cmun.Items.Add("剪切"); cmun.Items.Add("退出"); this.ContextMenuStrip=cmnu;//給窗體添加快捷菜單 } 說明:快捷菜添加功能的方法和主菜單相同。 |
創建MDI窗體、激活和排列子窗體
多文檔應用程序中,有多個窗口打開時,在同一時間只有一個窗口是活動的,應用程序的活動窗口是所有操作的窗口,通常最上面的窗口是活動窗口。活動窗口的標題欄顏色和非活動窗口的顏色是不同的。 說明:MDI程序主窗體的標題欄顏色和活動的子窗口的標題欄顏色相同。 注意:如果窗體為 MDI 父窗體,則在觸發 MDI 父窗體的 Closing 事件之前,將觸發所有 MDI 子窗體的 Closing 事件。另外,在觸發 MDI 父窗體的 Closed 事件之前,將觸發所有 MDI 子窗體的 Closed 事件 一、 創建MDI窗體 ? 將 IsMdiContainer 屬性設置為 True ? 選擇“項目”→“添加 Windows 窗體” ? 選擇“項目”→“添加 Windows 窗體” ? 添加給定的代碼,將其他窗體設置為子窗體。下面代碼演示如何將TestForm設置為當前窗體的子窗體。 TestForm objChild = new TestForm(); objChild.MdiParent = this; objChild.Show(); 二、 激活窗體: 要得到當前活動的子窗體,使用ActiveMdiChild屬性獲取,示例代碼如下: MessageBox.Show(this.ActiveMdiChild.ToString()); 在MDI應用程序中,可以使用以下代碼激活窗體: this.ActivateMdiChild(<子窗體>); this.ActivateMdiChild(frmChild); 這句代碼是將要激活的子窗體的名稱傳遞給ActiveMdiChild()方法。如果設置了另外一個窗體為活動的子窗體,當前活動的窗體將自動取消激活。 注意:ActiveMdiChild和ActivateMdiChild()的不同,前者是屬性,后者是方法。 三、排列子窗體 MDI應用程序打開多個子窗體時,需要合理安排子窗體的排列方式,要排列WinForms中的子窗口,需要調用Form類的LayoutMdi方法來使用MdiLayout枚舉成員,該枚舉指定了MDI子窗口在MDI父窗口中的布局。 MdiLayout枚舉的成員列表如下: ? ArrangeIcons :在 MDI 父窗體的客戶端區內排列所有 MDI 子窗體的圖標 ? Cascade:在 MDI 父窗體的客戶端區內層疊所有 MDI 子窗口 ? TileHorizontal :在 MDI 父窗體的客戶端區內水平平鋪所有 MDI 子窗口 ? TileVertical:在 MDI 父窗體的客戶端區內垂直平鋪所有 MDI 子窗口 設定子窗口排列方式的代碼如下: this.LayoutMdi(MdiLayout.TileHorizontal); 將MdiLayout枚舉成員的名稱傳遞給LayoutMdi方法,即可設定窗口的排列方式。
 |
Windows Forms高級界面組件-單文檔和多文檔應用程序
單文檔和多文檔應用程序簡介 通常Windows應用程序分為三類:基於對話框的應用程序、單文檔界面應用程序(SDI)和多文檔界面應用程序(MDI)。單文檔界面(Single-Document Interface, SDI)和多文檔界面(Multi-Document Interface, MDI)。 單文檔應用程序(MDI)是處理單一文檔的應用程序,通常用於完成一個任務,使用單一的文檔。此應用程序常涉及許多用戶交互操作,並且能夠保存或打開工作的結果。在SDI應用程序中已打開一個文件,要新建或再打開一個文件,則必須關閉當前打開的文件,才會打開新文件。如果要同時打開兩個文件,則必須啟動應用程序的一個新實例。Microsoft Windows中的“記事本”是單文檔界面應用程序的一個典型示例。在“記事本”中,同一時間只能打開一個文檔。 多文檔應用程序(MDI)是一種常用的文檔程序,常用的Excel,VS應用程序都是多文檔應用程序。多文檔應用程序最大特點是,用戶可以一次打開多個文檔,每個文檔對應不同的窗口。MDI應用程序允許創建一個在單個容器窗體內容納多個窗體應用程序,每個應用程序都有一個主窗口,子窗口在主窗口中打開,主窗口的菜單會隨着當前活動的子窗口的變化而變化。 多文檔應用程序的主窗體和子窗體 多文檔應用程序(MDI)至少由兩上載然不同的窗口組成,第一個窗口叫MDI窗體容器,也叫做主窗體,它包含多個MDI子窗體,也就是可以在主窗體中顯示的窗口。MDI主窗體的特點如下: 啟動MDI應用程序時,首先顯示的是主窗體。 主窗體是MDI程序的窗體窗器,該程序的所有窗體都在主窗體的界面內打開。 每個MDI應用程序都只能有一個MDI主窗體。 任何MDI子窗體都不能移出MDI框架區域。 關閉MDI主窗體則自動關閉所有打開的MDI子窗體 多文檔操作MDI的屬性和事件
屬性 |
說明 |
MdiChildren |
用於獲取表示多文檔界面 (MDI) 子窗體的窗體數組 |
MdiParent |
用於獲取或設置當前多文檔界面 (MDI) 父窗體 |
ActiveMdiChild |
用於獲取當前活動的多文檔界面 (MDI) 子窗體 |
方法 |
說明 |
ActivateMdiChild |
用於激活子窗體 |
LayoutMdi |
排列 MDI 父窗體中的多文檔界面 (MDI) 子窗體 |
事件 |
說明 |
Closed |
由用戶或窗體的 Close 方法關閉窗體后,發生該事件 |
Closing |
正在關閉窗體時,發生該事件 |
MdiChildActivate |
在 MDI 應用程序中激活或關閉多文檔界面 (MDI) 子窗體時,觸發該事件 |
|
Windows Forms高級界面組件-Timer控件簡單用法
Timer控件 Timer控件主要會用到2個屬性一個是Enabled和Interval Enabled主要是控制當前Timer控件是否可用 timer1.Enabled=false;不可用 timer1.Enabled=true;可用 timer1.Interval=1000;主要是設置timer2_Tick事件的時間,單位為毫秒 例一:到9:00提示去上廁所:( 把timer2.Interval=60000;//1分鍾 private void timer2_Tick(object sender, System.EventArgs e){ string cesuotime=DateTime.Now.DateTime.Now.ToShortTimeString();//得到現在的時間 if(cesuotime.equles("9:00")){ timer1.Enabled=false; MessageBox.show("該去上廁所了"); timer1.Enabled=true;//如果不先把enabled設置成false對話框會一直彈下去 } } 例二:每2小時提示用戶看電腦時間已經很久了,需要休息了 把timer2.Interval=7200000;//7200秒 private void timer2_Tick(object sender, System.EventArgs e){ timer1.Enabled=false; MessageBox.show("需要休息了,開機已經2小時了"); timer1.Enabled=true;//如果不先把enabled設置成false對話框會一直彈下去 } |