java 用户控件_C#自定义控件VS用户控件

C#中自定义控件VS用户控件大比拼

1 自定义控件与用户控件区别

WinForm中,

用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件

自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件

2 要开发自己的控件的几种方法[1]

复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。

扩展控件(Extended Controls):就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求。

自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。

3 示例:Clock User Control[1]

源代码

Steps:

1. 新建一个Windows控件库项目(从UserControl派生)

2. 添加一个Timer控件,并设置属性(Enable=True, Interval=1000)和事件 (Ticker=Time1_Tick)

private void timer1_Tick(object sender, EventArgs e)

{

this.Time = DateTime.Now;

Refresh();

}

3. 重写OnPaint事件,绘制用户界面

f307968451b37eadd525b8da37f93c28.png

图1 重写OnPaint事件,绘制用户界面

#region draw clock

private void UserClock_Paint(object sender, PaintEventArgs e)

{

Graphics dc = e.Graphics;

Pen pn = new Pen(ForeColor);

SolidBrush br = new SolidBrush(ForeColor);

initCoordinates(dc);

DrawDots(dc, br);

DrawHourHand(dc, pn);

DrawSecondHand(dc, pn);

DrawMinuteHand(dc, pn);

}

public void initCoordinates(Graphics dc)

{

if (this.Width == 0 || this.Height == 0) return;

dc.TranslateTransform(this.Width / 2, this.Height / 2);

dc.ScaleTransform(this.Height / 250F, this.Width / 250F);

}

public void DrawDots(Graphics dc, Brush brush)

{

int iSize;

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

{

if (i % 5 == 0)

{

iSize = 15;

}

else

{

iSize = 5;

}

dc.FillEllipse(brush, -iSize / 2, -100 - iSize / 2, iSize, iSize);

dc.RotateTransform(6);

}

}

public virtual void DrawHourHand(Graphics grfx, Pen pn)

{

GraphicsState gs = grfx.Save();

grfx.RotateTransform(360.0F * Time.Hour / 12 + 30.0F * Time.Minute / 60);

grfx.DrawLine(pn, 0, 0, 0, -50);

grfx.Restore(gs);

}

public virtual void DrawMinuteHand(Graphics grfx, Pen pn)

{

GraphicsState gs = grfx.Save();

grfx.RotateTransform(360.0F * Time.Minute / 60 + 6.0F * Time.Second / 60);

grfx.DrawLine(pn, 0, 0, 0, -70);

grfx.Restore(gs);

}

public virtual void DrawSecondHand(Graphics grfx, Pen pn)

{

GraphicsState gs = grfx.Save();

grfx.RotateTransform(360.0F * Time.Second / 60);

grfx.DrawLine(pn, 0, 0, 0, -100);

grfx.Restore(gs);

}

#endregion

4. 生成用户控件

5. 测试用户控件

创建WinForm应用程序,在Toolbox添加Tab "User Control",再往其中拖入第4步中生成的自定义控件的dll文件。再把Toolbox中的用户控件“UserControlClock”拖到界面“Form1”中,如下图所示。

81ca6d49a79ad1bf88211357fcd3b4e0.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java FileDescriptor sync()方法与示例

FileDescriptor类sync()方法 (FileDescriptor Class sync() method) sync() method is available in java.io package. sync()方法在java.io包中可用。 sync() method is used to synchronize all the system buffer with the underlying device. sync()方法用于将所有系统缓冲…

windows 7资源管理器崩溃解决方法

最近被频繁的资源管理器explorer崩溃搞得几乎生活不能处理&#xff0c;一打开带有视频的文件夹&#xff0c;就explorer崩溃&#xff0c;要疯了。 日志中含有mpc_mtcontrol.dll 查来查去&#xff0c;没有一个确定的答案&#xff0c;baidu&#xff0c;google都没用&#xff0c;最…

03-对图像进行数值计算和加权融合

数值计算 import cv2img_1 cv2.imread(E:\Jupyter_workspace\study\data/beyond.png) img_2 cv2.imread(E:\Jupyter_workspace\study\data/water2.png)img_1_1 img_1 10 img_1[:2,:,0]#输出前两行就行 img_1_1[:2,:,0]#[h,w,c] img_2[:2,:,0]#[h,w,c](img_1 img_2)[:2,:,…

SQL Server存储过程(procedure)应用

用户反映&#xff0c;系统操作日志会使用数据库快速增大&#xff0c;情况可参考下图&#xff0c; 问题分析&#xff0c;整个系统每个页面&#xff0c;都有写记录用户操作代码&#xff0c;修改或禁用这个代码&#xff0c;看来是不可能的。 在原有系统参数表添加一个选项&#xf…

Opencv一维直方图的绘制

