admin 管理员组

文章数量: 887038


2024年1月5日发(作者:python的replace方法)

C#其实很好学,只要你弄清楚控件。

控件

控件是视窗交互的工具。控件是一种特殊的类,所有控件都继承自l类。这里Control就叫做控件的基类,控件就是Control的派生类。一个类从基类继承,就拥有基类的所有成员(包括:变量(亦称字段),属性,函数(函数亦称方法),事件,运算符)。类之间通过继承关系保证了派生类拥有需要的方法或字段。所以Control的成员就是控件的通性。这里列出了Control的常用成员:

名称

类别

用途

Control

构造函数

用于初始化一个控件

Dispose

释放由 Control 使用的所有资源

方法

Equals

方法

判断控件是否相同

Focus

为控件设置输入焦点

方法

GetContainerControl

方法

返回容器控件

GetType

方法

获取控件类型

RaiseDragEvent

引发适当的拖动事件。

方法

RaiseKeyEvent

引发适当的键事件。

方法

RaiseMouseEvent

引发适当的鼠标事件。

方法

RaisePaintEvent

引发适当的绘画事件。

方法

Refresh

强制重绘自己和任何子控件

方法

ResetBackColor

将 背景色重置为其默认值。

方法

ResetCursor

重置光标

方法

ResetFont

重置字体

方法

ResetForeColor

重置前景色

方法

ResetImeMode

重置输入法

方法

Select

激活控件

方法

Show

向用户显示控件

方法

ToString

控件类名转为字符串

方法

Update

使控件重绘其无效区域

方法

AllowDrop

指示控件是否接受拖放数据

属性

BackColor

获取或设置控件的背景色。

属性

BackgroundImage

获取或设置在控件中显示的背景图像

属性

CanFocus

获取一个值,该值指示控件是否可以接收焦点。

属性

Controls

获取包含在控件内的控件的集合

属性

Cursor

获取或设置当鼠标指针位于控件上时显示的光标

属性

Dock

获取或设置哪些控件边框停靠到其父控件并确定控件属性

如何随其父级一起调整大小。

DoubleBuffered

该值指示此控件是否应使用辅助缓冲区重绘其图面,以属性

减少或避免闪烁

Enabled

该值指示控件是否可以对用户交互作出响应

属性

Focused

该值指示控件是否有输入焦点

属性

Font

获取或设置控件显示的文字的字体

属性

ForeColor

获取或设置控件的前景色

属性

Height

获取或设置控件的高度

属性

Location

获取或设置该控件的左上角相对于其容器的左上角的属性

坐标

Margin

获取或设置控件之间的空间

属性

MousePosition

静态属性

获取鼠标光标的位置(以屏幕坐标表示)。

Name

获取或设置控件的名称

属性

Parent

获取或设置控件的父容器

属性

Size

获取或设置控件的高度和宽度

属性

Tag

获取或设置包含有关控件的数据的对象

属性

Text

获取或设置与此控件关联的文本

属性

该值指示是否显示该控件

属性

Width

获取或设置控件的宽度

属性

BackColorChanged

当 BackColor 属性的值更改时发生

事件

BackgroundImageChanged

事件

当 BackgroundImage 属性的值更改时发生

Click

在单击控件时发生

事件

DoubleClick

在双击控件时发生

事件

DragDrop

在完成拖放操作时发生

事件

GotFocus

在控件接收焦点时发生

事件

KeyPress

在控件有焦点的情况下按下键时发生

事件

LocationChanged

在 Location 属性值更改后发生

事件

LostFocus

当控件失去焦点时发生

事件

MouseClick

在鼠标单击该控件时发生

事件

MouseEnter

在鼠标指针进入控件时发生。

事件

MouseHover

在鼠标指针停放在控件上时发生。

事件

MouseLeave

在鼠标指针离开控件时发生。

事件

MouseMove

在鼠标指针移到控件上时发生

事件

MouseUp

在鼠标指针在控件上并释放鼠标键时发生

事件

MouseWheel

在移动鼠标滚轮并且控件有焦点时发生

事件

Paint

在重绘控件时发生

事件

Resize

在调整控件大小时发生

事件

TextChanged

在 Text 属性值更改时发生

事件

以上是最常用的成员,便于查找,完整列表参考

/zh-cn/library/l_

Visible

静态文本控件Label:

表示控件的文本标签,并提供对访问键的支持。

