当前位置:文档之家› 使用菜单、工具栏来改变窗口的大小与颜色

使用菜单、工具栏来改变窗口的大小与颜色

使用菜单、工具栏来改变窗口的大小与颜色
使用菜单、工具栏来改变窗口的大小与颜色

使用菜单、工具栏来改变窗口的大小与颜色

10、WinForms高级编程

目标

创建一个更改窗口的大小与颜色的应用程序。创建一个单文档的文本编辑器应用程序。指导教师讲解阶段目标

第一部分指导(60分钟)

练习1:使用菜单、工具栏来改变窗口的大小与颜色

问题

主菜单、快捷菜单、工具栏和状态栏的应用实例

指导教师讲解问题说明

用户在窗体上单击右键,弹出图示的快捷菜单。执行其中的颜色命令可产生与主菜单中相应命令等效的结果。某命令执行时菜单项左侧带有"?"标记。再次执行该菜单命令取消相应的颜色及菜单项左侧的"?"标记,将颜色恢复为背景色。执行快捷菜单中的"红"命令,然后再次打开快捷菜单后,如图1.2所示。

图1.1默认窗体背景色

图1.2红色背景色

分析

指导教师分析解题思路

添加工具栏和状态栏后,窗体的界面设计如图1.3所示。主要用到了这些控件:MenuStrip,Context MenuStrip,ToolStrip,StatusStrip。

图1.3窗体设计界面

推荐步骤:

(1)创建Windows应用项目。

(2)按照设计界面添加相应的控件,并在主菜单和快捷菜单中添加相应的菜单项;并添加相应的点击处理事件函数。

(3)完整的代码如下:

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/577740211.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace menuToolStatus{

public partial class Form1:Form

{

public Form1()

{

InitializeComponent();

}

private void MenuItem_default_Click(object sender,EventArgs e)

{

this.BackColor=Control.DefaultBackColor;

MenuItem_default.CheckState=CheckState.Indeterminate;

cMenuItem_default.CheckState=CheckState.Indeterminate;

MenuItem_blue.Checked=MenuItem_green.Checked=MenuItem_red.Checked=false ;

cMenuItem_blue.Checked=cMenuItem_green.Checked=cMenuItem_red.Checked=fal se;

StatusLabel3.Text="默认颜色";

}

private void cMenuItem_default_Click(object sender,EventArgs e)

{

MenuItem_default_Click(sender,e);

}

private void MenuItem_red_Click(object sender,EventArgs e)

{

MenuItem_red.Checked=!MenuItem_red.Checked;

if(MenuItem_red.Checked)

{

this.BackColor=Color.Red;

MenuItem_red.CheckState=CheckState.Indeterminate;

cMenuItem_red.CheckState=CheckState.Indeterminate;

MenuItem_blue.Checked=MenuItem_green.Checked=MenuItem_default.Checked=

false;

cMenuItem_blue.Checked=cMenuItem_green.Checked=cMenuItem_default.Checked =

false;

StatusLabel3.Text="红色";

}

else

{

this.BackColor=Control.DefaultBackColor;

MenuItem_default.CheckState=CheckState.Indeterminate;

cMenuItem_default.CheckState=CheckState.Indeterminate;

StatusLabel3.Text="默认颜色";

}

}

private void cMenuItem_red_Click(object sender,EventArgs e)

{

MenuItem_red_Click(sender,e);

}

private void MenuItem_green_Click(object sender,EventArgs e)

{

MenuItem_green.Checked=!MenuItem_green.Checked;

{

this.BackColor=Color.Green;

MenuItem_green.CheckState=CheckState.Indeterminate;

cMenuItem_green.CheckState=CheckState.Indeterminate;

MenuItem_blue.Checked=MenuItem_red.Checked=MenuItem_default.Checked= false;

cMenuItem_blue.Checked=cMenuItem_red.Checked=cMenuItem_default.Checked= false;

StatusLabel3.Text="绿色";

}

else

{

this.BackColor=Control.DefaultBackColor;

MenuItem_default.CheckState=CheckState.Indeterminate;

cMenuItem_default.CheckState=CheckState.Indeterminate;

StatusLabel3.Text="默认颜色";

}

}

private void MenuItem_blue_Click(object sender,EventArgs e)

{

MenuItem_blue.Checked=!MenuItem_blue.Checked;

{

this.BackColor=Color.Blue;

MenuItem_blue.CheckState=CheckState.Indeterminate;

cMenuItem_blue.CheckState=CheckState.Indeterminate;

MenuItem_red.Checked=MenuItem_green.Checked=MenuItem_default.Checked= false;

cMenuItem_red.Checked=cMenuItem_green.Checked=cMenuItem_default.Checked= false;

StatusLabel3.Text="蓝色";

}

else

{

this.BackColor=Control.DefaultBackColor;

MenuItem_default.CheckState=CheckState.Indeterminate;

cMenuItem_default.CheckState=CheckState.Indeterminate;

StatusLabel3.Text="默认颜色";

}

}

private void cMenuItem_green_Click(object sender,EventArgs e)

{

MenuItem_green_Click(sender,e);

}

private void cMenuItem_blue_Click(object sender,EventArgs e) {

MenuItem_blue_Click(sender,e);

}

private void MenuItem_unTran_Click(object sender,EventArgs e) {

this.TransparencyKey=this.BackColor;

this.Opacity=1.0;

}

private void MenuItem_transl_Click(object sender,EventArgs e) {

this.TransparencyKey=this.BackColor;

this.Opacity=0.5;

}

private void tsBtn_big_Click(object sender,EventArgs e)

{

this.Width=800;

this.Height=600;

StatusLabel1.Text="800x600像素";

}

private void tsBtn_middle_Click(object sender,EventArgs e)

{

this.Width=600;

this.Height=480;

StatusLabel1.Text="600x480像素";

}

private void tsBtn_small_Click(object sender,EventArgs e)

{

this.Width=400;

this.Height=360;

StatusLabel1.Text="400x360像素";

}

}

}

