1.创建一个自定义控件

原文请看我个人博客:http://clzf.co/blog.php?id=1

这篇文章是 C#自定义控件开发 系列的第一篇文章 其实如果你看过[GDI+程序设计]这本书的话 我这一系列的文章你也不用看了 因为自定义控件的开发 和 GDI 的很多东西我都是从这本书上学习到的 好了话不多说 我把这本书的上传到了百度网盘 复印版虽然不是很清晰 不过还是能看的

http://pan.baidu.com/s/1qWAWm8c([GDI+程序设计])

下面开始第一篇:如何创建一个自定义控件

我们打开vs新建一个WinForm项目 然后右键工程【添加(Add)】选项里面可以看到有 【用户控件(User Control)】

当我们添加后发现出来了这个东西:

可以看出这东西几乎和窗体设计一模一样 只是少了一个窗体的边框 可以在上面自由的添加控件 而且在我们添加好用户控件的同时 左边的工具栏上呈现出了我们添加好的用户控件

下面我们来为刚才添加的那个用户控件 添加一点代码 我在上面放了一个button 然后双击写了一段代码 弹出一个Hello World

private void button1_Click(object sender, EventArgs e) {MessageBox.Show("Hello World");
}

然后我们从左边把用户控件添加到窗体上运行 然后点击那个button1

其实 这本身是一个没有多大意义的例子 而且在接下来的文章里面 几乎也不会讲到 【用户控件(User Control)】

因为在我的眼里 用户控件 一般用来用作复合控件 也就是把现有的控件放在一起实现一些功能 然后变成一个新的控件 也就是一个控件的集合 比如我们可以做这样一个控件:

假设 我们现在有个程序 xxx管理系统 程序要从数据查询数据上来 由于数据可能很多 所以我们窗体上不可能显示出所有的数据 所以我们可能需要对数据 进行一下分页  而这个分页可能很多窗体上都要用到 所以这个时候我们可以做一个复合控件 然后在需要的窗体上把这个控件加上去 这样就不用在每个窗体上都去拖出同样的一堆控件了 至于这样做 怎么触发一些事件 在之后的文章中介绍 比如上面这个符合控件 我点了跳到最后一页 怎么让添加这个控件的窗体知道 我点下了跳到最后一页

对于 用户控件 这里就暂时讲这么多 因为 接下来的文章中 主要讲直接继承 Control 或者 从现有控件派生一个控件

下面来看另一个创建一个自定义控件的方式 我们新建一个类 然后让他继承 Control 或者你也可以直接 依然添加一个用户控件 然后去修改代码 让他继承 Control

public class MyControl : Control
{}

注意 如果你是直接新建一个类 然后继承 Control 的可能会报错 因为需要引用 System.Windows.Forms 新建类的时候上面引用不会生成这个(我是vs2010 .net 2.0)

如果你是添加的用户控件 然后去修改代码继承 Control 的话不会纯在 System.Windows.Forms 的问题 不过如果有其他问题报错的话 你把报错的代码删除就是了

下面来看看这图:

可以看到 我刚才创建的 MyControl 和 最开始创建的 UserControl1 的图标和普通的类的图标不一样  而UserControl的结构似乎长得有点像 Form的结构 因为 展开下面都有一个 Name.Designer.cs 和 Name.resx 所以正如刚才上面说以 在做用户控件的时候 几乎 和做窗体的时候一样 只是 用户控件没有窗体的边框而已 而MyControl则没有 Name.Designer.cs(可能会有 Name.resx);

还有一个问题 我们双击普通的类文件的时候 能直接看到类的代码 而窗体 还有 刚才创建的用户控件 双击的时候 都能出现窗体设计起  然后双击刚才我创建的 MyControl.cs 出来的尽然是没有见过的东西 是的 直接继承Control不像UserControl或者Form那样 是没有窗体设计器的 UserControl 和 Form 都是容器 在设计时期可以可视化的向其添加子控件 所以他们在设计时可以有设计器 而 Control 没有继承容器控件 不能直接拖一个控件进去 所以也就没有必要需要设计器(以上言论纯属个人YY - -!)(注:如果的类是继承的Control左边工具栏同样会出现你的控件 如果你发现没有或者你新建的类图标还是普通类的图标 可能是vs的延迟你捣鼓两下就行了 如果还是那样 你从其一下vs 一般情况下是不会出现这个问题的 vs检测到你继承了Control或者其他控件 会立马有反映的)

言归正传 就算没有设计器 可以看到 右下角的属性窗口什么的还是可以正常时候的(属性窗口那些都是作为一个控件必备的东西 不要觉得奇怪 为什么继承了一个Control居然有属性窗口 还有那么多东西 其实你可以看到很多属性Text Height Width...和一些事件 Click KeyDown... 这些东西都是你可以直接用的)  现在有个问题 如果我们就这样 啥也不做 把这个控件 添加到窗体上是啥效果 其实你可以看到 如果啥都不做 就这样把控件添加到窗体上去 他默认是一个按钮大小的四四方方的东西 因为我们啥也没有做 所以他大小是默认的 背景色是默认的

下面 我们来添加一段代码 让他有个样子 我们在属性窗口找到 paint 事件 然后写上如下代码:

private void MyControl_Paint(object sender, PaintEventArgs e) {//如果Brushes报错 需要引用 System.Drawing;e.Graphics.DrawString("Hello World", this.Font, Brushes.Red, 0, 0);
}

这段代码的意思就是 在当前控件坐标(0,0)的位置 绘制一段文字"Hello World" 文字的颜色用红色 文字的字体是当前控件的字体(属性窗口可以看到)[对于GDI的一些东西 今后的文章里面不会过多描述 因为这一系列的文章主要讲 控件的开发 如果对GDI不怎么熟悉 建议先去了解一下 或者下载我上传的那本电子书看也可以]