它是最简单的控件,用于显示文字,其实它不一定是静态的,显示的文字可以随时通过Text属性更改。常用的属性是Font、BackColor、ForeColor、Text、Location、Size、Visible。

超链接文本控件LinkLabel:

Windows 窗体 LinkLabel 控件使您能够向 Windows 窗体应用程序添加 Web 样式的链接。一切可以使用 Label 控件的地方都可以使用 LinkLabel 控件;还可以将文本的一部分设置为指向某个对象或网页的链接。

与Label类似,提供了类似超链接的文字样式,Label也可以设置Click事件,但LinkLabel更容易让人发现它被单击有不同的作用(由于它像超链接的样子)。也可以用作选项,【例】:

新建工程,设计界面如图:修改LinkLabel控件名字:linkOption

选择

修改(Name)属性

改为linkOption

• P.S.以后就用linkOption表示这个控件,在C#代码中控件实例实质上是一个变量,变量类型就是控件的类。这就是这个控件的变量名。由于默认的名称linkLabel1没有实际意义,编程时通常先修改其名字,使其好记。由于是变量名所以命名规则与普通变量没有区别,由“_”或英文字母开头都是合法的,不允许重名。但通常许多控件共同运作来完成一件具体的事,所以通常习惯在控件前面加上小写的类型简称,后跟首字母大写的名称。这是一条基本技巧,以后不再重复介绍。

• 双击linkOption编辑代码

private void linkOption_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

{

= == "On" ? "Off" : "On";

}

• 运行

• 多次单击linkOption查看效果。

这里使用了条件运算符来实现这个功能。

文本框TextBox:表示 Windows 文本框控件。

文本框是提供用户数据输入输出的控件。【例】:求三角形面积

编辑界面如图分别命名为txtA、txtB、txtC、txtArea

直接开始编辑代码:

• 新建函数

private void textBox_Change(object sender, EventArgs e)

{

double a = 0, b = 0, c = 0, p = 0;

try

{

a = ( != "" ? : "0");

b = ( != "" ? : "0");

c = ( != "" ? : "0");

p = (a + b + c) / 2;

= (p * (p - a) * (p - b) * (p - c)).ToString();

}

catch (FormatException) { = "类型错误"; }

}

• 设置txtA、txtB、txtC的Click事件处理函数为textBox_Change:

• 按住Ctrl分别单击txtA、txtB、txtC以同时选择这三个控件

查看事件列表找到TextChange事件

• 选择textBox_Change

• 运行

• 输入一些数字查看运行情况。

还可以修改器PasswordChar属性使其变成密码框,这个属性的类型是char,只可以输入一个字符,用来代替原来显示文字的位置,令其为*或#看看效果吧:

• 编辑界面如图

• 设置其PasswordChar属性,输入一个字符

• 运行

• 输入一些文字看看效果

• 设置为其他值看看:如#、X、●、◆、★、■、§。

P.S.

这只是表面的现象,不影响Text属性的取值,仍然用Text属性取出或写入字符串。

也可以修改其Dock属性为Top或Bottom,文本框会立即保持与窗口同宽:

• 编辑界面如图

• 设置Dock属性为Top:

• 运行

• 改变窗体大小查看效果。

P.S.

你可能觉得这与窗体贴的过分地紧了,最好留一点边距,这也有办法,只需修改窗体的Padding属性,改为8, 8, 8, 8试试。

文本框还有Enable、ReadOnly、Visible属性,分别表示是否禁用文本框(变灰)、是否只读(用户不能修改其内容)和是否可见(设为false就不显示)是一些常用属性,其他控件也有,以后不再重复介绍。

Enable=false的效果

还有一个是MultiLine属性,使文本框可以是多行的效果:

将其设为true

可以访问Lines属性修改其内容。

这时WordWrap属性还可指定它是否自动换行显示

WordWrap=trueWordWrap=false

这样的话显示不全,可更改ScrollBars属性,添加合适的滚动

ScrollBars=HorizontalScrollBars=Vertical

ScrollBars=Both

按钮Button:

表示一个响应 事件的 Windows 按钮控件。

通常在鼠标对其操作(单击、双击等)时产生一些事件,并处理。

【例】:可对上述示例加以修改:

添加按钮如图按钮命名为btnCalc

令=textbox_Change

清空txtA、txtB、txtC的Click处理函数查看代码找到textbox_Change

选中函数名右击

• 鼠标指向“重构(R)”-> “重命名(R)…”,并单击。

• 改名为Calc_Click

• 确定

• 应用

• 运行

