自定义控件的本质
自定义控件的本质只有两点:
- 重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围。缺点是Region无法抗锯齿,自定义的Region范围是有锯齿的,无法消除;此外新的Region还会和绘制的背景产生1像素的白边(在圆角或图形拐角部分),且几乎无法有效的消除。【后续会介绍FillRegion填充区域,而不是绘制图形与Region产生'白边'】
- 重绘图形,在原有Region【矩形区域】范围内,重绘不同的图形(圆角、多边形、图片等)作为背景,因为绘制图形时可以实现抗锯齿,因此看起来像无锯齿控件一样。本质上是在固定Region内绘制的尽可能大的无锯齿图形,因此需要注意设置透明背景(透明自定义图形外的Region部分)。
如果再加一条的话,自定义控件还有一点,就是:
- 在原有控件上通过设置图片/图标、背景颜色、布局大小、多个不同控件组合等,同时结合重绘图形(或重绘Region区域),实现一定的自定义。
在其实现方法上,都是使用GDI/GDI+进行绘制,并添加一些默认的功能、事件或属性;组合控件也可能不需要使用GDI+绘制;还有一些基于基础控件的扩展控件,在原控件的基础上进行一些扩展,也用不到绘制方法。
赋值新Region和直接重绘图形的区别
无论是在控件的Paint事件方法中,还是通过继承控件在OnPaint方法中,重绘控件的两种方式:赋值新Region和直接重绘图形,在进行绘制时都有两个相同的区别。
- 仅仅赋值新Region原则上不需要再重新绘制背景颜色、文本等;
- 只要发生了绘制(无论直接在原Region上绘制图形、还是赋值了新Region后绘制图形),都需要再重新绘制文本。即绘制图形会覆盖原来的内容,需要背景、文本都进行绘制
不要使用e.ClipRectangle
、不要直接修改Region
无论是在继承控件的OnPaint方法中,还是在控件的Paint事件方法中,都不要使用参数e.ClipRectangle
作为控件重绘的区域(绘制图形或重新创建Region),原因之前文章已经介绍。
另外,对于赋值新Region,不要直接在代码中实现,原因和上面一样,在发生控件大小、位置、拖动等变化时,会发生显示错乱或不完全的部分(直接赋值Region则固定了Region区域),正确的做法还是要在Paint事件或OnPaint方法中。
Region区域无法反锯齿
没有最佳圆角最佳自定义控件的实现,除非可以创建无锯齿Region。
无法对Region反锯齿
【目前来说,自定义控件时新建Region没有最优雅或最优实现】,任何创建新Region的方法都是有锯齿的【个人所知
标签:控件,圆角,自定义,Region,roundBorderSize,本质,绘制 From: https://www.cnblogs.com/soliang/p/18442259