(4)通过从菜单中选择"生成"→"生成解决方案",来生成该解决方案。

(5)通过从菜单中选择"调试"→"开始执行(不调试)"选项来执行此应用程序。

程序运行效果图

指导教师检查学生进度

练习2:创建一个单文档的文本编辑器应用程序

问题

请编写一个简单的单文档文本编辑器,一次只能打开一个文件,如果要打开另一个文件,必须关闭当前打开的文件,微软的写字板程序就是单文档字处理程序。

指导教师讲解问题说明

使用RichTextBox可以建立一个文本编辑器,它和TextBox的一些属性、事件和方法相同,其新增属性、事件和方法如下:

属性Dock:属性SelectedText、SelectionLength、SelectionStart:属性SelectionFont:属性SelectionColor:属性Lines:属性Modified:事件SelectionChange:事件TextChanged:方法Clear():方法Copy()、Cut()、Paste():方法SelectAll():方法Find():方法SaveFile()和LoadFile():方法Undo():方法Redo():

分析

指导教师分析解题思路

该问题需要开发一个窗体,要求对用户的简历信息进行登记。该应用程序主要用到按钮、文本输入框、图片显示框、下拉列表框和列表框等控件。

推荐步骤:

(1)新建一个名为"TxtEditor"的基于Windows应用程序的项目。

(2)剪贴板功能:放RichTextBox控件到窗体。属性Name=richTextBox1,

Dock=Fill,Text=""。添加相应的菜单项,各菜单项的事件处理函数如下:

private void menuItemEditCut_Click(object sender,EventArgs e)

{

richTextBox1.Cut();//剪切

}

private void menuItemEditCopy_Click(object sender,EventArgs e)

{

richTextBox1.Copy();//拷贝

}

private void menuItemEditPaste_Click(object sender,EventArgs e)

{

richTextBox1.Paste();//粘贴

}

private void menuItemEditUndo_Click(object sender,EventArgs e)

{

richTextBox1.Undo();//撤销

}

private void menuItemEditRedo_Click(object sender,EventArgs e)

{

richTextBox1.Redo();//恢复

}

(3)文本编辑器都应具有文件存取功能,菜单顶级菜单项"文件"的弹出菜单中一般包括如下菜单项:新建、打开、关闭、保存和另存为等。

把OpenFileDialog和SaveFileDialog控件放到窗体中。为菜单增加顶级菜单项:文件,为其弹出菜单增加菜单项:新建、打开.、保存.、另存为.、退出。修改这些菜单项的Name属性分别为:mainMenuFile、menuItemFileNew、menuItemFileOpen、menuItemFileSave、menuItemFileSaveAs、menuItemFileExit。

为Form1类中定义变量:string s_FileName="",记录当前编辑的文件名。

private void menuItemFileNew_Click(object sender,EventArgs e)

{

if(!IfSaveOldFile())//如果返回false,本次操作取消

return;

richTextBox1.Text="";//或richTextBox1.Clear();

s_FileName="";//新建文件没有文件名。

}

private void menuItemFileOpen_Click(object sender,EventArgs e) {

if(!IfSaveOldFile())//如果返回false,本次操作取消

return;

if(openFileDialog1.ShowDialog()==DialogResult.OK)

{

s_FileName=openFileDialog1.FileName;

richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);

}

}