• 输入数并单击“Calculate”,查看效果

P.S.

更改已经定义好的函数名、变量名等标识符的名称请使用“重构->重命名”,它将自动为所有的标识符引用改名以匹配新的名字。这里的改名不是必要步骤(5-11步),但为了使实例更直观,避免混淆。

复选框CheckBox控件:

表示 Windows CheckBox。

它经常用于选项,使用非常简单,只需设定Text(显示的文本),根据需要获取或设置Checked值就可以了,这个属性表示是否勾选,为bool型。

【例】闹钟选项设置

• 编辑界面如图

• 使复选框的名字依次为chkSun、chkMon、chkTue、chkWed、chkThu、chkFri、chkSat

• 使按钮名字依次为btnApply、btnCancel

• 添加新的CheckBox[]数组

private CheckBox[] checkBoxes;

• 修改WinForm构造函数:

public Form1()

{

InitializeComponent();

checkBoxes = new CheckBox[]{

,

,

,

,

,

,

};

}

• 双击Apply编辑Click事件处理函数

private void btnApply_Click(object sender, EventArgs e){

string str = "You've selected: ";

foreach (CheckBox cb in checkBoxes) if ( d) str += "nt" + ;

if (str == "You've selected: ") str += "Nothing";

(str);

}

• 双击Cancel编辑Click事件处理函数

private void btnCancel_Click(object sender, EventArgs e)

{

();

}

• 修改WinForm属性

• 运行查看效果

P.S.

第8步设置了Winform的确定和取消按钮(即AcceptButton和CancelButton属性)可以看到按钮的视图效果会有所改变Apply按钮多了个蓝框,表示默认按钮,此时按Enter或Esc分别相当于按下了这两个按钮。这两个属性是专门为对话框按钮设置的简便方式。

这里建立了复选框的数组,用foreach语句遍历。注意:对象数组与数值数组有所不同,如果用已经定义的对象来初始化数组,那么元素与对应的对象完全相同(共用了一块内存区)任一一个的改动,会影响另一个的值。数值数组则仅仅把数值传了过去。两个对象的等于或不等运算是比较他们的内存地址是否相同,而不是每一个属性是否相同。对对象的操作需要多加以考虑

复选框还有第三种“待定”的状态,以前叫三态复选框,三种状态是通过CheckState属性获得的:

效果

Checked属性

CheckState属性

True

Checked

True

False

Indeterminate

Unchecked

单选框RadioButton:

当与其他 RadioButton 控件成对出现时,使用户能够从一组选项中选择一个选项

单选框相对复选框较复杂一些,因为用户只能选一个,要把前一个选择的清除;如果有几组单选框,就更复杂。这就需要一个范围来约束单选框的行为,如果只有一组,它可以正常工作,WinForm会自动清除前一个选项。如果有多组,就需要容器控件来区分组别。

其中GroupBox是比较常用的。如图:

这样不需要代码来控制其行为。

由于只有一个选项,所以一般用主动传值的方式。

【例】选择国籍

编辑界面如图单选框无需改名,按钮命名为btnOK、btnCancel

添加全程变量

private string str = "Nothing";

• 创建新函数

private void radio_Click(object sender, EventArgs e)

{

str = ((RadioButton)sender).Text;

}

• 编辑OK按钮Click事件:

private void btnOK_Click(object sender, EventArgs e)

{

("You've selected: "+str);

}

• 编辑Cancel按钮Click事件:

private void btnCancel_Click(object sender, EventArgs e)

{

();

}

• 选择全部的单选框

编辑Click事件运行看看效果

数字框NumbericUpDown:

这是一种特殊的输入框,专门用来输入数字,通过Value属性获得其decimal型的值。使数据的输入更加方便。右侧有两个按钮可以让数字增加或减少。

【例】汇率换算

编辑界面如图命名数字框为nudDollar和nudRMB

命名按钮btnD2R、btnR2D

• 编辑两个数字框的属性为如图

• 属性栏下方有解释编辑btnD2R的Click事件

所以属性的用途不再介绍。

private void btnD2R_Click(object sender, EventArgs e)

{

= *(decimal)6.8352;

}

• 编辑btnR2D的Click事件

private void btnR2D_Click(object sender, EventArgs e)

{

= / (decimal)6.8352;

}

• 运行

下拉菜单ComboBox:

它可使用户从一定的范围内选择一项。当有大量的选项时,单选框就不实用用了,这样做太复杂。就应该使用下拉菜单。但当只有少量选项时还是用单选框对于用户更容易操作。

