浅述WinForm多线程编程与Control.Invoke的应用

浅述WinForm多线程编程与Control.Invoke的应用
浅述WinForm多线程编程与Control.Invoke的应用

VS2008、C#3.0

在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来。一个最直接的方法便是使用多线程。多线程编程的方式在WinForm开发中必不可少。

本文介绍在WinForm开发中如何使用多线程,以及在线程中如何通过Control.Invoke方法返回窗体主线程执行相关操作。

-. WinForm多线程编程

1. new Thread()

新开一个线程,执行一个方法,没有参数传递:

private

void DoWork() {

Thread t =

new Thread(new ThreadStart(this.DoSomething));

t.Start();

}

private

void DoSomething() {

MessageBox.Show("thread start");

}

新开一个线程,执行一个方法,并传递参数:

private

void DoWork() {

Thread t =

new Thread(new ParameterizedThreadStart(this.DoSomething));

t.Start("guozhijian");

}

private

void DoSomething(object o) {

MessageBox.Show(o.ToString());

}

参数定义为object类型。

2. ThreadPool

众所周知,新开一个线程代价是很高昂的,如果我们每个操作都新开一个线程,那么太浪费了,于是,下面使用线程池。

无参数传递:

private

void DoWork() {

ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething));

}

private

void DoSomething(object o) {

MessageBox.Show("thread start");

有参数传递:

private

void DoWork() {

ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoSomething), "guozhijian");

}

private

void DoSomething(object o) {

MessageBox.Show(o.ToString());

}

使用匿名方法更灵活:

private

void DoWork() {

string name =

"guozhijian";

ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o){

MessageBox.Show(name);

}));

}

在匿名代码段里面可以直接访问局部变量,不用在关心参数传递的问题

二. Invoke

1. this.Invoke

现在,在业务线程里面执行完毕,要改变窗体控件的值了,此时,如果直接通过this得到控件的句柄,然后对它进行操作是会抛异常的,.Net WinForm Application里面是不允许这样的操作的。这是,可以调用Invoke方法

2.Invoke方法签名:

object Control.Invoke(Delegate Method)

object Control.Invoke(Delegate Method, params object[] args)

3.使用自定义委托private

void DoWork() {

WaitCallback wc =

new WaitCallback(this.DoSomething);

ThreadPool.QueueUserWorkItem(wc, "Guozhijian");

}

private

delegate

void MyInvokeDelegate(string name);

private