private void menuItemFileSaveAs_Click(object sender,EventArgs e) {

if(saveFileDialog1.ShowDialog()==DialogResult.OK)

{

s_FileName=saveFileDialog1.FileName;

richTextBox1.SaveFile

saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);bSave=false;

}//注意存取文件类型应一致。

}

private void menuItemFileSave_Click(object sender,EventArgs e)

{

if(s_FileName.Length!=0)

{

bSave=false;

richTextBox1.SaveFile(s_FileName,RichTextBoxStreamType.PlainText);

}

else menuItemFileSaveAs_Click(sender,e);//调用另存为菜单项事件处理函数

}

private void menuItemFileExit_Click(object sender,EventArgs e)

{

Close();

}

(4)修改字体

为修改使用的字体,可打开字体对话框FontDialog,选择指定字体。可以按两种方式修改字体,如果未选中文本,表示以后键入的字符将按选定字体输入。如果选中文本,则仅修改选定文本的字体。修改字符颜色也根据同样原则。

放FontDialog控件到窗体,属性Name=fontDialog1。为菜单增加顶级菜单项:格式,属性Name为mainMenuModel,为其弹出菜单增加菜单项:字体,属性Name为menuItemModelFont,为菜单"格式|字体"菜单项增加单击事件处理函数如下:

private void menuItemModelFont_Click(object sender,EventArgs e)

{

if(fontDialog1.ShowDialog()==DialogResult.OK)

richTextBox1.SelectionFont=fontDialog1.Font;

}

(5)About对话框

添加一个窗体,修改formAbout窗体属性StartPosition=CenterParent,修改属性MaximizeBox=False,MinimizeBox=False属性

FormBorderStyle=FixedDialog,运行界面如下:

标题为"确定"按钮单击事件处理函数如下:

private void button1_Click(object sender,EventArgs e)

{

Close();

}

为菜单增加顶级菜单项:帮助,为其弹出菜单增加标题为"关于…"的菜单项,属性Name为menuItemAbout。菜单"帮助|关于…"菜单项单击事件处理函数如下:

private void menuItemAbout_Click(object sender,EventArgs e)

{

formAbout AboutDialog=new formAbout();

AboutDialog.ShowDialog(this);//打开模式对话框

//注意不能使用Show()函数,它打开非模式对话框

}

(6)文本编辑器查找替换功能

建立新窗体,窗体文件名称为formFindReplace.cs,作为"查找替换"对话框。窗体类名也为formFindReplace,为formFindReplace类增加变量:Form1 MainForm1;属性StartPosition=CenterParent,MaximizeBox=False,MinimizeBox=False,FormBorderStyle=FixedDialog,Text="查找和替换",对话框界面如图:

修改formFindReplace类构造函数如下,增加的参数form1是主窗体属性Name的值。

public formFindReplace(Form1 form1)

{

InitializeComponent();

MainForm1=form1;

}

//有了Form1引用,可以在formFindReplace类中调用Form1类的公有方法

查找替换对话框中标题为"查找下一个"按钮单击事件函数如下:

private void button1_Click(object sender,EventArgs e)

{

if(textBox1.Text.Length!=0)//如果查找字符串不为空,调用主窗体查找方法

MainForm1.FindRichTextBoxString(textBox1.Text);

else MessageBox.Show("查找字符串不能为空","提示",MessageBoxButtons.OK);

}

查找替换对话框中标题为"替换查到字符"按钮单击事件函数如下:private void button2_Click(object sender,EventArgs e)

{

if(textBox2.Text.Length!=0)//如果替换字符串不为空,调用主窗体替换方法

MainForm1.ReplaceRichTextBoxString(textBox2.Text);//调用上步增加的替换方法

else MessageBox.Show("替换字符串不能为空","提示",MessageBoxButtons.OK);

}

为Form1类增加变量:int FindPostion=0,该变量用来记录下一次查找的开始位置。为Form1窗体菜单的"编辑"顶级菜单项的弹出菜单增加菜单项:查找和替换,

属性Name为menuItemFindReplace。"查找和替换"菜单项单击事件处理函数如下:

private void menuItemFindReplace_Click(object sender,EventArgs e)

{

FindPostion=0;//下句中的this是Form1类对象引用

formFindReplace FindReplaceDialog=new formFindReplace(this);

FindReplaceDialog.Show();//打开非模式对话框使用Show()方法

}

定义FindRichTextBoxString方法:

public void FindRichTextBoxString(string FindString)//查找方法

