C# winform 学习知识转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform 学习知识转发相关的知识,希望对你有一定的参考价值。

C# winForm

应用程序实例——用户信息管理

下面用我们学过的知识创建一个应用程序实例,演示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对话框会一直弹下去
           }

 

以上是关于C# winform 学习知识转发的主要内容,如果未能解决你的问题,请参考以下文章

Java进击C#——应用开发之WinForm环境

C# winform 程序开发知识点总结(干货)

C# WinForm开发

Winform学习知识汇总

我是听一个 网友 说您的 C# winform 知识很好 所以我想求助你一个问题

在 C# WinForm 中计算存活年数 [重复]