一共470多例winform 界面特效的源码。
窗体与界面设计... 9
实例001 带历史信息的菜单 10
实例002 菜单动态合并 12
实例003 像开始菜单一样漂亮的菜单... 14
实例004 任务栏托盘菜单 15
实例005 可以拉伸的菜单界面 16
实例006 菜级联菜单 18
1.2 工具栏设计... 19
实例007 带带背景的工具栏 19
实例008 带浮动工具栏 20
实例009 在带下拉菜单的工具栏... 21
实例010 在具有提示功能的工具栏... 22
实例011 在状态栏中显示检查框... 23
实例012 带进度条的状态栏 25
实例013 状态栏中加入图标 26
实例014 OutLook界面 27
实例015 带带导航菜单的主界面... 29
实例016 图形化的导航界面 32
实例017 菜类QQ的程序界面 35
实例018 类似windows xp的程序界面... 38
实例019 以图形按钮显示的界面... 42
实例020 以树形显示的程序界面... 44
实例021 动态按钮的窗体界面 46
实例022 非矩形窗体 50
实例023 建立字体形状窗体 52
实例024 控件随窗体自动调整 54
实例025 带分隔栏的窗体 55
实例026 随机更换主界面背景 56
实例027 自动启动的多媒体光盘程序... 57
实例028 为触摸屏程序添加虚拟键盘... 59
实例029 半透明渐显窗体 61
实例030 窗口颜色的渐变 63
实例031 窗体中的滚动字幕 65
实例032 动画显示窗体 67
实例033 制作闪烁的窗体 69
实例034 直接在窗体上绘图 70
实例035 动画形式的程序界面 73
实例036 使窗体标题栏文字右对齐... 75
实例037 没有标题栏可义改变大小的窗口... 76
实例038 设置窗体在屏幕中的位置... 77
实例039 始终在最上面的窗体 78
实例040 限制窗体大小 79
实例041 获取桌面大小 81
实例042 在窗口间移动按扭 82
实例043 如何实现Office助手 84
实例044 在关闭窗口前加入确认对话框... 85
实例045 使用任意组件拖动窗体... 88
实例046 修改提示字体及颜色 89
实例047 如何为MDI类型窗体设置背景图片... 91
实例048 向提示框中添加图标 93
实例418 通过串口发送数据 95
实例419 通过串口关闭对方计算机... 98
实例420 密码写入与读出加密狗... 101
实例421 使用加密狗进行身份验证... 105
实例422 向IC卡中写入数据 107
实例423 读取IC卡中的数据 113
实例424 利用IC卡制作考勤程序... 116
实例425 简易视频程序 119
实例426 摄像头监控录像 125
实例427 超市摄像头定时监控系统... 127
实例428 语音卡电话呼叫系统 132
实例429 客户来电查询系统 141
实例430 语音卡实现电话录音 144
实例431 利用短信猫收发短信息... 147
实例432 利用短信远程关闭计算机... 155
实例433 短信息采集烟草销售数据... 159
实例434 “春晚”节目评比短信息互动平台... 164
实例435 条形码扫描器销售商品... 167
实例436 利用神龙卡制作练歌房程序... 169
实例463 数据加密技术 174
实例464 文本文件加密与解密 177
实例465 利用图片加密文件 188
实例466 如何编程修复Access数据库... 194
实例467 访问带验证模式的Sqlserver 2000数据库... 197
实例468 利用INI文件对软件进行注册... 201
实例469 利用注册表设计软件注册程序... 204
实例470 利用网卡序列号设计软件注册程序... 208
实例471 根据cpu序列号、磁盘序列号设计软件注册程序... 214
窗体与界面设计
1.1 菜单应用实例
菜单是程序开发中经常使用的界面元素,合理利用菜单不但可以使用户非常方便的操作程序的功能,更能使效率提高,适应人性化的潮流。下面通过几个应用实例,介绍菜单设计的方法和技术。
实例001 带历史信息的菜单
实例说明
在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用。如图1.1所示,单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸。下次运行该软件时,上次打开的文件名记录到“文件”菜单的历史菜单中,选择该菜单,即可打开相应的图纸文件。
技术要点
要实现保存最近打开的文件,可以将在菜单中最近打开文件的文件名和路径保存到事先建立的*.ini文件中,系统启动时读取*.ini中的数据建立数组菜单,即可实现显示历史菜单的功能。
注意:要建立一个带历史信息的菜单,必须首先添加一个MenuStrip菜单控件,并将主窗体的IsMdiContainer属性设为True。
实现过程
(1)创建一个项目,将其命名为Ex01_01,默认窗体为Form1。
(2)从工具箱中向Form1窗体添加MenuStrip控件,同时向窗体添加OpenFileDialog控件。创建一个“文件”主菜单,在其下面创建打开、关闭所有、退出等菜单选项。
(3)主要程序代码。
将打开文件路径写入INI文件的实现代码如下:
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1.FileName = "";
this.openFileDialog1.ShowDialog();
StreamWriter s = new StreamWriter(address + "Menu.ini", true);
s.WriteLine(openFileDialog1.FileName);//写入INI文件
s.Flush();
s.Close();
ShowWindows(openFileDialog1.FileName);
}
读取INI文件并将信息加入菜单的实现代码如下:
private void Form1_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(address + "Menu.ini");
int i = this.文件ToolStripMenuItem.DropDownItems.Count-2;
while (sr.Peek()>=0)//读取INI文件
{
ToolStripMenuItem menuitem = new ToolStripMenuItem(sr.ReadLine());
this.文件ToolStripMenuItem.DropDownItems.Insert(i, menuitem);
i++;
menuitem.Click += new EventHandler(menuitem_Click);
}
sr.Close();
}
自定义方法ShowWindows()用来加载背景图片并显示窗体,实现代码如下:
public void ShowWindows(string fileName)
{
Image p = Image.FromFile(fileName);
Form f = new Form();
f.MdiParent = this;
f.BackgroundImage = p;
f.Show();
}
举一反三
根据本实例,读者可以开发以下程序。
记录用户操作菜单日志的程序。在用户单击菜单时,把用户、菜单命令和菜单对应功能写入保存菜单日志的INI文件。如果需要查看日志,只需打开INI文件。
通过数据库保存菜单历史信息的程序。
菜单使用频率的程序。把用户使用菜单的数据信息保存到数据库中,然后统计用户使用菜单的频率,并根据此频率调整菜单的显示顺序。
实例002 菜单动态合并
实例说明
在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单。开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并。这是如何实现的呢?本例实现了将两个弹出菜单动态的合并成一个弹出菜单的功能。实例效果如图1.2所示。
技术要点
C# 2.0中已经将弹出菜单封装为Context MenuStrip控件,利用该控件中的Items对象可以操作菜单中的菜单项。该对象是ToolStripMenuItem类型,使用Items.AddRange( )方法可以向弹出菜单中添加菜单项,该方法原型如下。
public void AddRange (
ToolStripItem[] toolStripItems
)
参数说明如下。
l toolStripItems:控件的数组。
实现过程
(1)创建一个项目,将其命名为Ex01_02,默认窗体为Form1。
(2)从工具箱中向Form1窗体添加一个MenuStrip控件用来设计菜单;同时向窗体添加ContextMenuStrip控件用来设计右键菜单;选中MenuStrip控件创建一个“打开子窗体”主菜单,然后选中ContextMenuStrip控件为其添加子项。
(3)为程序添加一个窗体,默认名为Form2,同时向窗体添加ContextMenuStrip控件用来设计右键菜单,然后选中ContextMenuStrip控件为其添加子项。
(4)主要程序代码。
private void 打开自窗体ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.MdiParent = this;
f.Show();//显示子窗体
f.Resize += new EventHandler(f_Resize);
}
void f_Resize(object sender, EventArgs e)
{
Form2 f = (Form2)sender;
ToolStripMenuItem item = new ToolStripMenuItem();
for (int i = 0; i < f.contextMenuStrip2.Items.Count; )//合并菜单
{
item.DropDownItems.Add(f.contextMenuStrip2.Items[i]);
}
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
item});
}
举一反三
根据本实例,读者可以实现以下功能。
让右键菜单在子窗体中显示。
让右键菜单在主窗体和子窗体中同时显示。
实例003 像开始菜单一样漂亮的菜单
实例说明
Windows的开始菜单非常的独特,在菜单的旁边有一条竖着的彩条,彩条中还写着文字。这种独特的菜单能够使程序的界面看起来更加的漂亮。本例中就实现了这种菜单,运行本例弹出“打开菜单”时,就会看到菜单的左边有一个紫色的彩条。实例效果如图1.3所示。
技术要点
在C# 2.0中,MenuStrip控件中的子项ToolStripMenuItem已经包括了左侧的彩条,实现像开始菜单一样的菜单非常容易,不像在其他计算机语言的开发环境中,需要调用API才可以实现。如果想改变左侧竖着的彩条,只要给对应的菜单项设置相应的图片即可。
注意:如果要在左侧彩条显示文字,只要在对应的图片上加入文字即可。
实现过程
(1)创建一个项目,将其命名为Ex01_03,默认窗体为Form1。
(2)从工具箱中向Form1窗体添加MenuStrip控件。
(3)为MenuStrip控件添加相应的子项。
(4)为子项添加相应的图片。
举一反三
根据本实例,读者可以实现以下功能。
将菜单元设置成不同的格式(如图片、文字等)。
在菜单左侧播放动画。
实例004 任务栏托盘菜单
实例说明
有一些软件通常只是在后台运行,这些进程大部分时间不显示用户界面。可通过单击任务栏状态通知区域的图标来访问的病毒防护程序就是一个示例。Windows窗体中的NotifyIcon控件通常用于显示在后台运行的进程的图标,本实例利用该控件制作了一个任务栏托盘菜单。实例效果如图1.4所示。
技术要点
要实现程序启动时出现在系统托盘中。必须要为窗体添加NotifyIcon 控件和ContextMenuStrip控件。
注意:必须为NotifyIcon 控件的Icon属性设置图标。
实现过程
(1)创建一个项目,将其命名为Ex01_04,默认窗体为Form1。
(2)向Form1窗体添加NotifyIcon 控件和ContextMenuStrip控件,并为ContextMenuStrip控件添加子项。
(3)选择NotifyIcon 控件,在其属性窗口中将ContextMenuStrip属性设置为添加到窗体上的ContextMenuStrip控件,并为Icon属性设置图片。
举一反三
根据本实例,读者可以开发以下程序。
程序启动时不出现界面,直接出现在系统托盘中运行的后台程序。
程序启动时不出现在任务栏中。
实例005 可以拉伸的菜单界面
实例说明
如果管理程序功能菜单非常多,而用户只使用一些常用菜单,这时,可以将主菜单项下的不常用菜单隐藏起来。此种显示方式类似于对菜单进行拉伸。使用时,只需单击展开菜单,即可显示相应菜单功能。运行本例,效果如图1.5所示。
技术要点
要实现可以拉伸的菜单,关键是要使用一个开关变量,同时调用ShowDropDown()方法,显示操作后的结果。下面详细介绍一下该方法。
ShowDropDown()方法用来显示与此ToolStripDrop DownItem关联的ToolStripDropDownItem控件。其语法结构如下:
public void ShowDropDown ()
另外,用ShowDropDown()方法还可以显示已由 DropDown 属性设置的下拉控件。
注意:必须设置开关变量的初值。
实现过程
(1)创建一个项目,将其命名为Ex01_05,默认窗体为Form1。
(2)从工具箱中向Form1窗体添加MenuStrip控件,选中MenuStrip控件为其添加子项。
(3)双击“展开(关闭)子项”为其双击事件添加处理代码。
(4)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
//初始设置下面的菜单隐藏
this.设置密码ToolStripMenuItem.Visible = false;
this.添加用户ToolStripMenuItem.Visible = false;
this.忘记密码ToolStripMenuItem.Visible = false;
this.修改密码ToolStripMenuItem.Visible = false;
this.员工录入ToolStripMenuItem.Visible = false;
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
switch (i)
{
case 1:
this.设置密码ToolStripMenuItem.Visible = false;
this.添加用户ToolStripMenuItem.Visible = false;
this.忘记密码ToolStripMenuItem.Visible = false;
this.修改密码ToolStripMenuItem.Visible = false;
this.员工录入ToolStripMenuItem.Visible = false;
i = 2;
this.操作ToolStripMenuItem.ShowDropDown();
break;
case 2:
this.设置密码ToolStripMenuItem.Visible = true;
this.添加用户ToolStripMenuItem.Visible = true;
this.忘记密码ToolStripMenuItem.Visible = true;
this.修改密码ToolStripMenuItem.Visible = true;
this.员工录入ToolStripMenuItem.Visible = true;
i = 1;
this.操作ToolStripMenuItem.ShowDropDown();
break;
}
}
举一反三
根据本实例,读者可以开发以下功能。
制作显示隐藏工具栏。
合并菜单栏。
实例006 菜级联菜单
实例说明
如果管理程序功能菜单非常多,一些功能中又包括许多子功能,这时可以使用级联菜单来组织系统的各个功能。实例运行结果如图1.6所示。
图1.6 级联菜单
技术要点
制作级联菜单需要使用MenuStrip控件。
注意:在使用级联菜单时最好不要超过5层,否则用户在使用时会很不方便。
实现过程
(1)创建一个项目,将其命名为Ex01_06,默认窗体为Form1。
(2)在Form1窗体添加MenuStrip控件,选中MenuStrip控件为其添加子项和级联子项。
举一反三
根据本实例,读者可以开发以下功能。
大型系统的功能导航。
在窗体四周再增加菜单栏。
1.2 工具栏设计
在菜单栏中将常用的菜单命令以工具栏按钮的形式显示,并作为快速访问方式。工具栏位于菜单栏的下方,由许多命令按钮组成,每个命令按钮上都有一个形象的小图标,以标识命令按钮的功能。由于工具栏这种直观易用的特点,使其已成为Windows应用程序的标准界面。
实例007 带带背景的工具栏
实例说明
工具栏是窗体的组成部分之一,工具栏中的按钮可以设定完成一些较为常用或重要的功能,本例中设计了一个工具栏,并且为该工具栏作了一些修饰,使工具栏带有背景。背景图案可以透过按钮显示,效果如图1.7所示。
技术要点
工具栏中的背景是一幅图片,在运行时应该将该图片绘制到工具栏上,在.NET 2.0中,只需将工具栏按钮的BackGroundImage的属性设置为对应的图片即可。
实现过程
(1)创建一个项目,将其命名为Ex01_07,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加ToolStrip控件,并为工具栏添加相应的按钮。
(3)为工具栏的按钮设置相应的BackGroundImage属性,相应的的图片就会变成按钮的背景。
举一反三
根据本实例,读者可以开发以下功能。
制作一个带动画效果的工具栏。
制作一个自定义样式的工具栏。
实例008 带浮动工具栏
实例说明
通常情况下,窗体显示在屏幕的中心。对于使用频率非常高的软件,通常放在屏幕上端以浮动工具栏形式显示。下面通过实例介绍浮动工具栏的设计方法。运行程序,程序可以停在屏幕的任何位置,当窗体失去焦点后,窗体将自动隐藏。效果如图1.8所示。
技术要点
窗体是否要隐藏,重要的是要判断在操作中,通过窗体的Focused属性,是否可以确定窗体有焦点。在窗体有焦点时,该窗体正在被操作,这时需要完全显示在屏幕当中,如果窗体没有焦点,通过设置窗体到屏幕的高度,来确定窗体的隐藏部分。下面详细介绍一下Focused属性。
Focused属性用来获取一个值,该值指示控件是否有输入焦点。其语法结构如下:
public virtual bool Focused { get; }
l 属性值:如果控件有焦点,则为True;否则为False。
实现过程
(1)创建一个项目,将其命名为Ex01_08,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加Panel控件,并为Panel控件添加相应的背景图片。
(3)在Panel上添加两个Label控件,并将其Text属性设置为“打开”和“关闭”,同时把两个Label控件的背景颜色设置为透明。
(4)主要程序代码。
private void timer1_Tick(object sender, EventArgs e)
{
if (this.Focused == false)
{
this.Top = -30;
}
}
private void label2_Click(object sender, EventArgs e)
{
this.Close();
}
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
this.Top = 60;
}
举一反三
根据本实例,读者可以开发以下功能。
制作一个带动画效果的工具栏。
制作一个飘动的工具栏。
实例009 在带下拉菜单的工具栏
实例说明
工具栏是窗体的组成部分之一,工具栏中的按钮可以完成一些较为常用或重要的功能,本例中设计了一个工具栏,使工具栏带有下拉菜单,效果如图1.9所示。
技术要点
带下拉菜单的工具栏在其他计算机语言中实现比较复杂,但在.NET 2.0中已经提供了这个功能,只需将工具栏按钮的类型设置为DropDownButton即可。
实现过程
(1)创建一个项目,将其命名为Ex01_09,默认窗体为Form1。
(2)从工具箱中为窗体添加ToolStrip控件,并为工具栏添加相应的按钮,在按钮的下拉选项中选择DropDownButton类型。
(3)为工具栏DropDownButton类型的按钮设置相应的下拉菜单,就可以轻松实现带下拉菜单的工具栏。
举一反三
根据本实例,读者可以开发以下功能。
制作一个带右键菜单的工具栏。
制作一个带复选框的工具栏。
实例010 在具有提示功能的工具栏
实例说明
在文档视图结构的应用程序中,默认情况下,当鼠标在工具栏按钮上停留片刻,会出现一个工具提示条。本例实现了一个具有提示功能的工具栏,效果如图1.10所示。
技术要点
具有提示功能的工具栏在其他计算机语言中实现也许比较复杂,但在.NET 2.0中已经提供了这个功能。只需将工具栏按钮的ToolTipText设置为要提示的内容即可。下面详细介绍一下该属性。
ToolTipText属性用来获取或设置作为控件的ToolTip显示的文本。其语法结构如下:
public string ToolTipText { get; set; }
l 属性值:一个表示工具提示文本的字符串。
实现过程
(1)创建一个项目,将其命名为Ex01_10,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加ToolStrip控件用来设计工具栏,并为工具栏添加相应的按钮。
(3)为相应按钮的ToolTipTile属性设置提示内容,就可以轻松实现具有提示功能的工具栏。
举一反三
根据本实例,读者可以开发以下功能。
具有提示功能的各种控件。
具有提示功能的窗体。
1.3 状态栏设计
状态栏是用来显示当前程序状态的。状态栏可以分为多个面板,用来显示不同状态下的内容,本节主要介绍了状态栏的用法以及如何在状态栏中添加控件。
实例011 在状态栏中显示检查框
实例说明
在设计程序界面时,为了规范界面,可以将一些控件放置在状态栏中,这样既能起到控制程序的作用,又能使界面和谐、美观。运行程序,在窗体的状态栏中加入了显示时间检查框。效果如图1.11所示。
技术要点
在状态栏中添加检查框比较容易,只需先将状态栏加入窗体,然后将检查框从工具箱中拖入状态拦即可。
实现过程
(1)创建一个项目,将其命名为Ex01_11,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加StatusStrip控件,并从工具箱中为状态栏添加CheckBox控件。
(3)主要程序代码。
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (this.checkBox2.Checked)
{
statusStrip1.Items[1].Text = "日期:" + DateTime.Now.ToString();
}
else
{
statusStrip1.Items[1].Text = "";
}
}
举一反三
根据本实例,读者可以开发以下功能。
运行时设置控件的位置。
动态控制控件的显示。
实例012 带进度条的状态栏
实例说明
上网浏览网页的读者都用过IE浏览器,读者是否注意到该浏览器的状态栏,在打开网页的过程中,浏览器下边的状态栏中有一个进度条显示当前网页的载入进度,这样的状态栏使界面显得更加丰富多彩,并且非常实用。本例将设计一个带进度条的状态栏,并且在程序运行当中进度条可以显示其进度,该实例运行结果如图1.12所示。
技术要点
带进度条的状态栏在别的开发环境下实现相对比较复杂,但在.NET 2.0中已经提供了这个功能,只需将状态栏的按钮类型设置为ProgressBar即可。通过设置ProgressBar的Step 属性指定一个特定值用以逐次递增Value属性的值,然后调用PerformStep方法来使该值递增,就可以实现带进度条的状态栏。
实现过程
(1)创建一个项目,将其命名为Ex01_12,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加StatusStrip控件,并为状态栏添加相应的按钮,在按钮的下拉选项中选择ProgressBar类型。
(3)设置ToolStripProgressBar1的Value属性、Maximum属性和Step属性。
(4)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
while (toolStripProgressBar1.Value < toolStripProgressBar1.Maximum)
{
this.toolStripProgressBar1.PerformStep();
}
}
举一反三
根据本实例,读者可以开发以下功能。
在状态栏中显示时间。
改变进度条的颜色。
实例013 状态栏中加入图标
实例说明
状态栏已经成为主界面必不可少的部分,状态栏一般用于显示程序状态、当前日期等,在状态栏中添加一张图片会使程序的主界面更有特色。运行本例,效果如图1.13所示。
技术要点
状态栏中加入图标在.NET 2.0中实现非常容易,只要将对应状态栏面板的Image属性设置为要显示的图片即可。
实现过程
(1)创建一个项目,将其命名为Ex01_13,默认窗体为Form1。
(2)从工具箱中为Form1窗体添加StatusStrip控件,并为状态栏添加相应的按钮,设置添加的按钮的Image属性为要显示的图片。
举一反三
根据本实例,读者可以实现以下功能。
将其他控件放置在状态栏中,如进度条。
将其他控件放置在状态栏中,如复选框。
1.4 导航菜单界面
对于一些应用工具软件,界面不但要求人性化、漂亮,还要突出界面功能、使用方便,这样才能吸引用户使用。本节主要介绍了常用的几种菜单界面。
实例014 OutLook界面
实例说明
程序主界面包括菜单栏、工具栏、状态栏和树状视图。OutLook界面美观、友好,是一个很实用的程序主界面,并且菜单栏和工具栏是可移动的。运行本例效果如图1.14所示。
图1.14 Out Look界面
技术要点
一般程序的菜单栏和工具栏是不可移动的,但是只要将MenuStrip和ToolStrip控件的AllowItemRecorder属性设为True就可以移动。在本例中使用MenuStrip控件制作菜单栏,使用ToolStrip制作工具栏,使用StatusStrip控件制作状态栏。下面详细介绍一下这几个控件的属性。
1.ToolStrip. AllowItemReorder属性
获取或设置一个值,该值指示是否由ToolStrip类私自处理拖放和项重新排序。其结构如下:
public bool AllowItemReorder { get; set; }
l 属性值:如果让ToolStrip类自动处理拖放和项重新排序,为True;否则为False。默认值为False。
2.MenuStrip. AllowItemReorder属性
获取或设置一个值,该值指示是否由ToolStrip类私自处理拖放和项重新排序。其结构如下:
public bool AllowItemReorder { get; set; }
l 属性值:如果让 MenuStrip类自动处理拖放和项重新排序,为True;否则为False。默认值为False。
3.ToolStripItem.DisplayStyle属性
获取或设置是否在ToolStripItem上显示文本和图像。
public virtual ToolStripItemDisplayStyle DisplayStyle { get; set; }
l 属性值:ToolStripItemDisplayStyle值之一。默认为ImageAndText。
注意:在移动菜单栏和工具栏时,需要按住“Alt”键,同时用鼠标进行拖动。
实现过程
(1)创建一个项目,将其命名为Ex01_14,默认窗体为Form1。
(2)在Form1窗体上添加MenuStrip控件,用来设计主菜单;添加ToolStrip控件,用来设计工具栏;添加StatusStrip控件,用来设计状态栏;添加ImageList控件和TreeVew控件,用来设计树结构。
(3)分别为MenuStrip控件、ToolStrip控件、ImageList控件和TreeVew控件添加子项,将MenuStrip控件和ToolStrip控件的AllowItemRecorder属性设为True,并将ToolStrip控件的每个子项的DisplayStyle属性设置为“ImageAndText”。下面详细介绍这几个属性。
举一反三
根据本实例,读者可以实现以下功能。
制作一个系统菜单。
制作一个导航界面。
实例015 带带导航菜单的主界面
实例说明
在窗体界面中,菜单栏是不可缺少的重要组成部分。本实例是用其他的控件来制作一个摸拟菜单栏。运行程序,单击窗体上面的按钮,将会在按钮的下面显示一个下拉列表。如图1.15所示。
技术要点
该实例中主要使用Button控件和ListView控件制作导航菜单界面。在对ListView控件添加菜单信息时,必需在前面写入添加语句,如Listview.Items.Add,否则添加的菜单信息将替换前一条信息。单击相应的按钮时,应首先对ListView控件进行清空,否则在ListView控件中将继续上一次的添加菜单信息。
实现过程
(1)创建一个项目,将其命名为Ex01_15,默认窗体为Form1。
(2)在Form1窗体上添加MenuStrip控件设计菜单栏;添加ToolStrip控件设计工具栏;添加SplitContainer控件、ImageList控件、3个Button控件和ListView控件用来制作左侧的导航栏。
(3)分别为MenuStrip控件、ToolStrip控件添加子项,将3个Button按钮和ListView控件加入SqlitContainer1.panel的左侧部分中。
(4)主要程序代码。
加载窗体时,设置左侧导航栏内容的实现代码如下:
private void Form1_Load(object sender, EventArgs e)
{
listView1.Clear();
listView1.LargeImageList = imageList1;
listView1.Items.Add("设置上下班时间", "设置上下班时间", 0);
listView1.Items.Add("是否启用短信提醒", "是否启用短信提醒", 1);
listView1.Items.Add("设置密码", "设置密码", 2);
}
添加打开按钮的ListView控件显示内容的实现代码如下:
private void button2_Click_1(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button2.Dock = DockStyle.Top;
button1.SendToBack();
button1.Dock = DockStyle.Top;
button3.Dock = DockStyle.Bottom;
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("近期工作记录", "近期工作记录", 3);
listView1.Items.Add("近期工作计划", "近期工作计划", 4);
}
添加编辑按钮的ListView控件显示内容的实现代码如下:
private void button3_Click_1(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button3.SendToBack();
button3.Dock = DockStyle.Top;
button2.SendToBack();
button2.Dock = DockStyle.Top;
button1.SendToBack();
button1.Dock = DockStyle.Top;
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("编辑工作进度报告", "编辑工作进度报告", 5);
listView1.Items.Add("编辑项目设计图", "编辑项目设计图", 6);
}
添加设置按钮的ListView控件显示内容的实现代码如下:
private void button1_Click_1(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button1.Dock = DockStyle.Top;
button2.Dock = DockStyle.Bottom;
button3.SendToBack();
button3.Dock = DockStyle.Bottom;
listView1.BringToFront();
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("设置上下班时间", "设置上下班时间", 0);
listView1.Items.Add("是否启用短信提醒", "是否启用短信提醒",1);
listView1.Items.Add("设置密码", "设置密码", 2);
}
举一反三
根据本实例,读者可以实现以下功能。
制作一个系统菜单。
制作大型系统的导航界面。
实例016 图形化的导航界面
实例说明
如果以按钮来代替菜单的功能,会使界面更具有个性化。使操作者更易于操作。下面介绍按钮显示菜单的设计方法。运行本例,效果如图1.16所示。
图1.16 图形化的导航界面
技术要点
本实例主要通过设置Button控件的相应属性,确定其按钮的位置、文字、显示样式和要显示的图片等。下面对Button控件相应属性进行详细介绍。
1.Button. BackColor属性
获取或设置控件的背景色,其方法结构如下:
public override Color BackColor { get; set; }
l 属性值:一个表示背景色的Color值。
2.Button. FlatStyle属性
获取或设置按钮控件的平面样式外观。其代码如下:
public FlatStyle FlatStyle { get; set; }
l 属性值:FlatStyle 值之一。默认值为Standard。
3.Button. TextImageRelation属性
获取或设置文本和图像相互之间的相对位置。其代码如下:
public TextImageRelation TextImageRelation { get; set; }
l 属性值:TextImageRelation 的值之一。默认为Overlay。
实现过程
(1)创建一个项目,将其命名为Ex01_16,默认窗体为Form1。
(2)在Form1窗体上添加MenuStrip控件用来设计菜单栏,添加ToolStrip控件用来设计工具栏,添加Panel控件、Button控件用来设计图形化的导航按钮。
(3)分别为MenuStrip控件、ToolStrip控件添加子项,并为Panel控件选择背景图片。
(4)将Button控件的BackColor属性设为“Transparent”、FlatStyle属性设置为“Flat”、TextImageRelation属性设置为“ImageBeforeText”。
(5)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
//使子项可见
button5.Visible = true;
button6.Visible = true;
button7.Visible = true;
}
private void button2_Click(object sender, EventArgs e)
{
//使子项可见
button8.Visible = true;
button9.Visible = true;
button10.Visible = true;
}
private void button3_Click(object sender, EventArgs e)
{
//使子项可见
button11.Visible = true;
button12.Visible = true;
button13.Visible = true;
}
举一反三
根据本实例,读者可以实现以下功能。
制作动态的按钮界面。
制作动态的图片界面。
1.5 特色程序界面
现在有很多开发人员都将界面制作成不同类型的样式,这样可以使界面更加形象化。本节主要介绍了如何对程序界面进行特色化设计,如类似QQ、Windows XP的界面等。
实例017 菜类QQ的程序界面
实例说明
一般程序都是以菜单栏和工具栏的形式调用其他功能模块,如果以动态的类似QQ的程序界面来调用其他功能模块,将会给用户一种新鲜的感觉,使用户对软件更感兴趣。实例运行结果如图1.17所示。
技术要点
本例主要使用Button控件来完成布局,使用ListView控件来显示有图标的功能菜单。ListView控件的常用属性及说明如下。
1.ListView.Items属性
使用该属性可直接访问表示列表中项目的ListItem对象。其结构如下:
public ListViewItemCollection Items { get; }
l 属性值: ListView.ListViewItemCollection包含ListView控件中所有的项。
2.ListView.Dock属性
获取或设置哪些控件边框停靠到其父控件并确定控件如何随其父级一起调整大小。其结构如下:
public virtual DockStyle Dock { get; set; }
l 属性值:DockStyle值之一。默认为None。
实现过程
(1)创建一个项目,将其命名为Ex01_17,默认窗体为Form1。
(2)在窗体上添加Button控件、ListView控件和ImageList控件。设置ListView控件的ImageList属性为ImageList控件。
(3)主要程序代码。
添加“我的好友”选项内容的实现代码如下:
private void button1_Click(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button1.Dock = DockStyle.Top;
button2.Dock = DockStyle.Bottom;
button3.SendToBack();
button3.Dock = DockStyle.Bottom;
listView1.BringToFront();
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("小猪", "小猪", 0);
listView1.Items.Add("小狗", "小狗", 1);
listView1.Items.Add("娇娇", "娇娇", 2);
}
添加默认时选项内容的实现代码如下:
private void Form1_Load(object sender, EventArgs e)
{
listView1.Clear();
listView1.LargeImageList = imageList1;
listView1.Items.Add("小猪", "小猪", 0);
listView1.Items.Add("小狗", "小狗", 1);
listView1.Items.Add("娇娇", "娇娇", 2);
}
添加“陌生人”选项内容的实现代码如下:
private void button2_Click(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button2.Dock = DockStyle.Top;
button1.SendToBack();
button1.Dock = DockStyle.Top;
button3.Dock = DockStyle.Bottom;
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("北风", "北风", 3);
}
添加“黑名单”选项内容的实现代码如下:
private void button3_Click(object sender, EventArgs e)
{
listView1.Dock = DockStyle.None;
button3.SendToBack();
button3.Dock = DockStyle.Top;
button2.SendToBack();
button2.Dock = DockStyle.Top;
button1.SendToBack();
button1.Dock = DockStyle.Top;
listView1.Dock = DockStyle.Bottom;
listView1.Clear();
listView1.Items.Add("冰雨", "冰雨", 5);
}
举一反三
根据本实例,读者可以实现以下功能。
根据数据库信息形成相应的功能列表。
制作聊天界面。
实例018 类似windows xp的程序界面
实例说明
在Windows XP环境下打开控制面板,会发现左侧的导航界面很实用。双击展开按钮,导航栏功能显示出来,双击收缩按钮,导航按钮收缩。下面通过实例介绍此种主窗体的设计方法。运行本例,效果如图1.18所示。
技术要点
PictureBox控件是一个图像显示控件,该控件主要以其中的Image属性存储图像数据。其详细介绍如下。
PictureBox.Image属性用来获取或设置 PictureBox 显示的图像,其语法格式如下:
public Image Image { get; set; }
图1.18 类似windows xp的程序界面
l 属性值:要显示的Image。
实现过程
(1)创建一个项目,将其命名为Ex01_18,默认窗体为Form1。
(2)在Form1窗体上添加Button控件、PictureBox控件和label控件,布局如图1.18所示。
(3)主要程序代码。
双击“向下箭头”的实现代码如下:
private void pictureBox5_Click(object sender, EventArgs e)
{
//使子项收缩
int i ;
i=80;
pictureBox5.Visible = false;
pictureBox4.Visible = false;
label2.Visible = false;
label3.Visible = false;
pictureBox6.Top -= i;
pictureBox8.Top -= i;
label4.Top -= i;
label5.Top -= i;
label6.Top -= i;
label10.Top -= i;
label7.Top -= i;
label8.Top -= i;
label9.Top -= i;
pictureBox9.Top -= i;
pictureBox11.Top -= i;
}
双击“向上箭头”的实现代码如下:
private void pictureBox2_Click(object sender, EventArgs e)
{
//展开子项
if (pictureBox5.Visible == false)
{
int i;
i = 80;
pictureBox5.Visible = true;
pictureBox4.Visible = true;
label2.Visible = true;
label3.Visible = true;
pictureBox6.Top += i;
pictureBox8.Top += i;
label4.Top += i;
label5.Top += i;
label6.Top += i;
label10.Top += i;
label7.Top += i;
label8.Top += i;
label9.Top += i;
pictureBox9.Top += i;
pictureBox11.Top += i;
}
}
private void Form1_Load(object sender, EventArgs e)
{
SetStyle(ControlStyles.SupportsTransparentBackColor,true);
}
注意:在对控件的高度进行递增或递减的时候,数值不要太小。
举一反三
根据本实例,读者可以实现以下功能。
制作Windows XP控制面板。
制作Windows XP开始导航菜单。
实例019 以图形按钮显示的界面
实例说明
菜单和工具栏虽然能方便用户操作程序的相应功能,但各有缺点。如果采用按钮式功能菜单,不但美观大方,而且操作灵活。当单击按钮时,用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例,效果如图1.19所示。
图1.19 以图形按钮显示的界面
技术要点
本例中用到了Image.FromFile方法和PictureBox.Image属性,下面详细介绍一下。
(1)Image.FromFile方法:从指定的文件创建Image。该函数的结构为:
public static Image FromFile (string filename)
参数说明如下。
l filename:当前目录的指定路径字符串,包含要从中创建Image的文件的名称。
l 返回值:此方法创建的Image。
(2)PictureBox.Image属性:获取或设置PictureBox显示的图像。其属性结构为:
public Image Image { get; set; }
l 属性值:要显示的Image。
注意:在本例中不易使窗体最大化。如最大化,会使Label控件不在正确的位置上。
实现过程
(1)创建一个项目,将其命名为Ex01_19,默认窗体为Form1。
(2)在Form1窗体上添加MenuStrip控件用来设计菜单;添加Picture控件、Panel控件用来设计图形显示的界面。
(3)将panel的背景图片设置为图1.19所示,并在图片上添加Label控件,同时将Label控件的BackColor属性设置为transparency。
(4)主要程序代码。
private void label1_Click(object sender, EventArgs e)
{
pictureBox3.Image= Image.FromFile("3.jpg");//为控件加载图像
}
举一反三
根据本实例,读者可以实现以下功能。
制作图片的动态更新。
制作一个图片浏览器。
实例020 以树形显示的程序界面
实例说明
以树形来显示程序的菜单,可以更直观更快捷的对软件进行操作。树形菜单比菜单栏更加美观实用。下面介绍树形界面菜单的设计方法。运行本例效果如图1.20所示。
图1.20 以树形显示的程序界面
技术要点
在对TreeView控件输入记录时,双击Nodes属性就可以对TreeView的节点进行设置。
可以在窗体的Load事件中输入下面的一条命令:
treeView1.ExpandAll();
功能:展开TreeView控件中所有的下级菜单。
实现过程
(1)创建一个项目,将其命名为Ex01_20,默认窗体为Form1。
(2)在窗体上添加MenuStrip控件用来设计菜单栏,添加PictureBox控件用来显示图片,添加TreevVew控件用来设计左侧树形导航界面。
(3)为PictureBox添加背景图片,给MenuStrip控件和TreevVew控件添加子项。
(4)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
treeView1.ExpandAll();
}
举一反三
根据本实例,读者可以实现以下功能。
制作一个动态的从数据库中读取数据的树型界面。
制作一个带图标的树型界面。
实例021 动态按钮的窗体界面
实例说明
在窗体界面中,通常以按钮来代替菜单栏的功能,这种形式虽然给用户一种直观,界面风格各异的感党,但通常按钮都是以静止的形式显示,如果使光标移到按钮时,可以使按钮上的图片和文字说明动态化,使用户快捷地找到所选按钮。这样就需要一个动态的按钮显示界面。运行本例效果如图1.21所示。
图1.21 动态按钮的窗体界面
技术要点
在编辑过程中,首先在Button控件中的Image属性中添加图片,然后将Button控件的ImageAlign属性设置为MiddleCenter,使图片居中。在设置Button控件的动态图片时,必须在相应控件的MouseMove事件中设置。
1.Button.Image属性
获取或设置显示在按钮控件上的图像,其语法格式如下:
public Image Image { get; set; }
l 属性值:按钮控件上显示的Image。默认值为空引用。
2.Button. ImageAlign属性
获取或设置按钮控件上的图像对齐方式,其语法格式如下:
public ContentAlignment ImageAlign { get; set; }
l 属性值:ContentAlignment值之一。默认值为MiddleCenter。
注意:当鼠标移开Button控件时,图片与字应及时恢复原位。
实现过程
(1)创建一个项目,将其命名为Ex01_21,默认窗体为Form1。
(2)在Form1窗体上添加PictureBox用来显示图片,添加Button、Lable控件用来设计动态按钮。
(3)为PictureBox控件设置背景图片,将Lable控件的Text属性设置为“明日科技有限公司”,并为每个Button控件设置图片和文字。
(4)主要程序代码。
private void button1_MouseMove(object sender, MouseEventArgs e)
{
//鼠标移动时改变图片位置
button1.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button2_MouseMove(object sender, MouseEventArgs e)
{
button2.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button3_MouseMove(object sender, MouseEventArgs e)
{
button3.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button4_MouseMove(object sender, MouseEventArgs e)
{
button4.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button5_MouseMove(object sender, MouseEventArgs e)
{
button5.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button1_MouseLeave(object sender, EventArgs e)
{
button1.ImageAlign = ContentAlignment.MiddleCenter;
}
//鼠标离开时改变图片位置
private void button2_MouseLeave(object sender, EventArgs e)
{
button2.ImageAlign = ContentAlignment.MiddleCenter;
}
private void button3_MouseLeave(object sender, EventArgs e)
{
button3.ImageAlign = ContentAlignment.MiddleCenter;
}
private void button4_MouseLeave(object sender, EventArgs e)
{
button4.ImageAlign = ContentAlignment.MiddleCenter;
}
private void button5_MouseLeave(object sender, EventArgs e)
{
button5.ImageAlign = ContentAlignment.MiddleCenter;
}
private void button6_MouseMove(object sender, MouseEventArgs e)
{
button6.ImageAlign = ContentAlignment.MiddleLeft;
}
private void button6_MouseLeave(object sender, EventArgs e)
{
button6.ImageAlign = ContentAlignment.MiddleCenter;
}
举一反三
根据本实例,读者可以实现以下功能。
根据所给图片制作相应的窗体界面。
用图片代替控件制作相应的窗体界面。
1.6 特殊形状的窗体
将界面以不规则的形状显示在桌面上,可以给用户一种新鲜的感觉。本节主要对窗体以特殊的形状进行显示,如非矩形窗体和字体形窗体等。
实例022 非矩形窗体
实例说明
大部分Windows窗体都是一个矩形区域,读者是否已经厌倦了这种中规中矩的矩形窗体?本例中的窗体是一个打破传统矩形的异型窗体,运行该例会看到一个非常可爱的窗体,单击【X】按钮就会使窗口关闭。实例效果如图1.22所示。
技术要点
以前,创建非矩形窗体是一个既费时又费人力的过程,其中涉及到 API 调用和大量的编程工作。在.NET 2.0框架中可以不调用API非常轻松的实现这一功能。只要重写窗体的OnPaint方法,在方法中重新绘制窗体,然后用透明色将窗体设置透明即可。
(1)Form.OnPaint方法:此成员重写Control.OnPaint。用来重新绘制窗体图像。其结构如下:
protected override void OnPaint (PaintEventArgs e)
参数说明如下。
l PaintEventArgs:为Paint事件提供数据。
实现过程
(1)创建一个项目,将其命名为Ex01_22,默认窗体为Form1。
(2)在窗口中添加Label控件,并将BackColor属性设为透明,将text属性设为空。
(3)将窗体的TransparencyKey属性设为窗体的背景色。
(4)主要程序代码。
设置图片透明颜色的实现代码如下:
private void Form1_Load(object sender, EventArgs e)
{
bit = new Bitmap("Heart.bmp");
bit.MakeTransparent(Color.Blue);
}
重写基类方法,具体代码如下:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage((Image)bit, new Point(0, 0));//将图片画出
}
举一反三
根据本实例,读者可以开发以下程序。
可以把窗体制做成各种卡通图形。
可以将窗体制做成各种几何图形。
可以将窗体制做成桌面小精灵。
实例023 建立字体形状窗体
实例说明
大家都见过不规则形状的窗体吧,那么如何制作一个文字形的窗体呢?文字形窗体一般应用在屏幕提示中,如收款机屏幕等。运行本例,效果如图1.23所示。
技术要点
以前,创建字体形窗体是一个既费时又费人力的过程,其中涉及到API调用和大量的编程工作。在.NET 2.0框架中可以不调用API非常轻松的实现这一功能。只要先将字体画在一幅图上,然后重写窗体的OnPaint方法(方法的详细内容可以参见实例022),在方法中用图重新绘制窗体,用背景色将窗体设置透明即可。
实现过程
(1)创建一个项目,将其命名为Ex01_23,默认窗体为Form1。
(2)主要程序代码。
namespace SpecialSharpWindows
{
public partial class Form1 : Form
{
Bitmap bit;
public Form1()
{
InitializeComponent();
}
设置图片透明颜色的实现。代码如下:
private void Form1_Load(object sender, EventArgs e)
{
bit = new Bitmap("1.bmp");
bit.MakeTransparent(Color.Blue);
}
重写基类方法的实现。代码如下:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage((Image)bit, new Point(0, 0));
}
private void label1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
举一反三
根据本实例,读者可以实现以下功能。
制作圆形的窗体。
制作锯齿状的窗体。
实例024 控件随窗体自动调整
实例说明
在软件开发中,随着窗体的大小变化,界面会和设计时出现较大的差异,控件和窗体的大小会不成比例非常不美观。本例中的控件是一个可以随窗体大小变化的控件。运行该例会看到一个控件随窗体大小变化的窗体。实例效果如图1.24所示。
技术要点
在.NET 2.0框架中可以非常轻松的实现这一功能。大多数控件都有Anthor属性,当在窗体上添加控件时设置Anthor属性即可。Anthor属性是个锚定属性,指定了控件距容器边缘的距离。当窗体大小变化时,控件距窗体边缘的距离不变,自然大小就随窗体自动调整。
实现过程
(1)创建一个项目,将其命名为Ex01_24,默认窗体为Form1。
(2)在窗体上添加MenuStrip控件、ToolStrip控件和Button控件。并设置Button的Anthor属性和Text属性。
举一反三
根据本实例,读者可以实现以下功能。
图片大小随着窗体大小变化的窗体。
菜单栏大小随着窗体大小变化的窗体。
实例025 带分隔栏的窗体
实例说明
在软件开发中,经常需要将界面分成几个部分,而且这几个部分又可以自由调整大小。运行本例,实例效果如图1.25所示。
技术要点
在.NET 2.0框架中可以非常轻松的实现这一功能,只要在窗体中加入SplitContainer控件即可。SplitContainer控件带有一个分隔栏,用来把窗体分成两部分。
实现过程
(1)创建一个项目,将其命名为Ex01_25,默认窗体为Form1。
(2)在Form1窗体上添加MenuStrip控件用来设计菜单栏,添加ToolStrip控件用来设计工具栏,添加SplitContainer控件用来设计分隔栏。
举一反三
根据本实例,读者可以实现以下功能。
分成3部分的窗体。
分成4部分的窗体。
实例026 随机更换主界面背景
实例说明
如果开发的软件用户使用频率非常高,可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快,也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子,效果如图1.26所示。
技术要点
随机更换主界面背景使用了Random类和ImageList控件。首先为ImageList控件添加一组图片,然后实例化一个Random类,再用Next()方法产生一个随机数以决定将哪个图片设为背景。
Random.Next()方法用来返回一个小于所指定最大值的非负随机数。其结构如下:
public virtual int Next (int maxValue)
参数说明如下。
l maxValue:要生成的随机数的上界(随机数不能取该上界值)。maxValue必须大于或等于零。
l 返回值:大于或等于零且小于maxValue的32位带符号整数,即返回的值范围包括零但不包括maxValue。
实现过程
(1)创建一个项目,将其命名为Ex01_26,默认窗体为Form1。
(2)在Form1窗体上添加ImageList控件,并为ImageList控件添加图片。
(3)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
Random rdn = new Random();
int i = rdn.Next(imageList1.Images.Count);//产生一个随机数
this.BackgroundImage = imageList1.Images[i];
}
举一反三
根据本实例,读者可以开发以下程序。
每天更换主程序背景的主界面。
随机更换菜单栏、工具栏图标的主程序。
1.7 多媒体光盘
本节主要介绍了如何自动启动多媒体光盘和触摸屏的相关技术。自动启动多媒体光盘技术应用十分广泛,现在的光盘大多应用这些技术,节省了用户单击进入的时间。
实例027 自动启动的多媒体光盘程序
实例说明
用户在安装软件时,将光盘放入光驱内,光盘会自动运行,进行安装操作,该功能是如何实现的呢?本例介绍如何制作“自动安装的光盘程序”,程序运行效果如图1.27所示。
技术要点
其实,实现光盘的自动运行非常简单,当用户打开自动运行的光盘时,会发现光盘中有几个特殊的文件,分别为“autorun.exe”、“run.ico”和“autorun.inf”,其中“autorun.exe”是光盘自动播放时执行的可执行文件,“run.ico”是光盘的图标,“autorun.inf”是一个INI文件。只要光盘中包含这些文件,那么在将光盘放入光驱时,就会自动运行。
实现过程
(1)创建一个项目,将其命名为Ex01_27,默认窗体为Form1。
(2)为Form1窗体添加背景图片Button控件。
(3)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("AutoRun.inf",false);
sw.WriteLine("[autorun]");
sw.WriteLine("OPEN=AUTORUN.EXE");
sw.WriteLine("ICON=run.ICO");
sw.Close();
}
(4)运行程序,将可执行文件命名为“autorun.exe”,该文件就是光盘自动播放时打开的文件。
(5)选择一个图标,命名为“run.ico”,该图标在光驱读盘时显示。
(6)在刻光盘时,将上面的“run.ico”、“autorun.inf”和“autorun.exe”3个文件刻录到光盘中。
举一反三
根据本实例,读者可以开发以下程序。
设计多媒体宣传光盘。
制作后门程序。
实例028 为触摸屏程序添加虚拟键盘
实例说明
由于触摸屏没有键盘,只能利用屏幕操作。如果要输入数据或查找数据,需要制作一个虚拟键盘,以方便用户输入。本例介绍如何实现虚拟键盘的程序设计。运行本例,效果如图1.28所示。
技术要点
本例中用到了Lable控件的透明属性和字符串截取技术。主要是使用Substring()方法。下面详细介绍一下该方法。
Substring()方法用来从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。其语法结构如下:
public string Substring (int startIndex,int length)
参数说明如下。
l startIndex:子字符串起始位置的索引。
l length:子字符串中的字符数。
l 返回值:一个String,等于此实例中从startIndex开始的长度为length的子字符串,如果startIndex等于此实例的长度且length为零,则为Empty。
实现过程
(1)创建一个项目,将其命名为Ex01_28,默认窗体为Form1。
(2)在窗体上添加2个Panel控件,1个TextBox控件和许多Label控件,每个Label控件对应背景图片上的1个按钮。
(3)为Panel控件添加背景图片,并将Label控件的BackColor设置为透明。
(4)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
lbl_0.Click += new EventHandler(lbl_Click);
lbl_1.Click += new EventHandler(lbl_Click);
lbl_2.Click += new EventHandler(lbl_Click);
lbl_3.Click += new EventHandler(lbl_Click);
lbl_4.Click += new EventHandler(lbl_Click);
lbl_5.Click += new EventHandler(lbl_Click);
lbl_6.Click += new EventHandler(lbl_Click);
lbl_7.Click += new EventHandler(lbl_Click);
lbl_8.Click += new EventHandler(lbl_Click);
lbl_9.Click += new EventHandler(lbl_Click);
lbl_Q.Click += new EventHandler(lbl_Click);
lbl_W.Click += new EventHandler(lbl_Click);
lbl_R.Click += new EventHandler(lbl_Click);
lbl_E.Click += new EventHandler(lbl_Click);
lbl_T.Click += new EventHandler(lbl_Click);
lbl_Y.Click += new EventHandler(lbl_Click);
lbl_U.Click += new EventHandler(lbl_Click);
lbl_I.Click += new EventHandler(lbl_Click);
lbl_O.Click += new EventHandler(lbl_Click);
lbl_P.Click += new EventHandler(lbl_Click);
lbl_A.Click += new EventHandler(lbl_Click);
lbl_S.Click += new EventHandler(lbl_Click);
lbl_D.Click += new EventHandler(lbl_Click);
lbl_F.Click += new EventHandler(lbl_Click);
lbl_G.Click += new EventHandler(lbl_Click);
lbl_H.Click += new EventHandler(lbl_Click);
lbl_J.Click += new EventHandler(lbl_Click);
lbl_K.Click += new EventHandler(lbl_Click);
lbl_L.Click += new EventHandler(lbl_Click);
lbl_Z.Click += new EventHandler(lbl_Click);
lbl_X.Click += new EventHandler(lbl_Click);
lbl_C.Click += new EventHandler(lbl_Click);
lbl_V.Click += new EventHandler(lbl_Click);
lbl_B.Click += new EventHandler(lbl_Click);
lbl_N.Click += new EventHandler(lbl_Click);
lbl_M.Click += new EventHandler(lbl_Click);
label44.Click += new EventHandler(label44_Click);
}
将选中的数字或字母加入TextBox.Text的实现代码如下:
void lbl_Click(object sender, EventArgs e)
{
Label l = (Label)sender;
textBox1.Text += l.Name.Substring(4, 1);
textBox1.SelectionStart = textBox1.Text.Length;
}
举一反三
根据本实例,读者可以实现以下程序。
制作注册控件的程序。
制作网络程序复制的程序。
1.8 窗 体 效 果
本节主要是对窗体的透明度、颜色渐变、背景及边框的相关技术进行讲解。在项目开发中窗体的设计会影响用户对软件的整体印象,所以窗体的效果要设计的美观一些。下面将介绍一些常用的效果。
实例029 半透明渐显窗体
实例说明
很多专业软件在启动前都会显示一个说明该软件信息或用途的窗口,有的则是一个漂亮的启动界面,如Adobe公司的Acrobat。该窗口使软件显得更加专业。本例将实现一个半透明的渐显窗体,运行本软件会显示一个启动画面,并且画面会将完全透明慢慢到半透明的效果显示在用户面前。效果如图1.29所示。
图1.29 半透明溅显窗体
技术要点
在其他开发环境中,实现窗体的半透明渐显需要调用API函数,实现非常困难,但在C# 2.0中,窗体提供了Opacit属性来设置窗体的透明度。
Form.Opacit属性用来获取或设置窗体的不透明度级别,其语法格式如下:
public double Opacity { get; set; }
l 属性值:窗体的不透明度级别。默认值为1.00。
实现过程
(1)创建一个项目,将其命名为Ex01_29,默认窗体为Form1。
(2)在Form1窗体中设置背景图片,添加Timer控件用来触发渐变事件。
(3)设置Timer控件的Enable属性为True,设置Interval属性为1000。
(4)主要程序代码。
private void timer1_Tick(object sender, EventArgs e)
{
this.Opacity += 0.1;
}
举一反三
根据本实例,读者可以开发以下程序。
使窗体由透明状态显现出来,可以用Time控件来控制窗体由透明到显示所需的时间。
可以使窗体为透明状态,只显示窗体上的控件。
实例030 窗口颜色的渐变
实例说明
在程序设计时,可以通过设置窗体的BackColor属性来改变窗口的背景颜色。但是这个属性改变后整个窗体的客户区都会变成这种颜色,并且非常单调。如果窗体的客户区可以向标题栏一样能够体现颜色的渐变效果,那么窗体风格将会另有一番风味。本例设计了一个颜色渐变的窗体。效果如图1.30所示。
技术要点
C#中可以通过Color.FromArgb( )方法返回一种颜色,下面详细介绍一下该方法。
Color.FromArgb( )方法用来返回Color的颜色值,该方法语法结构如下:
public static Color FromArgb (
int red,
int green,
int blue
)
参数说明如下。
l red:新Color的红色分量值。有效值为从0~255。
l green:新Color的绿色分量值。有效值为从0~255。
l blue:新Color的蓝色分量值。有效值为从0~255。
l 返回值:此方法创建的Color。
该函数就是用3种不同的色值来返回一个颜色,而稍微的调整某一种颜色值就可以使整体的颜色发生细微的变化,在窗体中至上而下每行填充一种稍微调整后的颜色,这样整体看来就会产生渐变的效果。可以利用窗体的Graphics对象对窗体进行绘图,该对象可以完全操控窗体的客户区。
注意:颜色值在0~255之间。
实现过程
(1)创建一个项目,将其命名为Ex01_30,默认窗体为Form1。
(2)在Form1窗体中添加Button用来使颜色渐变;添加TextBox控件用来输入颜色RGB值。
(3)主要程序代码。
触发重新绘制事件的实现代码如下:
private void button2_Click(object sender, EventArgs e)
{
InvokePaintBackground( );
this.Hide( );
this.Visible=true;
}
重新绘制窗体背景颜色的实现代码如下:
protected override void OnPaintBackground(PaintEventArgs e)
{
int y, dy;
y = this.ClientRectangle.Location.Y;
dy = this.ClientRectangle.Height / 256;
for (int i = 255; i >= 0; i--)
{
Color c = new Color( );
c = Color.FromArgb(Convert.ToInt32(textBox1.Text.ToString( )), i,Convert.ToInt32(textBox2.Text.ToString( )));
SolidBrush sb = new SolidBrush(c);
Pen p = new Pen(sb, 1);
e.Graphics.DrawRectangle(p,this.ClientRectangle.X, y, this.Width,y+dy);
y = y + dy;
}
}
举一反三
根据本实例,读者可以开发以下程序。
把窗体设置成单一的颜色。
利用Timer组体,使窗体动态改变颜色。
1.9 窗 体 动 画
本节主要对窗体进行动画设置,在窗体上添加一些动画效果,可以为操作者添加一些乐趣,下面的几个例子将详细介绍窗体动画的相关技术。
实例031 窗体中的滚动字幕
实例说明
普通窗体中的文字位置都是固定的,一些窗体中需要让文字动起来,例如一些广告性较强的界面中需要做一些滚动的字幕。本例实现了一个具有滚动字幕效果的窗体,运行本例,单击【演示】按钮,看到窗口中的文字开始滚动。单击【暂停】按钮,可以使字幕停止滚动。本例运行效果如图1.31所示。
技术要点
滚动字幕的效果其实就是改变了文字的位置,在窗体中显示一串文字最好的办法就是利用Label控件。将Label控件的位置改变就可以实现文字的位置变换,如果该控件的位置不断的向水平方向移动,就会实现文字的滚动效果。改变Label控件的水平位置可以通过改变Label控件的Left的值来实现。用Timer控件对文字的移动进行时间控制。
实现过程
(1)创建一个项目,将其命名为Ex01_31,默认窗体为Form1。
(2)在窗体上添加Label控件用来显示消息;添加Button控件用来控制消息的运动;添加Timer控件用来控制滚动速度。
(3)主要程序代码。
private void timer1_Tick(object sender, EventArgs e)//用Timer来控制滚动速度
{
label1.Left -= 2;
if (label1.Right < 0)
{
label1.Left = this.Width;
}
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true; //开始滚动
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false; //停止滚动
}
注意:要特别注意文字滚动的方向问题,向左则减,向右则加。
举一反三
根据本实例,读者可以开发以下程序。
可以在窗体中设置一个滚动的图片。
可以在窗体中设置一个滚动的提示信息。
实例032 动画显示窗体
实例说明
当用户启动程序后,普通的程序窗口都是瞬间显示到屏幕上,这样未免有些生硬。如果窗口能够慢慢的展现在用户面前,将会是什么样的效果?本例设计的是一个动画显示的窗体,该程序运行后,窗体是慢慢的以拉伸的效果显示到用户的面前。当关闭时也是一样慢慢的消失。本例运行效果如图1.32所示。
技术要点
Windows提供了一个API函数Animate Window,该函数可以实现窗体的动画效果,AnimateWindow函数在C#中的声明如下。
[DllImportAttribute("user32.dll")]
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
参数说明如下。
l hwnd:目标窗口句柄。
l dwTime:动画的持续时间,数值越大动画效果的时间就越长。
l DwFlags:DwFlags参数是动画效果类型选项,该参数在C#中的声明如下:
public const Int32 AW_HOR_POSITIVE = 0x00000001;
public const Int32 AW_HOR_NEGATIVE = 0x00000002;
public const Int32 AW_VER_POSITIVE = 0x00000004;
public const Int32 AW_VER_NEGATIVE = 0x00000008;
public const Int32 AW_CENTER = 0x00000010;
public const Int32 AW_HIDE = 0x00010000;
public const Int32 AW_ACTIVATE = 0x00020000;
public const Int32 AW_SLIDE = 0x00040000;
public const Int32 AW_BLEND = 0x00080000;
DwFlags参数可选值含义如表1.1所示
表1.1 参数说明
标 志
描 述
AW_SLIDE
使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略
AW_ACTIVE
激活窗口。在使用了AW_HIDE标志后不要使用这个标志
AW_BLEND
使用淡入效果。只有当hWnd为顶层窗口的时候才可以使用此标志
AW_HIDE
隐藏窗口,缺省则显示窗口
AW_CENTER
若使用了AW_HIDE标志,则使窗口向内重叠;若未使用AW_HIDE标志,则使窗口向外扩展
AW_HOR_POSITIVE
自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略
AW_HOR_NEGATIVE
自右向左显示窗口。当使用了 AW_CENTER 标志时该标志被忽略
AW_VER_POSITIVE
自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略
AW_VER_NEGATIVE
自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略
实现过程
(1)创建一个项目,将其命名为Ex01_32,默认窗体为Form1。
(2)在窗体上添加PictureBox控件。
(3)设置PictureBox控件的Image属性。
(4)主要代码如下。
public Form1( )
{
InitializeComponent( );
AnimateWindow(this.Handle, 300, AW_SLIDE + AW_VER_NEGATIVE);//开始窗体动画
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{ //结束窗体动画
AnimateWindow(this.Handle, 300, AW_SLIDE + AW_VER_NEGATIVE + AW_HIDE);
}
举一反三
根据本实例,读者可以开发以下程序。
实现窗体的淡入淡出。
实现窗体从中间扩散显示。
实例033 制作闪烁的窗体
实例说明
Windows系统中,当程序在后台运行时,如果某个窗口的提示信息需要用户浏览,该窗口就会不停的闪烁,这样就会吸引用户的注意。同样,如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪烁的窗体,运行程序,单击【开始闪烁】按钮,窗体就会不停的闪烁,单击【停止】按钮,窗体就会停止闪烁。本例运行效果如图1.33所示。
技术要点
Windows提供了一个API函数FlashWIndow,该函数可以使窗体闪烁一下。FlashWIndow函数在C#中声明如下:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern bool FlashWindow(IntPtr handle, bool bInvert);
参数说明如下。
l handle:表示将要闪烁的窗体。
l bInvert:是否恢复状态。
利用该函数只能使窗体闪烁一下,如果让窗口不停地闪烁,就需要用一个Timer控件每隔一段时间就调用该函数使窗体闪烁。
实现过程
(1)创建一个项目,将其命名为Ex01_33,默认窗体为Form1。
(2)在窗体上添加PictureBox控件用来显示窗体;添加Button、Timer控件用来开始和停止闪烁。
(3)设置PictureBox控件的Image属性。
(4)主要程序代码。
timer1的Tick事件处理代码如下:
private void timer1_Tick(object sender, EventArgs e)
{
FlashWindow(this.Handle,true);
}
【开始闪烁】按钮的单击事件,用来启动窗体闪烁:
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
【停止】按钮的单击事件,用来停止窗体的闪烁:
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
举一反三
根据本实例,读者可以开发以下程序。
利用Visible属性制作一个闪烁的图片。
制作一个闪烁的按钮。
实例034 直接在窗体上绘图
实例说明
含有Graphics对象的控件都能够在其上进行绘图,很多软件就是通过Graphics对象来美化程序的主界面,因为窗体中含有Graphics对象,所以可以将窗体看作一个大画板,一个可以在上面绘图的特殊控件。本例设计了一个简单的绘图软件,该软件就利用了在窗体上绘图的方法,运行本软件可以在窗体上进行绘图。实例效果如图1.34所示。
技术要点
窗体中含有Graphics对象,使用该对象就能够完成大部分绘图功能,Graphics对象已经对Windows底层的一些绘图API进行了封装,使用起来比较方便。下面介绍Graphics对象的常用方法。
Graphics.DrawLine绘图方法用来绘制一条连接由坐标对指定的两个点的线条。其语法结构如下:
public void DrawLine (Pen pen,int x1,int y1,int x2,int y2)
参数说明如下。
l pen:Pen对象,确定线条的颜色、宽度和样式。
l x1:第一个点的x坐标。
l y1:第一个点的y坐标。
l x2:第二个点的x坐标。
l y2:第二个点的y坐标。
实现过程
(1)创建一个项目,将其命名为Ex01_34,默认窗体为Form1。
(2)向Form1窗口中添加GroupBox控件,用作RadioButton控件的容器;添加Button控件用来推出程序。
(3)主要程序代码。
在窗体单元的private中添加变量如下:
int startX,startY;
Graphics g;
单击鼠标事件。具体代码如下:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
startX=e.X;
startY = e.Y;
}
鼠标在窗体中的移动事件。具体代码如下:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
g = this.CreateGraphics( );
Pen p = new Pen(Color.Black, 1);
if(radioButton2.Checked==true)
{
g.DrawRectangle(p, e.X, e.Y, 1, 1);
}
}
鼠标抬起事件。具体代码如下:
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
g = this.CreateGraphics( );
Pen p = new Pen(Color.Black, 2);
if (radioButton1.Checked == true )
{
g.DrawLine(p, startX, startY, e.X, e.Y);
}
}
举一反三
根据本实例,读者可以实现以下功能。
改变画笔的颜色。
在窗体上绘制矩型。
实例035 动画形式的程序界面
实例说明
在很多的程序界面中,都是以菜单或工具栏的形式显示窗体界面,这种显示方式是以静止状态显示的,界面不够生动。下面介绍一个以动画显示窗体界面的设计方法。运行本例,效果如图1.35所示。
技术要点
在该实例中用到了Microsoft Animation Control 6.0(SP4)COM组件,所以要从工具箱“选择项”中将该组件添加到工具箱,然后继续将该组件从工具箱添加到窗体即可。下面介绍本例中用到的相关方法。
AxAnimation.open方法用来播放动画文件。其结构如下:
Public void AxAnimation.open(string bstrFilename)
参数说明如下。
l bstrFilename:将要播放的文件名。
注意:因为使用了AxAnimation类,所以要添加对WMPLib命名空间的引用。
实现过程
(1)创建一个项目,将其命名为Ex01_35,默认窗体为Form1。
(2)在Form1窗体添加PictureBox控件用来显示图片,添加Microsoft Animation Control 6.0 (SP4)COM组件用来播放动画。
(3)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
axAnimation1.Open("Electron.avi");
axAnimation2.Open("zybiao.avi");
axAnimation3.Open("gd.avi");
}
举一反三
根据本实例,读者可以实现以下功能。
制作摸拟网页。
制作动画播放器。
1.10 标题栏窗体
本节主要是对窗体的标题栏进行设置,标题栏是一个显著的位置,在这个位置添加按钮或进行一些个性化的设置,都会给人一种新奇的感觉。通过以下实例的学习,读者将掌握此技术。
实例036 使窗体标题栏文字右对齐
实例说明
窗口标题栏中的文字是窗口的重要说明,该文字可以标示窗口的功能、状态或名称等信息,一般该文字是居左显示的,在本例中设计一个标题栏文字右对齐的窗口。本实例运行结果如图1.36所示。
技术要点
在C# 2.0中实现这一功能非常容易,只需将窗体的RightToLeft属性设置为Yes即可。
Form. RightToLeft属性用来获取或设置一个值,该值指示是否将控件的元素对齐以支持使用从右向左的字体的区域设置,其语法结构如下:
public virtual RightToLeft RightToLeft { get; set; }
l 属性值:RightToLeft值之一。默认为Inherit。
实现过程
(1)创建一个项目,将其命名为Ex01_36,默认窗体为Form1。
(2)为Form1窗体添加背景图片。
(3)设置RightToLeft属性为Yes。
举一反三
根据本实例,读者可以开发以下程序。
利用Timer控件使窗体标题栏的文字进行左右闪动。
制作窗体标题栏滚动播放图片的窗体。
实例037 没有标题栏可义改变大小的窗口
实例说明
隐藏Windows窗口的标题栏之后,窗口只剩下一个客户区域,有点像Panel控件在窗口中的样子,而这样的窗口通常是不能够改变大小的。因为屏蔽其标题栏之后,窗口默认将边框也去除了,本例将用特殊的方法建立一个没有标题栏但是可以改变其大小的窗体。实例运行效果如图1.37所示。
技术要点
窗口的样式是在窗口建立时确定的,在C#中实现窗体没有标题栏但是可以改变大小的窗口,有一个巧妙的方法就是将窗体的Text属性设为空,同时将ControlBox属性设为False。下面介绍一下相关的属性。
ControlBox属性用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控件框,其语法结构如下:
public bool ControlBox { get; set; }
l 属性值:如果该窗体在窗体的左上角显示控件框,则为True;否则为False。默认为True。
实现过程
(1)创建一个项目,将其命名为Ex01_37,默认窗体为Form1。
(2)在Form1窗口中添加Label、Button控件,用来设计界面。
(3)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
ControlBox = false;
}
注意:必须将窗体的Text属性设为空。
举一反三
根据本实例,读者可以开发以下程序。
在窗体显示时最小化。
在窗体显示时最大化。1.11 设置窗体位置
在许多的软件中,都会对窗体的大小、位置和移动进行限定。在不同分辨率的显示器中如何正确显示窗体、如何设置窗体始终在最上面,这些都需要本节的技术。
实例038 设置窗体在屏幕中的位置
实例说明
在窗体中可以设置窗体居中显示,本例通过设置窗体的Left属性和Top属性可以准确设置窗体的位置。运行本例,效果如图1.38所示。
技术要点
设置窗体在屏幕中的位置,可以通过设置窗体的属性来实现。窗体的Left属性表示窗体距屏幕左侧的距离,Top属性表示窗体距屏幕上方的距离。
实现过程
(1)创建一个项目,将其命名为Ex01_38,默认窗体为Form1。
(2)在窗体上添加Label控件;添加TextBox控件用来输入距屏幕的距离;添加Button控件用来设置窗体在屏幕上的位置。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
this.Left = Convert.ToInt32(textBox1.Text);
this.Top = Convert.ToInt32(textBox2.Text);
}
举一反三
根据本实例,读者可以开发以下程序。
根据分辨率的变化动态设置窗体位置。
用Timer控件实时显示窗体位置。
实例039 始终在最上面的窗体
实例说明
Windows桌面上允许多个窗体同时显示,但是只有一个窗体能够得到焦点,当一个窗体得到焦点后在其上面的窗体会被得到焦点的窗体遮挡,得到焦点的窗体会显示在最上层,这样被覆盖的窗体就不能完全的显示给用户,如果该窗体中具有实时性和比较重要的信息时,需要该窗口始终在最上层。本例就实现了此功能,运行本例后,主窗体会始终在桌面的最上面。实例效果如图1.39所示。
技术要点
在其他开发环境中实现窗体始终在最上面比较复杂,但在C# 2.0中实现非常简单,只要将TopMost属性设为True即可。下面介绍一下TopMost属性。
Form.TopMost属性用来获取或设置一个值,指示该窗体是否应显示为最顶层窗体。其结构如下:
public bool TopMost { get; set; }
l 属性值:如果将窗体显示为最顶层窗体,则为True;否则为False。默认为False。
实现过程
(1)创建一个项目,将其命名为Ex01_39,默认窗体为Form1。
(2)为Form1窗体添加背景图片,并设置窗体TopMost属性为True。
举一反三
根据本实例,读者可以开发以下程序。
可以将设为最上层的窗体设置成为一个电子表,以便观看时间。
可以将设为最上层的窗体设置成为一个工作计划表,以便随时提醒自己。
1.12 设置窗体大小
用户打开软件后首先看到的就是窗体和窗体上的控件,如何设置窗体的大小及合理的设置窗体和控件的关系就变得十分重要,下面的实例将介绍这方面的知识。
实例040 限制窗体大小
实例说明
Windows窗体是可以随意改变大小的,然而对于一些要求严格的窗体,开发人员不希望用户随意的改变其大小,例如,定位准确的地图和游戏软件等。遇到这种情况必须对窗口的大小进行一些限制。本例设计一个限制了大小的窗体,用户虽然可以改变其大小,但是,大小的范围是受到限制的。实例效果如图1.40所示。
技术要点
在此C#中实现限制大小非常方便,只要设置窗体的最大和最小范围即可。下面介绍一下相关属性。
Form.MinimumSize属性用来获取或设置窗体可调整到的最小大小,其语法格式如下:
public override Size MinimumSize { get; set; }
l 属性值:Size,表示该窗体的最小大小。
Form.MaximumSize属性用来获取或设置窗体可调整到的最大大小,其语法格式如下:
public override Size MaximumSize{ get; set; }
l 属性值:Size,表示该窗体的最大大小。
实现过程
(1)创建一个项目,将其命名为Ex01_27,默认窗体为Form1。
(2)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
MinimumSize = new Size(200, 200);
MaximumSize = new Size(400, 400);
}
举一反三
根据本实例,读者可以开发以下程序。
在窗体显示时规定其大小。
在窗体运行时规定其大小。
实例041 获取桌面大小
实例说明
获取桌面分辨率可以使用API函数GetDeviceCaps,但API函数参数较多,使用不方便,如何更方便的获取桌面分辨率呢?在本例中,通过读取Screen对象的属性,来获取桌面分辨率信息,以像素为单位。运行本例,效果如图1.41所示。
技术要点
C#中提供了Screen对象,在该对象中封装了屏幕相关信息。可以通过读取Screen对象的相关属性,来获取屏幕的信息,Screen.PrimaryScreen.WorkingArea.Width用于读取桌面宽度;Screen.PrimaryScreen.WorkingArea.Height可以读取桌面的高度。下面介绍一下相关属性。
Screen.PrimaryScreen.WorkingArea属性用于获取显示器的工作区。工作区是显示器的桌面区域,不包括任务栏、停靠窗口和停靠工具栏。其结构如下:
public Rectangle WorkingArea { get; }
l 属性值:一个Rectangle,表示显示器的工作区。
实现过程
(1)创建一个项目,将其命名为Ex01_41,默认窗体为Form1。
(2)在Form1窗体上添加一个Button控件,用来获取桌面大小;添加两个TextBox控件,用来输出所获取的桌面大小。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = Screen.PrimaryScreen.WorkingArea.Height.ToString( );
textBox1.Text = Screen.PrimaryScreen.WorkingArea.Width.ToString( );
}
举一反三
根据本实例,读者可以开发以下程序。
根据显示器的分辨率信息设置窗体大小及位置。
根据显示器的分辨率信息调整窗体界面。
实例042 在窗口间移动按扭
实例说明
窗体中每个可视控件都有所有者和父对象两个重要属性,所有者是控件建立时指定的所属对象,该对象可以是不可视控件,而父对象必须是可视控件。因此可以通过窗体中可视控件的Parent属性来判断控件是否在这个窗体中,还可以用Form.Controls.Add( )方法为窗体添加控件。本例以一个可以在窗口间移动的按钮来演示父对象改变后的运行效果。运行本例,在窗口中单击按钮,按钮就会移动到另外一个窗口中。实例效果如图1.42和图1.43所示。
图1.42 在窗口间移动按钮 图1.43 在窗口间移动按钮
技术要点
可视控件包含一个Parent属性,该属性表示控件的父对象。一般将此属性设置为一个窗口。通过该属性可以控制所属窗体。
实现过程
(1)创建一个项目,将其命名为Ex01_42,默认窗体为Form1。
(2)添加一个窗体,默认窗体的Name属性为Form2。
(3)在Form1窗口中添加一个Button控件。并为Form1和Form2设置背景图片。
(4)主要程序代码。
单击按钮在两个窗体之间移动,具体代码如下:
private void button1_Click(object sender, EventArgs e)
{
if (button1.Parent == this)
{
f.Controls.Add(this.button1);
this.button1.Text = "返回原地";
}
else
{
this.Controls.Add(button1);
this.button1.Text = "开始移动";
}
}
Form1窗体加载时同时显示Form2窗体,具体代码如下:
private void Form1_Load(object sender, EventArgs e)
{
f = new Form2( );
f.Show( );
}
举一反三
根据本实例,读者可以开发以下程序。
试做从一个窗体将控件拖到另一个窗体。
试做用一个窗体控制另一个窗体。
实例043 如何实现Office助手
实例说明
用过Office的人都知道,Office助手是一个非常漂亮的小工具,有了它,即使对Office不太熟悉的用户也可以操作自如。本实例使用C#制作了一个类似Office助手的程序,实例效果如图1.44所示。
技术要点
要实现Office助手效果,需要使用Microsoft提供的第3方控件。在工具箱中单击“选择项”,从弹出的对话框中选择COM组件选项卡中的Microsoft Agent Control 2.0组件并加入工具箱中,然后再添加到窗体中。
实现过程
(1)创建一个项目,将其命名为Ex01_43,默认窗体为Form1。
(2)在Form1窗体上添加一个ListBox控件用来让用户选择人物的动作。
(3)主要程序代码。
声明成员变量及字符串数组,具体代码如下:
IAgentCtlCharacterEx ICCE;
IAgentCtlRequest ICR;
string[] ws = new string[10] { "Acknowledge", "LookDown", "Sad", "Alert", "LookDownBlink", "Search", "Announce", "LookUp", "Think", "Blink"};
为ListBox添加选项的实现代码如下:
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
listBox1.Items.Add(ws[i]);
}
ICR = axAgent1.Characters.Load("merlin", "merlin.acs");
ICCE = axAgent1.Characters.Character("merlin");
ICCE.Show(0);
}
随着选项改变Office表情的实现代码如下:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ICCE.StopAll("");
ICCE.Play(ws[listBox1.SelectedIndex]);
}
举一反三
根据本实例,读者可以实现以下程序。
瑞星助手。
在自己的程序中加入Office助手。
实例044 在关闭窗口前加入确认对话框
实例说明
用户对程序进行操作时,难免会有错误操作的情况,例如不小心关闭程序,如果尚有许多资料没有保存,那么损失将非常严重,所以最好使程序具有灵活的交互性。人机交互过程一般都是通过对话框来实现的,对话框中有提示信息,并且提供按钮让用户选择,例如【是】或【否】。这样用户就能够对所做的动作进行确认。正如前面所说的不小心关闭程序,如果在关闭程序之前提示用户将要关闭程序,并且提供用户选择是否继续下去,这样就大大减少了误操作现象。本例程序中的窗口在关闭时会显示一个对话框,该对话框中有两个按钮【是】与【否】代表是否同意关闭程序操作。实例运行结果如图1.45所示。
技术要点
窗口正要关闭但是没有关闭之前会触发FormClosing事件,该事件中的参数FormClosingEventArgs e中包含Cancel属性,如果设置该属性为True,窗口将不会被关闭。所以在该事件处理代码中可以提示用户是否关闭程序,如果用户不想关闭程序,则设置该参数为True。利用MessageBox参数的返回值可以知道用户所选择的按钮。下面详细介绍一下相关属性。
CancelEventArgs.Cancel属性用来获取或设置指示是否应取消事件的值。该属性结构如下:
public bool Cancel { get; set; }
l 属性值:如果应取消事件,则为True;否则为False。
实现过程
(1)创建一个项目,将其命名为Ex01_44,默认窗体为Form1。
(2)主要程序代码。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("将要要关闭窗体,是否继续?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
举一反三
根据本实例,读者可以实现以下程序。
使窗体的关闭按钮无效。
使窗体关闭出现在托盘中。
实例045 使用任意组件拖动窗体
实例说明
通常将鼠标按住窗口的标题栏才能够拖动窗口,但是,在没有窗口标题栏的情况下如何拖动窗体呢?本例将会利用窗口中的控件拖动窗口,将鼠标放在按钮上然后按住鼠标左键移动鼠标即可拖动窗体。实例效果如图1.46所示。
技术要点
通过控件移动窗体时,需要判断用户的鼠标动作。用户准备拖动窗体时必须在控件上按住鼠标左键,所以应该在鼠标MouseDown事件处理过程中来实现窗体的拖动。当用户在按钮上将鼠标左键按下时,触发MouseDown事件,在该事件处理代码中,MouseEventArgs e的Button属性记录了当前按下的鼠标按钮,如果按键是鼠标左键,则表示可以移动窗口,鼠标移动时,窗体就可以跟着移动了。
实现过程
(1)创建一个项目,将其命名为Ex01_45,默认窗体为Form1。
(2)在Form1窗体上添加两个Button控件,分别用来拖动窗体和关闭窗体。然后设置窗体的背景颜色。
(3)主要程序代码。
声明记录鼠标按下时初始位置的变量,具体代码如下:
private int startX, StartY;
鼠标按下事件处理代码,具体代码如下:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
startX = e.X;
StartY = e.Y;
}
}
鼠标移动事件处理代码,具体代码如下:
private void button1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Left += e.X - startX;
this.Top += e.Y - StartY;
}
}
举一反三
根据本实例,读者可以开发以下程序。
可以用窗体的用户区拖动窗体。
不可以拖动的窗体。
实例046 修改提示字体及颜色
实例说明
如果设置了控件的ToolTip属性,当鼠标移到该控件后,会提示相关的文本,但没有提供对提示字体及颜色的设置属性,如何改变提示文本的样式和字体呢?本例可以设置提示文本的字体及颜色。运行本例,效果如图1.47所示。
技术要点
C# 2.0中提供了ToolTip控件,可以指定关联控件并为每个控件提供提示文本,其中ToolTipTitle属性指定文本提示盒中的文本。下面介绍相关的属性和方法。
(1)SetToolTip方法
使工具提示文本与指定的控件相关联。其语法结构如下:
public void SetToolTip (Control control,string caption)
参数说明如下。
l control:要将工具提示文本与其关联的Control。
l caption:指针位于控件上方时要显示的工具提示文本。
(2)ToolTip.ToolTipTitle属性
获取或设置工具提示窗口的标题。其语法结构如下:
public string ToolTipTitle { get; set; }
l 属性值:包含窗口标题的String。该标题在窗口中作为一行粗体文本显示在标准的工具提示控件说明文本的上方。通常,标题只用于区分窗体上不同类别的控件,或作为较长控件说明的简介。
实现过程
(1)创建一个项目,将其命名为Ex01_46,默认窗体为Form1。
(2)在Form1窗体上添加Button控件用来在其上方显示提示文本;添加ToolTip控件用来设计提示文本。
(3)主要程序代码。
设置提示文本,及提示文本的关联控件,具体代码如下:
private void Form1_Load(object sender, EventArgs e)
{
this.toolTip1.OwnerDraw = true;
this.toolTip1.SetToolTip(this.button1,"设置提示的字体及颜色");
this.toolTip1.Draw += new DrawToolTipEventHandler(toolTip1_Draw);
}
设置文本的提示样式,具体代码如下:
void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
// throw new Exception("The method or operation is not implemented.");
e.DrawBackground( );
e.DrawBorder( );
using (StringFormat sf = new StringFormat( ))
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None;
sf.FormatFlags = StringFormatFlags.NoWrap;
using (Font f = new Font("宋体", 12))
{
e.Graphics.DrawString(e.ToolTipText, f,
SystemBrushes.ActiveCaptionText, e.Bounds, sf);
}
}
}
举一反三
根据本实例,读者可以实现以下功能。
修改任意控件提示文本的样式。
提示时加提示的声音。
1.14 其 他 技 术
本节主要介绍了如何创建和关闭MDI窗体。在大型项目和产品的开发中常常将系统设计为MDI界面。
实例047 如何为MDI类型窗体设置背景图片
实例说明
MDI窗体是一种应用非常广泛的窗体类型,在一个主窗体内包含多个子窗体,子窗体永远不会显示在主窗体的外面。当子窗体不能完全的显示在主窗体中时,主窗体会显示滚动条来调整可视范围,在其他开发环境中为MDI窗体添加背景图片十分困难。但在C# 2.0中实现非常容易。在本例中实现了一个具有背景的MDI窗体。实例效果如图1.48所示。
技术要点
在C# 2.0中直接提供了BackgroundImage 属性,该属性可以直接设置窗体的背景图片。设置IsMdiContainer属性为True可以使窗体成为MDI主窗体。下面详细介绍一下相关属性。
(1)BackgroundImage属性
获取或设置在控件中显示的背景图像。其语法结构如下:
public virtual Image BackgroundImage { get; set; }
l 属性值:一个Image,表示在控件的背景中显示的图像。
(2)Form.IsMdiContainer属性
获取或设置一个值,该值指示窗体是否为多文档界面(MDI)子窗体的容器。其语法结构如下:
public bool IsMdiContainer { get; set; }
l 属性值:如果该窗体是MDI子窗体的容器,则为True;否则为False。默认为False。
此属性将窗体的显示和行为更改为MDI父窗体。当此属性设置为True时,该窗体显示具有凸起边框的凹陷工作区。所有分配给该父窗体的MDI子窗体都在该父窗体的工作区内显示。
实现过程
(1)创建一个项目,将其命名为Ex01_47,默认窗体为Form1。
(2)添加一个窗体,默认窗体的Name属性为Form2。
(3)为Form1窗体中添加背景图片。
(4)设置Form1窗体的IsMdiContainer属性为True,该窗口作为MDI主窗体。
(5)主要程序代码。
private void Form1_Load(object sender, EventArgs e)
{
Form2 f = new Form2( );
f.MdiParent = this;
f.Show( );
}
举一反三
根据本实例,读者可以开发以下程序。
为非MDI窗体制作背景。
为MDI子窗体设定显示区域。