下拉菜单是一个集合类,下面还是给出一个选国籍的程序

【例】选择国籍

编辑界面如图下拉菜单改名comNation

找到属性,单击右侧按钮输入数据(每一行作为下拉菜单的一个项,也就是集合的一个元素)•

private void comNation_SelectedIndexChanged(object sender, EventArgs e)

{

("You've selected: "+ng());

}

• 运行

可以看到用下拉菜单更加简便,几乎不用多少代码来管理控件行为,随时取值就行了。

然而下拉菜单还提供了大量的函数,可以动态的管理这些元素。

确定

双击下拉菜单进入comNation_SelectedIndexChanged函数的编辑

图像容器PictureBox:

PictureBox可以装点你的WInForm,也可以根据需要显示一些图片,让程序看起来跟动态化,互动效果更好。使用PictureBox也十分容易,主要更改其Image属性,这属性属于Image类的。一般需要从程序资源中调取图片,这个会在例子下加以介绍。

【例】显示图片

• 拖拽出一个PictureBox控件

• 右击控件

单击选择图像从项目资源文件中导入图片

单击项目资源文件单选框单击导入

选择一张图片

打开

单击确定

• 图像导入成功了,

看看属性

可以运行看看效果

这貌似是一个变量名的样子,与工程文件在同一个命名空间中。其实可以找到他。

• 在解决方案资源管理器中找到Properties展开

• 打开(这就是资源文件),它内部是xml文件,与C#代码一起运作,这个机制就比较复杂了。

可以看到刚刚添加的图片就在里面

以后也可以通过这个界面来维护添加的资源,资源不仅可以是图片,也可以是声音,文字

【例】在WinForm初始化时通过代码装载图片

• 拖拽出一个PictureBox

• 按前面的例子向资源文件导入一张图片(此处添加了叫apple的图片)

• 双击窗体进入窗体的Load事件编辑代码

private void Form1_Load(object sender, EventArgs e){

= ; //根据实际添加图片资源名称

}

• 运行看看效果吧

进度条ProgressBar:

掩码文本框MarkedTextBox:

进度条是一个使用起来十分简单的控件主要改变其Maximun、Minimun、Value属性来简单的调整外观视图。

掩码文本框则是通过掩码来确定用户输入特定格式的文字。

下面例子中同时用到两种控件来实现一个比较直观的定时器。

【例】定时器

拖拽出一个掩码文本框、一个按钮和一个进度条修改名字为maskText、btnSet、progressBar

设置属性

选择时间格式确定——这时掩码文本框的外观已经改变:

设置属性为100,可看到进度条满格设置d属性为False

在拖拽一个工具箱->组件->

改名timer

设置Form的AcceptButton=btnSet

添加全局变量

DateTime dt = new DateTime(), st = new DateTime();

双击btnSet以编辑Click事件

private void btnSet_Click(object sender, EventArgs e)

{

switch ()

{

case "Set":

try

{

dt = (DateTime)teText();

st = ;

d = true;

ly = true;

= "Pause";

}

catch

{

= 100;

d = false;

dt = new DateTime();

st = new DateTime();

ly = false;

= "Timer";

}

break;

case "Pause":

d = false;

ly = false;

= "Set";

break;

}

}

• 双击timer,编辑事件

private void timer_Tick(object sender, EventArgs e)

{

if ((dt - ).TotalMilliseconds >= 200)

{

= (int)(((dt - ).TotalMilliseconds / (dt -

st).TotalMilliseconds) * 100);

= "Seconds Left: " + ((dt - ).TotalSeconds,2);

}

else

{

d = false;

("Time Over!");

= "Set";

dt = new DateTime();

st = new DateTime();

= 100;

= "Timer";

}

}

• 运行看看效果。

P.S.

这个定时器可能会提前200ms内报时,前面有一句

if ((dt - ).TotalMilliseconds >= 200)

的判断,提前了200ms以提高稳定性,可以减小后面的值提高定时器精度,但不建议设为0

月历MonthCalendar:

这个控件提供了一个简单的月历可以通过SelectRange属性来获得选择的日期范围

它可选择多个连续的日期

【例】显示2010年第一季度的节气

设计界面如图命名月历控件为calendar,静态文本控件命名为info

设置e=false

设置calendar属性如图添加全程变量

修改Form1构造函数

Dictionary dict = new Dictionary();

public Form1()