下面是我参考《opencv3编程入门》写的绘制一维直方图的代码 using namespace cv; using namespace std; #define byte uchar #define TYEPE_GRAY 0 #define TYEPE_RGB 1 /*--------------------------绘制RGB三色一维直方图-------------------------------------*/ Mat My_R…

Java类class forName()方法及示例

类类forName()方法 (Class class forName() method) forName() method is available in java.lang package. forName()方法在java.lang包中可用。 forName() method is used to return the class object for the Class with the given class_name. forName()方法用于返回具有给…

04-图像的阈值操作

对图像的阈值操作 import cv2 import matplotlib.pyplot as pltimg cv2.imread(E:/Jupyter_workspace/study/data/cat.png,1) ret, thresh1 cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret, thresh2 cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret, thresh3 c…

java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

本文转自&#xff1a;https://juejin.im/post/59e6c1f26fb9a0451c397a8c本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章将同步到我的个人博客&#xff1a;…

详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名

数据库名、实例名、数据库域名、全局数据库名、服务名&#xff0c;这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。 一、数据库名什么是数据库名&#xff1f;数据库名就是一个数据库的标识&#…

颜色缩减 -利用指针、迭代器、动态地址实现访问像素

为什么要使用颜色缩减 在对单通道图像进行处理时&#xff0c;像素的可能值为256个&#xff0c;但处理多通道时&#xff0c;像素的处理就会相当麻烦&#xff0c;其实用这些颜色中具有代表性的一小部分就可以达到同样的效果&#xff0c;所以颜色空间缩减就可以派上用场了。一个信…

setlenient_Java日历setLenient()方法与示例

setlenient日历类setLenient()方法 (Calendar Class setLenient() method) setLenient() method is available in java.util package. setLenient()方法在java.util包中可用。 setLenient() method is used to set or unset lenient status of date or time interpretations. s…

PowerShell_9_零基础自学课程_9_高级主题:静态类和类的操作

哈哈&#xff0c;昨天弄了个ubuntu 11.10在虚拟机上运行&#xff0c;发现11.10界面非常绚丽&#xff0c;但是其需要的系统资源非常多&#xff0c;我虚拟机设定内存为512M&#xff0c;1个CPU4个核心&#xff0c; 进入以后发现根本动不了&#xff0c;因此今天我就下载了一个Fedor…

05-图像的平滑处理(不同的滤波操作)

对图像进行平滑处理实则就是对图像进行滤波操作罢了 每张图片都有若干个像素点所构成&#xff0c;滤波操作上就是将照片上的某些部分像素点进行修改从而达到平滑的效果 先展示一下原图 import cv2 img cv2.imread(E:\Jupyter_workspace\study\data/test1.png)cv2.imshow(te…

js删除mysql记录_(DELETEUPDATE)修改、删除数据记录_MySQL

有时&#xff0c;希望除去某些记录或更改它们的内容。DELETE 和 UPDATE 语句令我们能做到这一点。用update修改记录UPDATE tbl_name SET 要更改的列WHERE 要更新的记录这里的 WHERE 子句是可选的&#xff0c;因此如果不指定的话&#xff0c;表中的每个记录都被更新。例如&#…

C++设计模式之Abstract Factory模式

一、功能   提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 二、结构图类厂最基本的结构示意图如下&#xff1a; 在实际应用中&#xff0c;类厂模式可以扩充到很复杂的情况&#xff0c;如下图所示&#xff1a; 三、优缺点 优点&#xff1…

数字图像处理小练习存档1

小练习的题目&#xff1a; 1、读取一张图&#xff0c;分解RGB三个通道 /************练习1**********************/ int main() {Mat img1 imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度图if (img1.empty()){printf("Could not find the imag…

UIImage 压缩

1.改变图片大小 -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize {// Create a graphics image contextUIGraphicsBeginImageContext(newSize);// Tell the old image to draw in this new context, with the desired// new size[image drawInRect:CG…

06-对图像进行腐蚀操作

形态学中的腐蚀操作一般处理的图像数据为二值的 cv2.erode(img,kernel,iterations 1) kernel表示拿多大的卷积核去腐蚀 iterations表示迭代次数 可以将一些带有毛毛的图像去毛毛化 原图 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)…

Java BufferedReader skip()方法与示例

BufferedReader类skip()方法 (BufferedReader Class skip() method) skip() method is available in java.io package. skip()方法在java.io包中可用。 skip() method is used to skip the given number of bytes of characters (n_bytes_of_char) from this BufferedReader. s…

mysql gtid binlog_MySQL之-四步实现BinLog Replication升级为GTIDs Replication的代码实例

1、将Master和Slave服务器都设置为read-onlymysql>SET global.read_onlyON;2、将Master与Slave服务器都停下来service mysql stop3、开启GTIDs开启GTIDs需要在master和slave服务器上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(在MySQL 5.6.9之前是…