{

if(FindPostion=richTextBox1.Text.Length)//如已查到文本底部,提示用户

{

MessageBox.Show("已到文本底部,再次查找将从文本开始处查找","提示",

MessageBoxButtons.OK);

FindPostion=0;//下次查找的开始位置

return;

}//用Find方法查找,返回找到的位置,返回-1,表示未找到,参数是要找的字符串

//参数是查找的开始位置,参数是查找的一些选项,如大小写是否匹配,查找方向等

FindPostion=richTextBox1.Find(FindString,

FindPostion,RichTextBoxFinds.MatchCase);

if(FindPostion==-1)//-1表示未找到匹配字符串,提示用户

{

MessageBox.Show("未找到匹配字符串,再次查找将从文本开始处查找","提示", MessageBoxButtons.OK);

FindPostion=0;//下次查找的开始位置

}

else//找到匹配字符串

{

richTextBox1.Focus();//主窗体成为注视窗口

FindPostion+=FindString.Length;

}//下次查找的开始位置在此次找到字符串之后

}

替换字符串的方法:

public void ReplaceRichTextBoxString(string ReplaceString)//替换方法

{

if(richTextBox1.SelectedText.Length!=0)//如果选定了被替换字符串richTextBox1.SelectedText=ReplaceString;//替换被选定的字符串

}

(7)提示保存已被修改的文件

为Form1类增加一个bool变量bSave=false作为标记,用来跟踪控件RichTextBox中的文本内容是否被修改。在程序开始运行、建立和打开一个新文件后,bSave=false,表示如果关闭当前文件,不必提示用户保存当前文件。当RichTextBox控件中的文本被修改,将激活RichTextBox控件TextChanged事件,

在该事件处理函数中,使bSave=true,表示关闭当前文件前,要询问用户是否保存当前已被修改的文件。

首先在主窗体Form1类中增加一个函数,其功能是如果检查到当前文件已被修改,用对话框询问用户是否保存当前文件,根据用户的选择作相应的处理,该函数返回true,表示继续操作,该函数返回false,表示忽略此次操作。之所以要增加这个函数是因为有三处要用到此函数。该函数定义如下:

public bool IfSaveOldFile()

{

bool ReturnValue=true;

if(bSave)

{

System.Windows.Forms.DialogResult dr;

dr=MessageBox.Show(this,"要保存当前更改吗?","保存更改吗?",

MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);

switch(dr)//根据用户选择做相应处理

{

case System.Windows.Forms.DialogResult.Yes://单击了yes按钮,保存修改

bSave=false;//保存文件后,应使bSave为false if(s_FileName.Length!=0)

richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

else

{

SaveFileDialog saveFileDialog1=new SaveFileDialog();

if(saveFileDialog1.ShowDialog()==DialogResult.OK)

{

s_FileName=saveFileDialog1.FileName;

richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

}

}

ReturnValue=true;//返回true,通知调用本方法的程序,本次操作继续break;

case System.Windows.Forms.DialogResult.No://单击了no按钮,不保存bSave=false;

ReturnValue=true;

break;

case System.Windows.Forms.DialogResult.Cancel://单击了Cancel按钮ReturnValue=false;//返回false,通知调用本方法的程序,本次操作取消break;

}

}

return ReturnValue;

}

为RichTextBox控件TextChanged事件增加事件函数如下:

private void richTextBox1_TextChanged(object sender,EventArgs e)

{

bSave=true;

}

窗体Form1的FormClosing事件是在关闭窗口之前产生的事件,此时,窗体中的控件还存在,还可以保存修改的内容,也可以不退出。增加Closing事件的事件处理函数如下:

private void Form1_FormClosing(object sender,FormClosingEventArgs e)

{

if(!IfSaveOldFile())

e.Cancel=true;

}

(8)通过从菜单中选择"调试"→"开始执行(不调试)"选项来执行此应用程序。

程序运行效果图

指导教师检查学生进度

第二部分练习(30分钟)

在第一部分的练习二程序的基础上,将程序修改为多文档文本编辑器,类似于word应用程序。该程序可以打开多个文档窗口,并可对多个窗口进行排列和操作:水平并排、垂直并排、层叠排列、关闭所有子窗口。

(1)将做为父窗体的窗体的IsMdiContainer属性改为true。

(2)将新生成的子窗体的MdiParent属性设置为步骤一中的父窗体对象。

第三部分作业

指导教师布置作业

文件系统监视器:开发一个程序可以设置要监视的文件夹,该文件夹下的活动(如创建、删除、重命名等操作)都将触发相应的事件,编写相应的处理函数,以文本的形式通知用户该文件夹进行修改的详细信息。

特别声明:

1:资料来源于互联网,版权归属原作者

2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。

相关主题
文本预览
相关文档 最新文档