void DoSomething(object o) {

this.Invoke(new MyInvokeDelegate(this.ChangeText), o.ToString());

private

void ChangeText(string name) {

this.textBox1.Text = name;

}

哦,太麻烦了,难道我每次都要定义一个委托啊,这样可不行。

4.使用System.Action:

private

void DoWork() {

WaitCallback wc =

new WaitCallback(this.DoSomething);

ThreadPool.QueueUserWorkItem(wc, "Guozhijian");

}

private

void DoSomething(object o) {

this.Invoke(new Action(this.ChangeText), o.ToString());

}

private

void ChangeText(string name) {

this.textBox1.Text = name;

}

本例传递一个参数,System.Action有很多个重载,可以无参数(非泛型),而最多可以有四个参数,同样采用匿名方法,不使用泛型形式的System.Action,如下:

private

void DoWork() {

WaitCallback wc =

new WaitCallback(this.DoSomething);

ThreadPool.QueueUserWorkItem(wc, "Guozhijian");

}

private

void DoSomething(object o) {

this.Invoke(new Action(delegate() {

this.textBox1.Text = o.ToString();

}));

}

5.使用System.Func

如果Invoke调用主窗体操作之后,还希望在调用完得到一个返回值:

private void DoWork() {

WaitCallback wc = new WaitCallback(this.DoSomething);

ThreadPool.QueueUserWorkItem(wc, "Guozhijian");

}

private void DoSomething(object o) {

System.Func f = new Func(this.GetId);

object result = this.Invoke(f,o.ToString());

MessageBox.Show(result.ToString());

}

private int GetId(string name) {

this.textBox1.Text = name;

if (name == "Guozhijian") {

return 999;

}

else {

return 0;

}

}

result的值为999。

System.Func同样有很多泛形重载,这里不赘述。

6.关于Invoke的拥有者:Control

本文例中都是用this来引用,这里this替换为窗体任何一个控件的句柄都是OK的,因为Control.Invoke含义是将方法委托给拥有该Control的线程去执行。

C# WinForm自定义控件开发实例

C# WinForm自定义控件开发实例 最近做一个图象的采集,需要一个图形的选择控件,但是在.net下没有类似vb中的shape控件,所以考虑了自己写一个控件。下面我将从头创建控件,这个控件主要是用来选择图形的Rectangle,有一下几个属性Color BorderColor:边框颜色,Color BackColor:背景颜色,bool ReSizeble:是否可移动,Rectangle SelectRectangle:选择区域。 打开vs2003(我用的这个版本),新建一个c#控件库,ok,拷贝如下代码到你的代码里。using System;using System.Collections;using https://www.360docs.net/doc/744480151.html,ponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;namespace WindowsExtendedControls{ /// /// 控件/// public class ShapeEx : System.Windows.Forms.Control { /// /// 必需的设计器变量。/// /// private Color _BorderColor=new Color(); private Color _BackColor=new Color(); private bool _ReSizeble; private Point _SelfLocation=new Point(); private Point _MouseLocation=new Point(); private int _SelfWidth; private int _SelfHeight; private int _SelectSelctedIndex;//0-8,0:SizeAll private Rectangle

常用窗体控件

常用窗体控件: String str=””; Foreach(Control item in this.Controls) { If(https://www.360docs.net/doc/744480151.html,.IndexOf(“checkBox”)>0) { CheckBox ck=(CheckBox)Item; If(ck.Checked) { Str=ck.Text+”,”; } } }

高级窗体控件: 1.菜单控件MenuStrip 使用步骤: ①在Windows窗体中添加一个MenuStrip控件 ②单击该控件的Items属性,弹出“项集合编辑器”对话框 ③可以添加MenuItem子项。子项的子菜单 选择其“MenuItem”选项,单击其 DropDownItems属性,弹出相接对话框 ①选中要添加右键功能的Form或者控件,打开控件的设计页面 ②从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页 面上。这时系统就会在这个页面下面自动创建一个contextMenuStrip1控件,如果你想在这个页面添加多个菜单,那么你也可以拖曳多个这种控件到设计页面上。 ③按照你的要求将这些ContextMenuStrip控件改成你需要的名称。然后, 选择需要右 键弹出菜单的页面,比如你当前编辑的页面中有一个DataGrid,一个T reeList,而你想分别为这两个控件添加不同的右键菜单。那么你就可以先选择DataGrid控件,然后在这个控件的属性中找到ContextMenuStrip属性,点击该属性,系统会自动查找你拖曳到当前页面的所有ContextMenuStrip控件并将这些控件罗列在这个属性的下拉菜单中。你可以选择一个你预先定义好的ContextMenuStrip控件。这样就为这个DataGrid控件设置了右键菜单。其他控件也使用同样的方法添加。 ④定义你的菜单,在为控件分配完菜单之后,你就可以定义单个的菜单。这时你可以 选中一个ContextMenu控件。系统会自动在编辑页面的上面现一个可编辑的动态菜

C# WinForm窗体及其控件的自适应

C# WinForm窗体及其控件的自适应 C# WinForm窗体及其控件自适应各种屏幕分辨率 一。说明 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标。 在这里我们只考虑相对于自己窗体的窗口坐标更简单,也就是成比例变化。为了多个窗体共用,我在这里创建一个类AutoSizeFormClass ,1.使用它去记录窗体和其控件的初始位置和大小,2.根据窗体变化了的大小,成比例地实现其控件的水平和垂直方向的变化,也就是自适应。 二。使用方法 使用方法很简单, 1.把自适应的类整体复制到你的工程命名空间里, 然后在需要自适应的窗体中做3步即可: 2.声明自适应类实例。 3.为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件初始位置和大小 4.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应 三。完整代码如下: (一)。自适应窗体的代码: using System; using System.Collections.Generic;

using https://www.360docs.net/doc/744480151.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { //1.声明自适应类实例 AutoSizeFormClass asc = new AutoSizeFormClass(); public Form1() { InitializeComponent(); } //2. 为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件的初始位置和大小 private void Form1_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); } //3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应 private void Form1_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } } }

winform窗体和控件自适应

有时winform窗体的大小会改变,此时窗体上的控件会很混乱,如何可以使控件自适应窗体呢?以 下就是方法: 1、首先在自己的命名空间里先建一个Autosize.cs类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace 自己的命名空间 { class Autosize { public void setTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size; if (con.Controls.Count > 0) setTag(con); } } string[] mytag; public void setControls(float newx, float newy, Control cons) { foreach (Control con in cons.Controls) { if (con.Tag != null) { mytag = con.Tag.ToString().Split(new char[] { ':' }); float a = Convert.ToSingle(mytag[0]) * newx; con.Width = (int)a; a = Convert.ToSingle(mytag[1]) * newy; con.Height = (int)(a); a = Convert.ToSingle(mytag[2]) * newx; con.Left = (int)(a); a = Convert.ToSingle(mytag[3]) * newy; con.Top = (int)(a); Single currentSize = Convert.ToSingle(mytag[4]) * Math.Min(newx, newy); }

WinForm界面布局

WinForm界面布局 Dock&Anchor Dock和Anchor是水火不容的,同时给控件设置Dock和Anchor属性时后设置的会覆盖前面的设置。 Dock 我初接触WinForm的时候发现控件的Width和Height只能是int,不能设置为百分比,那个时候就想子控件如何跟着父控件而变化呢?父控件变大就变大,而且还填满那个区域。甚至以为这个需要通过代码来解决,如是在SizeChanged事件里…… 后来才发现我要的就是Dock给的,Dock是停靠的意思。Dock属性的类型是DockStyle枚举: 1:public enum DockStyle 2:{ 3:None=0, 4:Top=1, 5:Bottom=2, 6:Left=3, 7:Right=4, 8:Fill=5 9:} 默认是None,当为Left的时,就表示子控件停靠在父控件的左边区域,并把左区域填充满: 上图中的Panel总是会停靠在Form的左边区域,不管如何调整Form的高度,它总是能把左边区域填满。Dock麻烦的地方在于多个控件碰到一起时,比如有两个Panel都设置为Left 该怎么办?我们会发现向父控件的Controls集合中添加子控件,越晚添加具有更高的“优先级”(不知道有没有这个说法,这是我杜撰的)。这里的优先级指的是,子控件“优先级”越高,

越靠近父控件边缘,其他子控件就得避让: [我的见解;通过选中控件,一般是pannel,右键选择置为底层,来决定控件间的优先级] this.Controls.Add(this.panel1); this.Controls.Add(this.panel2); Panel2后添加进去,所以它具有更高的优先级,更靠近Form的边缘。这个规则不仅仅对于Dock都设为Left的有效,对Dock属性不同,但是碰到一起的子控件也适用: 1:this.panel1.Dock=DockStyle.Left; 2:this.panel2.Dock=DockStyle.Left; 3:this.panel3.Dock=DockStyle.Top; 4: 5:this.Controls.Add(this.panel1); 6:this.Controls.Add(this.panel2); 7:this.Controls.Add(this.panel3); panel3的Dock设置为Top,最后添加到Controls集合中,所以具有最高的优先级,其他两个panel都得避让:

C#给Winform的button等控件添加快捷键三种方法

C# 给Winform 的button 等控件添加快捷键三种方法 第一种:Alt + *(按钮快捷键) 在大家给button 、label 、menuStrip 等控件设置Text 属性时在名字后边加& 键名就可以了, 比如button1.text= "确定(&O)" 。就会有快捷键了,这时候按Alt+O 就可以执行按钮单击事件。 第二种:Ctrl+* 及其他组合键 在WinForm 中设置要使用组合键的窗体的KeyPreview( 向 窗体注册键盘事件)属性为True; 然后使用窗体的KeyDown 事件(在首次按下某个键时发生). 实例代码: private void ***_KeyDown(object sender, KeyEventArgs e) {

if (e.KeyCode == Keys.F && e.Control) button1.PerformClick(); // 执行单击button1 的动作 注:1、***代表窗体名称,大家可以看一下” Keys ”的枚举参数,以实现自己需要 2、还有一个问题,当使用Ctrl + * 快捷键时,对于焦点在可 写的控件(如TextBox )上时,可能会将* 键值同时输入,则需要加另一句话将Handled 设置为true , 以取消KeyPress 事件。 即: private void ***_KeyDown(object sender, KeyEventArgs e) {

if (e.KeyCode == Keys.F && e.Control) e.Handled = true; //将Handled 设置为true ,指示已经处理过KeyPress 事件button1.PerformClick(); 第三种: 还是以button 为例。给form 添加一个contextMenuStrip1 将其邦定到button 上,假设为button1 。给 contextMenuStrip1 添加一个item ,然后为它设置快捷键(就是你想加在button 上的快捷键),并且将它的Visible 属性设 false 。这样,button1 的快捷键设置成功。

Winform常用控件

1.数据显示:DataGridView(DataGridView 控件提供用来显示数据的可自定义表。使用 DataGridView 类,可以自定义单元格、行、列和边框)。 文本编辑:TextBox(显示设计时输入的文本,它可由用户在运行时编辑或以编程方式更改)。 RichTextBox(使文本能够以纯文本或 RTF 格式显示)。MaskedTextBox(约束用户输入的格式)。 2.信息显示:Label(显示用户无法直接编辑的文本)。LinkLabel(将文本显示为 Web 样式的链接,并在用户单击该特殊文本时触发事件。该文本通常是到另一个窗口或网站的链接)。 StatusStrip(通常在父窗体的底部使用有框架的区域显示有关应用程序的当前状态的信息)。ProgressBar(向用户显示操作的当前进度)。 3.从列表中选择:CheckedListBox(显示一个可滚动的项列表,每项旁边都有一个复选框)。 ComboBox(显示一个下拉式项列表)。DomainUpDown(显示用户可用向上和向下按钮滚动的文本项列表)。ListBox(显示一个文本项和图形项(图标)列表)。ListView(在四个不同视图之一中显示项。这些视图包括纯文本视图、带有小图标的文本视图、带有大图标的文本视图和详细信息视图)。NumericUpDown(显示用户可用向上和向下按钮滚动的数字列表)。TreeView (显示一个节点对象的分层集合,这些节点对象由带有可选复选框或图标的文本组成)。 4.图形显示:PictureBox(在一个框架中显示图形文件(如位图和图标)。 5.图形存储:ImageList(充当图像储存库。ImageList 控件和及其包含的图像可以在不同的应用程序中重用)。 6.值的设置:CheckBox(显示一个复选框和一个文本标签。通常用来设置选项)。CheckedListBox(显示一个可滚动的项列表,每项旁边都有一个复选框)。RadioButton(显示一个可打开或关闭的按钮)。TrackBar(允许用户通过沿标尺移动“滚动块”来设置标尺上的值)。 7.数据的设置:DateTimePicker(显示一个图形日历以允许用户选择日期或时间)。MonthCalendar(显示一个图形日历以允许用户选择日期范围)。 8.对话框:ColorDialog(显示允许用户设置界面元素的颜色的颜色选择器对话框) ColorDialog 显示允许用户设置界面元素的颜色的颜色选择器对话框。 FontDialog 显示允许用户设置字体及其属性的对话框。 OpenFileDialog 显示允许用户定位文件和选择文件的对话框。 PrintDialog 显示允许用户选择打印机并设置其属性的对话框。 PrintPreviewDialog 显示一个对话框,该对话框显示 PrintDocument 组件在打印出来后的外观。 FolderBrowserDialog 显示用来浏览、创建以及最终选择文件夹的对话框SaveFileDialog 显示允许用户保存文件的对话框。 9.菜单控件: MenuStrip 创建自定义菜单 ContextMenuStrip Bitmap 创建自定义上下文菜单。 10.命令: Button Bitmap 启动、停止或中断进程。 LinkLabel 将文本显示为 Web 样式的链接,并在用户单击该特殊文本时触发事件。该文本通常是到另一个窗口或网站的链接。 NotifyIcon 在表示正在后台运行的应用程序的任务栏的状态通知区域中显示一个图标。

C#制作WinForm用户自定义控件实例教程

C#制作WinForm用户自定义控件实例教程 本文将教大家如何使用C#开发WinForm用户自定义控件,自定义控件有好多好处,下面请跟本文一同来学习下吧。 .Nt用户自定义控件继承UserControl类,设计很简单的,像平时在窗体上拖控件一样。 操作步骤: 1. 建立一个工程,添加用户控件。 2.在打开的窗体内输入控件名称,如:"ucButton",按确定按钮。接下来在空白区域拖放3个.Net控件。 如下图:

3.代码 C# code ///

/// C#.Net 设计用户自定义控件 /// /// [ToolboxBitmap(typeof(CustomControl.ucButton), "ucButton.bmp")] public partial class ucButton : UserControl { private bool _IsFocused = false; //标记按钮是否为焦点状态 public ucButton() { InitializeComponent(); this.DoHideFocusedTag(); this.MyCatpionText = https://www.360docs.net/doc/744480151.html,; } private EventHandler _OnButtonClick = null; private string _MyCatpionText = "ucButton1"; /// /// 按钮标题 /// [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] [DefaultValue("ucButton1")] public string MyCatpionText { get { return _MyCatpionText; } set { _MyCatpionText = value; lblCaption.Text = _MyCatpionText; } } /// /// 用户自定义Click事件 /// [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] public event EventHandler OnButtonClick { add { _OnButtonClick = new EventHandler(value); } remove { _OnButtonClick -= new EventHandler(value); } } private void lblCaption_Click(object sender, EventArgs e) { //转移Click事件, 触发用户自定义事件 if (_OnButtonClick != null) _OnButtonClick(this, e); } private void lblCaption_MouseDown(object sender, MouseEventArgs e) { if (_IsFocused) { lblCaption.Font = new Font(lblCaption.Font.FontFamily, lblCaption.Font.Size, FontStyle.Bold); } } private void lblCaption_MouseUp(object sender, MouseEventArgs e) { if (_IsFocused) { lblCaption.Font = new Font(lblCaption.Font.FontFamily, lblCaption.Font.Size, FontStyle.Regular); } } private void ucButton_SizeChanged(object sender, EventArgs e) { lblUnderLine.Top = this.Height - 1; lblUnderLine.Width = this.Width - 15; } /// /// 还原按钮状态 /// public void DoHideFocusedTag() { this.pictureBox1.Image = global::vjsdn.CustomControl.Properties.Resources.GrayTag; this.lblUnderLine.Visible = false; lblCaption.ForeColor = Color.Black; } /// /// 设计按钮为焦点状态 /// public void DoShowFocusedTag() { this.pictureBox1.Image =

Winform常用控件的常用属性

常用控件的常用属性 长用 Name :表示一个控件或者窗体的名称。 Anchor:表示窗体拉大后控件会随这窗体的4个方向随之变化。 BackColor:控件和窗体的背景颜色。 BackgroundImage:窗体的背景图片。 Cursor:鼠标经过控件时,鼠标的图标所发生的变化。 ContextMenuStrip:鼠标单击右键,所出先的菜单。 Dock:表示该控件在窗体的那个位置的停靠。 Enabled:表示该控件是否有用默认值Ture 。选False该控件则没有任何作用。 Font:设置控件里字体的大小、字号、字体、和下划线。 ForeColor:在控件里输入字体时,字体的颜色。(默认值为黑色)。 Location:表示该控件在窗体中的位置。X坐标数值越大则控件会越往右,Y坐标数值越大则控件越往下。 Size:该控件的大小width 表示控件的宽度heigth表示控件的高度。 Visible:是否隐藏该控件。选False控件是看不见的。 Tag: Text:控件上显示的字体。 Form窗体 ControlBox:表示窗体的标题栏中时候有最大化、最小化和关闭的按钮选false则不会看见这些按钮。 FormBorderStyle:表示窗体的边框线的样式和标题栏的样式和标题栏按钮显示方式。 Icon:窗体标题栏左边显示的图片。 MaximizeBox:确认标题栏里是否有最大化按钮。 MinimizeBox:确认标题栏里是否有最小化按钮。 StartPosition:运行窗体时窗体在屏幕前在那个位置显示。 WindowState:运行窗体时,窗体的显示方式(比如全屏幕显示、最小化显示、正常显示)。 Label标签 BorderStyle:表示该标签的边框样式。 Image:在该标签上显示的图片。 ImageAlign:要显示图片以什么方式在标签的背景上显示。 ImageList: TextBox文本框 BorderStyle:表示该文本框的边框样式。 MaxLength:可以输入多少个字符。 MultiLine:是否可以拉大文本框的高度。 PasswordChar:你输入文本框的字体是以什么方式进行显示的。(比如输入¥就全部都显示¥)。

winform界面设计规范

winform界面设计规范 Winform开发一般遵循的原则 窗体类 型 ..................................................................... .............. 2 尺寸比 例 ..................................................................... .............. 3 窗体控件元 素 ..................................................................... ..... 3 Tab键次 序 ..................................................................... ........... 5 快捷 键 ..................................................................... ................... 5 右键菜 单 ..................................................................... .............. 5 区域排 列 ..................................................................... .............. 6 UI开发异常处理..................................................................... 6 执行动作要提 示 ..................................................................... 7 文字表 达 .....................................................................

winform界面设计规范

Winform开发一般遵循的原则 窗体类型 (2) 尺寸比例 (3) 窗体控件元素 (3) Tab键次序 (5) 快捷键 (5) 右键菜单 (5) 区域排列 (6) UI开发异常处理 (6) 执行动作要提示 (7) 文字表达 (7) 颜色使用恰当,遵循对比原则 (8)

窗体类型 我们把UI理解成窗体以及窗体上用户的交互规则。窗体主要包括主界面类型和对话框类型两种。 主界面指应用程序启动后最主要的界面,其生命周期一般与应用程序保持一致。通过菜单或按钮的形式调用其它子界面和执行功能。一般由以下几个部分组成。标题栏,菜单栏,工具栏,目录栏,工作区,信息输出区(栏)。此外很多应用程序中又增加一些漂浮的子窗体以面板的形式附加到主界面中。

对话框一般指应用程序中具有返回结果的窗体。一般表现为模态窗体,包括信息展现部分,信息输入部分和结果选择按钮三部分组成。此外,UI部分除了主窗体和对话框外还有浮动窗体,托盘菜单等方式与 用户交互。 尺寸比例 主窗体尺寸一般在运行期默认最大化,否则遵循纵横比为4:3,16:9为益。对话框除了和主窗体一样的原则外也有3:4(4:3旋转90度)的纵横比,总之窗体的尺寸只要保证纵横比屏幕一致。 当窗体元素太少,比如只有一个文本标签时,可以不遵循该原则,因为保证窗体尺寸纵横比之前首先要确定窗体不能有大范围的空白区域。 窗体控件元素 主窗体一般按菜单栏,工具栏等组成部分分为上中下左右五个分布区(TOP,Client,Bottom,Left, Right,),根据实际需求可能舍去某些分布区。分布区一般由Split Panel控件分隔,这样可以使用户自行调节各个分布区的尺寸大小。注意处在不同分布区控件的Anchor属性,保证当窗体尺寸因鼠标拖动改变时控件尺寸按照分布原则变化。 下表为控件在不同分布区的Achor属性值。

C#中winform窗体常用设置

使用.Net编写Windows程序,对于窗体控制常见项目 1、让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) WindowsDefaultBounds CenterParent 只有在窗体启动前设置才有效。 2、设置窗体的图标 form1.Icon 3、设置该窗体成为多个子窗体的父窗体 form1.isMidContainer = true / false(default) 在设计时使用,一个项目中只能有一个父窗体。 4、指定最大化、最小化按钮的行为 form1.ControlBox = true(default) / false /// 设置是否出现最大化、最小化和关闭按钮 form1.MaxmizeBox = true(default) / false /// 设置最大化按钮是否有效 form1.MinimizeBox = true(default) / false /// 设置最小化按钮是否有效 如果当ControlBox = true MaxmizeBox = false MinimizeBox = false 而HelpButton = true 时就可以看到有个帮助的按钮出现在关闭按钮旁边。 5、窗体如果想显示普通菜单那么需要添加菜单控件MainMenu form1.Menu 选项用于指定使用那个菜单。 如果想动态加载菜单就先准备好要用的几个MainMenu控件,然后到适当时机在运行时改变form1.Menu 的值。 如果要使用快捷菜单,就像窗体中添加ContextMenu控件。然后指定form1.ContextMenu 为这个控

winform自定义控件开发

自定义控件开发 一般而言,Visual Studio 2005中自带的几十种控件已经足够我们使用了,但是,在一些特殊的需求中,可能需要一些特殊的控件来与用户进行交互,这时,就需要我们自己开发新的、满足用户需求的控件。 要开发自己的控件,有几种方法: ?复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。 ?扩展控件(Extended Controls):就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求。 ?自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control 类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。 下面我们就分别给大家介绍这三种方法。 ?复合控件(Composite Controls) 复合控件实际上是控件的集合,类似于堆积木。因此,可以按照用户的需求,把VS 2005工具箱中的控件任意组合起来,形成一个复合控件。在以后使用中,将生成的这个复合控件作为一个控件来对待。 复合控件一般都是从UserControl类派生而来,因此复合控件(用户控件)可以在“UserControl测试容器”中进行测试。 复合控件的创建步骤: 第一步:新建一个Windows控件库项目“CompositeControlDemo”

Winform 控件教案

组合框、选项卡控件和选项卡页面、日期、日历和进度条、滑动条——讲解 按照如下学习目标进行学习: 1、掌握TabControl控件的使用方法包括重要属性,方法和事件的了解。动态生成选项卡,动态为选项卡添加控件。 2、掌握MonthCalender控件的使用。 3、掌握DateTimePicker控件的使用,了解与MonthCalender控件的区别。 4、掌握ComboBox控件的使用,重点掌握其重要方法与重要属性。 第一部分讲解TabControl控件、MonthCalender控件和DateTimePicker控件的的使用。TabControl控件 在这一部分重点让学生了解什么是TabControl,TabControl能做什么。有哪些使用用途引入:我们先来认识一下这个TabControl控件,看看它到底长什么样.

TabContorl概述:Windows 窗体TabControl 显示多个选项卡,这些选项卡类似于笔记 本中的分隔卡和档案柜文件夹中的标签。选项卡中可包含图片和其他控件。您可以使用 该选项卡控件来生成多页对话框,这种对话框在Windows 操作系统中的许多地方(例 如控制面板的“显示”属性中)都可以找到。此外,TabControl 还可以用来创建用于设 置一组相关属性的属性页。 接下来我们看看如何控制TabControl,来让它为我们进行服务。 1)属性介绍: 接下来介绍TabControl中常见的属性,这一部分主要是以控制TabControl 外观和显示特性,主要包括:Alignment、Appearance、HotTrack、Multiline、 1.Alignment控制标签在标签控件的什么位置显示。默认的位置为控件的 顶部。 首先我们来看看TabControl的外观设置,通过Alignment可以控制每一个标签页头的显示顺序。接下来通过编程的方式来设置Alignment属性 来演示效果。 例子: switch(btn.Text) { case"Top": this.tabControl1.Alignment = TabAlignment.Top; break; case"Bottom": this.tabControl1.Alignment = TabAlignment.Bottom; break; case"Left": this.tabControl1.Alignment = TabAlignment.Left; break; case"Right": this.tabControl1.Alignment = TabAlignment.Right; break; default: MessageBox.Show("输入的格式不正确!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } 2.Appearance:控制标签的显示方式。标签可以显示为一般的按钮或带 有平面样式。 刚才展示了如何控制标签页的现实顺序,我们还可以通过Appearance 属性来设置标签页按钮的基本外观。 接下来通过编程的方式来设置TablControl控件来设置外观看看效 果。

WinForm控件开发总结

WinForm控件开发总结(一)------开篇 我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件。在自己开发WinForm控件的时候,没有太多可以借鉴的资料,只能盯着MSDN使劲看,还好总算有些收获。现在我会把这些经验陆陆续续的总结出来,写成一系列方章,希望对看到的朋友有所帮助。今天我来开个头。 其实开发WinForm控件并不是很复杂,.NET为我们提供了丰富的底层支持。如果你有M FC或者API图形界面的开发经验,那么学会WinForm控件可能只需要很短的时间就够了。 自己开发的WinForm控件通常有三种类型:复合控件(Composite Controls),扩展控件(Extended Controls),自定义控件(Custom Controls)。 复合控件:将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。 扩展控件:在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。 自定义控件:直接从System.Windows.Forms.Control类派生出来。Control类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为Control类的OnPaint事件写代码,你也可以重写Con trol类的WndProc方法,处理更底层的Windows消息,所以你应该了解GDI+和Windows API。 本系列文章主要介绍自定义控件的开发方法。 控件(可视化的)的基本特征: 1. 可视化。 2. 可以与用户进行交互,比如通过键盘和鼠标。 3. 暴露出一组属性和方法供开发人员使用。 4. 暴露出一组事件供开发人员使用。 5. 控件属性的可持久化。 6. 可发布和可重用。 这些特征是我自己总结出来,不一定准确,或者还有遗漏,但是基本上概括了控件的主要方面。 接下来我们做一个简单的控件来增强一下感性认识。首先启动VS2005创建一个ClassLi

WinForm控件随窗体改变而改变

关键代码(窗体控件随着窗体大小而改变) 环境VS2010 数据库SQL2008 private void Form5_Load(object sender, EventArgs e) { this.Resize += new EventHandler(Form5_Resize); X = this.Width; Y = this.Height; SetTag(this); } private void setControl(float newx, float newy, Control cons) { foreach (Control con in cons.Controls) { string[] mytag = con.Tag.ToString().Split(new char[] { ':' }); float a = Convert.ToSingle(mytag[0]) * newx; con.Width = (int)a; a = Convert.ToSingle(mytag[1]) * newy; con.Height = (int)a; a = Convert.ToSingle(mytag[2]) * newx; con.Left = (int)a; a = Convert.ToSingle(mytag[3]) * newy; con.Top = (int)a; Single currentSize = Convert.ToSingle(mytag[4]) * newy; con.Font = new Font(https://www.360docs.net/doc/744480151.html,, currentSize, con.Font.Style, con.Font.Unit); if (con.Controls.Count > 0) { setControl(newx, newy, con); } } } Form5_Resize中Form5是对应的窗体的Resize void Form5_Resize(object sender, EventArgs e) { float newx = (this.Width) / X; float newy = (this.Height) / Y; setControl(newx, newy, this); this.Text = this.Width.ToString() + " " + this.Height.ToString(); } private void SetTag(Control cons) {

winform窗体大小

窗体的弹出位置可以由属性StartPosition来指定,默认值有: Manural 自定义,由属性Location指定; CenterScreen 屏幕中央; WindowsDefaultBounds 系统默认位置(但大小为系统默认窗体大小)WindowsDefaultLocation 系统默认位置(大小由属性Size指定) CenterParent 父窗体中央 若自定义窗体显示位置,则属性StartPosition选择Manural,然后指定属性Location的坐标值。 实现窗体在屏幕右下角显示:

运行结果: 窗体FormBorderStyle属性设置为:FixedSingle,再把最大化禁用就可以了使用.Net编写Windows程序,对于窗体控制常见项目 属性: 1、让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) WindowsDefaultBounds CenterParent // 父窗体的中间 只有在窗体启动前设置才有效。 2、设置窗体的图标 form1.Icon 3、设置该窗体成为多个子窗体的父窗体 form1.isMidContainer = true / false(default) 在设计时使用,一个项目中只能有一个父窗体。

4、指定最大化、最小化按钮的行为 form1.ControlBox = true(default) / false /// 设置是否出现最大化、最小化和关闭按钮 form1.MaxmizeBox = true(default) / false /// 设置最大化按钮是否有效 form1.MinimizeBox = true(default) / false /// 设置最小化按钮是否有效 如果当ControlBox = true MaxmizeBox = false MinimizeBox = false 而HelpButton = true 时就可以看到有个帮助的按钮出现在关闭按钮旁边。 5、窗体如果想显示普通菜单那么需要添加菜单控件MainMenu form1.Menu 选项用于指定使用那个菜单。 如果想动态加载菜单就先准备好要用的几个MainMenu控件,然后到适当时机在运行时改变form1.Menu 的值。 如果要使用快捷菜单,就像窗体中添加ContextMenu控件。然后指定form1.ContextMenu 为这个控件。 6、设置窗体的透明度 form1.Opacity 它的值是一个百分数,范围是0~100%,当它等于0时整个窗体就不可见隐藏起来了。当他等于100%时,这个窗体就是个普通窗体。 7、设置是否在任务栏中显示窗体 form1.ShowInTaskbar = true(default) / false 默认值是true,当他设置为false时就从任务栏消失了。通常可以配合NotifyIcon来实现将程序隐藏到系统右下角的系统状态栏。 8、设置是否显示窗体右下角调整大小的手柄 form1.SizeGripStyle = Auto(default) / Show /Hide

相关主题
相关文档
最新文档