到这里请注意 如果你现在就从左边把控件添加到窗体上 你可能会看不到效果如果你是直接新建类继承Control的话 如果你的代码是类似这样的:

public class MyControl : Control
{private void InitializeComponent() {this.SuspendLayout();// // MyControl// this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyControl_Paint);this.ResumeLayout(false);}private void MyControl_Paint(object sender, PaintEventArgs e) {//如果Brushes报错 需要引用 System.Drawing;e.Graphics.DrawString("Hello World", this.Font, Brushes.Red, 0, 0);}
}

为什么会没有反映? 我们把刚才第一个的UserControl的代码:

public partial class UserControl1 : UserControl
{public UserControl1() {InitializeComponent();}private void button1_Click(object sender, EventArgs e) {MessageBox.Show("Hello World");}
}

在这里 我们看到都有InitializeComponent方法的存在 而这个方法 一般在 Name.Designer.cs 这个文件里面 UserControl 会有这个文件 由于我们直接继承的Control没有这个文件 所以这部分代码自动生成的时候 直接生成到了我们的 类里面 但是这个不是重点 重点是我们没有去调用这个方法、、仔细想想 是不是UserControl 或者 Form里面 我们去查看代码 都有类是

public XXXXXX(){InitializeComponent();
}

都会有这个代码 这个是自动生成的构造器 构造的时候去调用那个方法初始化一些信息 而我们直接继承的Control的类 vs没有为我们生成这样的方法 因为在创建类的时候 vs是不会给我们的类生成构造器的 而vs也不知道我们将把这个类继承Control作为控件使用 然后为它生成一个构造器并调用初始函数  所以你得自己写个构造器然后去调用初始函数就行了

所以一般情况下 我直接继承Control或者其他控件的时候 我都不喜欢用右下角的属性窗口 去做事情 而是直接override 就像:

public class MyControl : Control
{protected override void OnPaint(PaintEventArgs e) {//如果Brushes报错 需要引用 System.Drawing;e.Graphics.DrawString("Hello World", this.Font, Brushes.Red, 0, 0);base.OnPaint(e);}
}

然后现在把控件 添加到窗体上就能看到 红色的 Hello World 了:

第一篇就到这里 虽然现在还没有看到实质性的东西 后面会我也会慢慢写文章弄点有实质性的东西出来 这里只是一个引入 一个开篇而已

1.创建一个自定义控件相关推荐

  1. SAP UI5 应用开发教程之三十二 - 如何创建一个自定义 SAP UI5 控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  2. [WPF自定义控件] 开始一个自定义控件库项目

    1. 目标 我实现了一个自定义控件库,并且打算用这个控件库作例子写一些博客.这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对WPF有更深入的了解. 控件库 ...

  3. Qt创建设计师自定义控件(Qt Designer自定义控件)

    Qt提供了一个Designer界面,使得我们可以自由拖动控件对ui进行布局,但所有的控件都是固定的,如果我们想要自定义一个自己设计的控件,添加到Designer中,可供设计者自由设计.那么可以进行如下 ...

  4. Android自定义控件学习(四)------创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的设计,自定义视图应该: 符合And ...

  5. SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)...

    本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件.此控件界面非常简单,主要涉及的知识点是:   如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBo ...

  6. linux创建一个交换分区,如何创建linux交换分区

    匿名用户 1级 2017-03-26 回答 1.mkswap 把一个分区格式化成为swap交换区: [root@localhost]# mkswap /dev/sda6 注:创建此分区为swap 交换 ...

  7. 创建一个Scalar-valued Function函数来实现LastIndexOf

    昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...

  8. 如何创建一个基础jQuery插件

    如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作 ...

  9. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)

    前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...

最新文章

  1. 阿里云ECS主机自定义进程监控
  2. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
  3. 20201014 《计算感知》第2节课 笔记
  4. 题库 java_java题库
  5. mysql跳过安全_Navicat连接MySQL数据库
  6. Jenkins系列之-—07 集成JIRA
  7. QT 多线程程序设计 -互斥
  8. amp mysql升级_【简单的案例分享,停机10分钟】10204升级CRSamp;amp;DB的PSU至1
  9. OpenCV中用findContours函数出现的问题和解决方法
  10. bash shell for循环1到100
  11. cfile清空文件内容_DBA日常任务清单--定期清理Oracle审计文件
  12. Discuz仿集思街淘宝客粉红色模板源码
  13. Qt开源炫酷界面QCoolPage
  14. 【UOJ 710】魔塔 OL(贪心)(四毛子分块)
  15. DH-SQL(学生信息表-课程表-选课表)
  16. Excel批量调整图片大小适应单元格且整齐排列
  17. 自制密码生成器1.0
  18. react事件 组件设计传参使用
  19. SOLO: Segmenting Objects by Locations 论文学习
  20. JMeter-01-性能测试基础知识介绍

热门文章

  1. qq_seconds.html,qq英语签名
  2. 开源项目推荐:C++/MFC/Qt开发的功能齐全的屏幕截图软件ScreenCatch/Snipaste
  3. DPCRN: Dual-Path Convolution Recurrent Network for Single Channel Speech Enhancement---论文翻译
  4. 缺乏技术专利支撑的小米还能走多远
  5. Unity3d 技巧(8) -PlayMaker 插件自定义扩展 不受局限
  6. photoshop2019教程基础
  7. Directory /opt/journalnode/lagou is in an inconsistent state: Can‘t format the storage directo
  8. Android 高质量开发之崩溃优化,2020-2021字节跳动Android面试真题解析
  9. Django框架学习笔记(一)
  10. Disk Drill 使用教程