{

InitializeComponent();

(new DateTime(2010, 1, 5), "小寒");

(new DateTime(2010, 1, 20), "大寒");

(new DateTime(2010, 2, 4), "立春");

(new DateTime(2010, 2, 19), "雨水");

(new DateTime(2010, 3, 5), "惊蛰");

(new DateTime(2010, 3, 21), "春风");

}

• 双击calendar编辑DateChanged事件

private void calendar_DateChanged(object sender, DateRangeEventArgs e)

{

string str = ;

e = Value(ionStart, out str);

= str;

}

运行

更换不同的日期看看效果,选构造函数中初始化字典变量的日期会在info显示节气

日期选择下拉菜单DateTimePicker:

月历是很方便的日期选择控件,不需要类型转换,也比掩码文本框更人性化,但它占程序的面积过大,这种情况下可使用日期选择下拉菜单,节省面积,需要的时候展开选择日期。他的使用方法与月历控件差不多。这个控件只可以选择一个日期。

【例】显示2010年第一季度的节气

编辑界面如图

命名日期选择下拉菜单为picker,命名静态文本控件info

• 添加全程变量

Dictionary dict = new Dictionary();

• 修改Form1构造函数

public Form1()

{

InitializeComponent();

(new DateTime(2010, 1, 5), "小寒");

(new DateTime(2010, 1, 20), "大寒");

(new DateTime(2010, 2, 4), "立春");

(new DateTime(2010, 2, 19), "雨水");

(new DateTime(2010, 3, 5), "惊蛰");

(new DateTime(2010, 3, 21), "春风");

}

• 双击picker编辑DateChanged事件

private void picker_ValueChanged(object sender, EventArgs e)

{

string str = ;

e = Value(, out str);

= str;

}

• 运行

• 更换不同的日期看看效果,选构造函数中初始化字典变量的日期会在info显示节气

富文本编辑框RichTextBox:

设置g如图设置t如图设置y=80%(此属性是窗体不透明度)

设置如图拖拽富文本编辑框

这是一个比TextBox更容易显示多媒体文件的文本框。它默认就是多行文本的。

用它来保存文件也非常方便。

【例】笔记本

(留边距)

(总在最上)

设置其属性Dock=Fill双击Form1编辑Load事件

private void Form1_Load(object sender, EventArgs e)

{

try { le(pPath + ""); }

catch { le(pPath + ""); }

}

选中Form1

找到事件FormClosing双击编辑此事件

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

le(pPath + "");

}

运行

输入一些文字

关闭程序

• 再次运行,可以看到文字仍然保留在上面

其原因就在于它在程序关闭时创建了一个文件来保存信息。

保存工程后在下面的路径可以找到这个文件

项目文件夹.S. 这个文件可以用写字板或Word打开这个控件可以显示多种颜色的文本,可以设定Rtf属性。这是这个文件的实际文本。

【扩展】在上一个例子的基础上显示Rtf属性的变化(必须先完成上一个例子)编辑界面如图•

设置=None

添加按钮

设置为 &Highlight P.S.

前面&用来给首字母加下划线

添加文本框

设置ine=True P.S.允许多行文本

设置ap=False P.S.禁止自动换行

设置ly=True P.S.使其只读

设置Bars=Both P.S.设置滚动条

设置rderStyle=FixedSingle P.S.禁止窗体改变大小

重新安排控件位置,直到上图的样子

拖拽一个Timer设置Enable=True

双击timer1

编辑其Tick事件

private void timer1_Tick(object sender, EventArgs e)

{

= ;

}

• 双击button1编辑Click事件

private void button1_Click(object sender, EventArgs e)

{

ionBackColor = lue;

}

运行看看效果

可以选择一定的文字,点击息。由此实现了不同颜色的显示。

,同时注意下面的文本框的变化,其中的代码就记录了富文本编辑框中文本的颜色等信

网页浏览器控件WebBrowser:

这个控件提供网页的浏览支持

【例】简单的内嵌搜索

编辑界面如图所示命名文本框txtKey、按钮为btnSearch、浏览器控件为browser

设置为Search

双击Form1编辑代码(为browser设定主页,发生Load后导航到这个网址)

private void Form1_Load(object sender, EventArgs e)

{

te("");

}

• 双击btnSearch编辑Click事件

private void btnSearch_Click(object sender, EventArgs e)

{

te("/search?go=&form=QBLH&filt=all&qs=n&sc=1-6&q="+);

}

运行

在txtKey输入一些文字,按旁边的按钮搜索

你会发现输入中文出现乱码,这涉及到URL编码的问题可作如下修改,以支持中文

【扩展】支持中文的搜索(必须完成以上步骤)

• 添加引用集:

• 在解决方案资源管理器中右击引用

• 点击添加引用

• 向下拉动滚动条,找到命名空间• 点击确定

• 添加using指令

using ;

• 双击btnSearch修改Click事件

private void btnSearch_Click(object sender, EventArgs e)

{

te("/search?go=&form=QBLH&filt=all&qs=n&sc=1-6&q=" +

ode());

}

运行

输入一些中文并搜索

列表框ListBox:

列表框可以显示一列信息,可以选择。

【例】计算平均数

编辑界面如图命名文本框text、按钮btnAdd、btnClear、btnCalc、列表框list

双击btnAdd编辑代码

private void btnAdd_Click(object sender, EventArgs e)

{

if ( != )

{

try

{

(());

}

catch (FormatException) { }

= ;

}

}

• 双击btnCalc编辑代码

private void btnCalc_Click(object sender, EventArgs e){

if ( != 0)

{

double sum = 0, count = 0;

foreach (object o in )

{

sum += ((double)o);

count++;

}

= (sum / count).ToString();

}

else = ;

}

• 双击btnClear编辑代码

private void btnClear_Click(object sender, EventArgs e)

{

();

}

运行

复选列表框CheckedListBox:

复选列表框与列表框相比只是在每个列表项前加了一个复选框,可以用于一些比较情况复杂的场合。

【例】多个定时器

编辑界面如图

并且添加一个和定时器

命名进度条progress、按钮btnAdd和btnDel、掩码文本框mask、复选列表框chklist、定时器timer

设置al=200

设置=True

建立新的结构

public struct TimerData{

public DateTime StartTime;

public DateTime StopTime;

public TimerData(DateTime startTime, DateTime stopTime)

{

ime = startTime;

me = stopTime;

}

public override string ToString()

{

double s = ((StopTime - ).TotalSeconds, 2);

string str="At " + Day;

if(s>=60)return str+" ; Time left "+(StopTime - );

else return str+" ; Seconds left "+s;

}

}

• 双击btnAdd编辑Click事件

private void btnAdd_Click(object sender, EventArgs e){

try

{

(new TimerData(, (DateTime)teText()), true);

ext();

}

catch { }

}

• 双击btnDel编辑Click事件

private void btnDel_Click(object sender, EventArgs e){

if (edItem != null) (edItem);

}

双击timer编辑Tick事件

private void timer_Tick(object sender, EventArgs e){

h();

for (int i = 0; i < ; i++)

{

TimerData td = (TimerData)[i];

if ((me - ).TotalMilliseconds < 200)

{

bool t=mChecked(i);

(td);

= 0;

if (t) ("Time Over! At " + ng());

}

}

try

{

if (edItem != null)

{

TimerData td = (TimerData)edItem;

= (int)(((me - ).TotalMilliseconds /

(me - ime).TotalMilliseconds) * 100);

}

else if ( != 0)

{

TimerData td = (TimerData)[0];

= (int)(((me - ).TotalMilliseconds /

(me - ime).TotalMilliseconds) * 100);

}

}

catch { = 0; }

}

• 运行

托盘区图标NotifyIcon:

这是一个常用的控件,系统任务栏的最右侧即托盘区(也称通知区)

托盘区图标控件使窗体可以在那里创建一个图标。本节将在上一个例子的基础上加以改进,用托盘区图标的气泡提示代替消息框。

【扩展】气泡提示(必须先完成上一节)

• 拖拽一个托盘区图标

• 命名为icon

• 改变属性:

• 单击右侧的按钮

选择合适的图标(*.ico文件)打开,若导入成功如图设置nTipIcon=Info

设置为Timer

修改事件

private void timer_Tick(object sender, EventArgs e)

{

h();

for (int i = 0; i < ; i++)

{

TimerData td = (TimerData)[i];

if ((me - ).TotalMilliseconds < 200)

{

bool t=mChecked(i);

(td);

= 0;

if (t)

{

//("Time Over! At " + ng());//改动处

nTipTitle = "TimeOver!"; //气泡初始化

nTipText="At " + ng();

lloonTip(2000);

}

}

}

try

{

if (edItem != null)

{

TimerData td = (TimerData)edItem;

= (int)(((me - ).TotalMilliseconds /

(me - ime).TotalMilliseconds) * 100);

}

else if ( != 0)

{

TimerData td = (TimerData)[0];

= (int)(((me - ).TotalMilliseconds /

(me - ime).TotalMilliseconds) * 100);

}

}

catch { = 0; }

}

• 为g事件添加处理函数(在退出时清除托盘区图标)

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

e = false;

}

• 运行看看效果吧

列表视图控件ListView树视图控件TreeView

这两个控件效果如图,这两个控件不太常用,实例篇幅也比较长,学习较困难,这里暂不介绍。

工具提示ToolTip:

这个控件比较简单,主要更改Text属性效果如图;如果某个控件有ToolTip属性,只需将这个属性指向需要的ToolTip控件。这样鼠标悬停与控件上就会显示工具提示。

定制C#TextBox控件中只允许输入数字的解决方法

2008-10-14 17:31

定制C#TextBox控件中只允许输入数字的解决方法

作者:HuLihui

最近看到一些关于TextBox中限制只允许输入数字的博文,结合笔者前段时间修改完善的开源数值文框TNumEditBox控件,介绍一个解决方法。

在定制的TextBox控件中,如果只允许输入数字,需要考虑如下三种情况:

正常按键输入的字符,包括西文、中文字符等

通过键盘快捷键方式贴入的文本,即Ctrl+V操作

通过上下文关联菜单的Mouse操作贴入的文本,即”粘贴“操作

在探讨的同类文章中,多数只考虑了第1种情况,忽略得了第2、3种常见的操作。本文探讨的处理方法核心思路是重载事件OnKeyPress()和两个法ProcessCmdKey()与WndProc(),并把Ctrl+V、关联菜单的Paste操作统一到键盘录入操作中,从而在OnKeyPress()屏蔽掉非数字键。

1、重载键盘事件OnKeyPress()

键盘输入的字符可以通过重载TextBox控件的OnKeyPress()事件处理,见如下代码:

///

/// 屏蔽非数字键

///

protected override void OnKeyPress(KeyPressEventArgs e)

{

ress(e);

if (ly)

{

return;

}

// 特殊键, 不处理

if ((int)r <= 31)

{

return;

}

// 非数字键, 放弃该输入

if (!t(r))

{

d = true;

return;

}

}

2、重载命令键处理方法ProcessCmdKey()

可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法(),但可以通过控件的WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码:

///

/// 捕获Ctrl+V快捷键操作

///

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

{

if (keyData == (Keys)) // 快捷键 Ctrl+V 粘贴操作

{

election();

string text = t();

for (int k = 0; k < ; k++) // can not use

{

// 通过消息模拟键盘输入, ()静态方法不行

SendCharKey(text[k]);

}

return true;

}

return sCmdKey(ref msg, keyData);

}

///

/// 通过消息模拟键盘录入

///

private void SendCharKey(char c)

{

Message msg = new Message();

= ;

= WM_CHAR;

= (IntPtr)c;

= ;

c(ref msg);

}

3、重载消息处理方法WndProc()

可以在定制TextBox控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码:

public class CustomTextBox: TextBox

{

tMenu = new ConTextMenu(); // 创建无内容菜单对象

}

由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板ClipBoard中的内容,最后通过()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey()中模拟键盘输入函数SendCharKey()。见如下代码:

///

/// 捕获Mouse的Paste消息

///

protected override void WndProc(ref Message m)

{

if ( == WM_PASTE) // 选择上下文菜单的"粘贴"操作

{

election();

(t()); // 模拟键盘输入

}

else

{

c(ref m);

}

}

4、消除选择ClearSelection()、删除字符DeleteText()

还必须分析前面代码中的函数。其中,函数ClearSelection()用以清除当前的选择文本,即清除edText;函数DeleteText()则删除当前字符。注意其中的技巧,就是转换Delete键操作为BackSpace操作。此外,DeleteText()函数还需要确定当前的ionStart值。具体代码如下:

///

/// 清除当前TextBox的选择

///

private void ClearSelection()

{

if (ionLength == 0)

{

return;

}

int selLength = ;

ionStart += ; // 光标在选择之后

ionLength = 0;

for (int k = 1; k <= selLength; k++)

{

Text();

}

}

///

/// 删除当前字符, 并计算SelectionStart值

///

private void DeleteText(Keys key)

{

int selStart = ionStart;

if (key == ) // 转换Delete操作为BackSpace操作

{

selStart += 1;

if (selStart > )

{

return;

}

}

if (selStart == 0 || selStart > ) // 不需要删除

{

return;

}

if (selStart == 1 && == 1)

{

= "";

ionStart = 0;

}

else // selStart > 0

{

= ing(0, selStart - 1) +

ing(selStart, - selStart);

ionStart = selStart - 1;

}

}

5、结语

上述内容是从笔者的开源数值型数据编辑控件TNumEditBox中修改删减而来的,该控件考虑的情况比只允许数字输入要复杂得多,感兴趣者可以参考并指正。需要指出,TNumEditBox的核心思路来自免费的Delphi控件PBNumEdit和开源的C#控件BANumEdit。作为回报(giveback),笔者也将TNumEditBox开源并发布到CodeProject。。

using System;

using c;

using ;

using ;

namespace WindowsApplication1

{

public class CustomTextBox : TextBox

{

private const int WM_CHAR = 0x0102; // 字符消息

private const int WM_PASTE = 0x0302; // 上下文菜单"粘贴"消息

public CustomTextBox() { }

///

/// 捕获Mouse的Paste消息

///

protected override void WndProc(ref Message m)

{

if ( == WM_PASTE) // 选择上下文菜单的"粘贴"操作

{

election();

(t()); // 模拟键盘输入

}

else

{

c(ref m);

}

}

///

/// 捕获Ctrl+V快捷键操作

///

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

{

if (keyData == (Keys)) // 快捷键 Ctrl+V 粘贴操作

{

election();

string text = t();

for (int k = 0; k < ; k++) // can not use

{

// 通过消息模拟键盘输入, ()静态方法不行

SendCharKey(text[k]);

}

return true;

}

return sCmdKey(ref msg, keyData);

}

///

/// 屏蔽非数字键

///

protected override void OnKeyPress(KeyPressEventArgs e)

{

ress(e);

if (ly)

{

return;

}

// 特殊键, 不处理

if ((int)r <= 31)

{

return;

}

// 非数字键, 放弃该输入

if (!t(r))

{

d = true;

return;

}

}

///

/// 通过消息模拟键盘录入

///

private void SendCharKey(char c)

{

Message msg = new Message();

= ;

= WM_CHAR;

= (IntPtr)c;

= ;

c(ref msg);

}

///

/// 清除当前TextBox的选择

///

private void ClearSelection()

{

if (ionLength == 0)

{

return;

}

int selLength = ;

ionStart += ; // 光标在选择之后

ionLength = 0;

for (int k = 1; k <= selLength; k++)

{

Text();

}

}

///

/// 删除当前字符, 并计算SelectionStart值

///

private void DeleteText(Keys key)

{

int selStart = ionStart;

if (key == ) // 转换Delete操作为BackSpace操作

{

selStart += 1;

if (selStart > )

{

return;

}

}

if (selStart == 0 || selStart > ) // 不需要删除

{

return;

}

if (selStart == 1 && == 1)

{

= "";

ionStart = 0;

}

else // selStart > 0

{

= ing(0, selStart - 1) +

ing(selStart, - selStart);

ionStart = selStart - 1;

}

}

}

}

我们在使用C# TextBox进行开发操作的时候经常会碰到C# TextBox的使用,那么C# TextBox的使用有没有一些常用的技巧呢?如C# TextBox换行的处理,其实就是一些常用的操作,那么这里就向你介绍几个我们常见的需求以及解决方法。

一、关于C# TextBox全选的判断:

• int SelectLength=ionLength;//获取选中的字符长度

• if (SelectLength == ) {//判断是否全部选中

• ("你已经选中");

• }

二、关于C# TextBox换行、设置光标位置、随文本滚动

◆C# TextBox换行

• += e;

如何在多行TextBox中写入文本时实现换行?由于Windows系统中,回车符需两上字符。因此方法是使用rn标记,如

• Label="Calculation " ":.......SUMrn";

• Text(Label);

另外更有一个办法是用e的方法,能够兼容Windows和Linux系统。

◆C# TextBox设置光标位置到文本最后

• ionStart = ngth;

◆C# TextBox随文本滚动

• ToCaret();

如何在多行TextBox中用滚动条,使添加文本后自动滚动显示到最后一行?方法是使用ScrollToCaret方法,自动滚动到插入符的位置,如:

• Text(Label);

• ToCaret();

那么对于C# TextBox常用操作的内容就向你介绍到这里,希望对你了解和学习C# TextBox的使用有所帮助。


本文标签: 控件 属性 设置