line控件本来是最简单的一个控件,但它太简单了,以至于不提供我们想要的一些事件,为了增强它的功能,我自己制作了一个line控件,还
制作控件的方法请参看"msdn - visual basic 文档 - 使用visual basic -部件工具指南 - 创建activex部件"中的"创建一个activex控件"与" 【相关文章:自定义 XML 文件在 TreeView】
给她取名叫作mline控件。 【扩展阅读:关于AnsiSting的使用大全】
【扩展信息:ASP.NET用户控件返回事件的方法】
建立activex控件"部分。
vb自带的line控件有x1,x2,y1,y2四个属性,没有left,top,width,height这四个属性,通过调整x1-y2四个属性的值,来改变线条的位置与形状。但,我们的mline控件中只有ltwh这四个属性,所以mline控件的关键在于如何把ltwh四个属性跟x1-y2四个属性联系起来。
很显然,如果mline控件中的线条是从左上角到右下角的话,那么:
a1=left : b1=top : a2=left+width : b2=top+height 这里我用(a1,b1)表示左上角的坐标,(a2,b2)表示右上角的坐标,这样我就可以通过a1-b2来确定控件的区域了,但并不能确定直线的形状,也就是说直线是撇倾斜还是捺倾斜,通过a1-b2无法确定,我们需要一个标志变量来记录这个倾斜值,下面会说到。
好了,a1-b2显然与ltwh是一一对应的,我们可以写出:
left=a1 : top=b1 : wdith=a2-a1 : height=b2-b1 a1=min(x1,x2) : b1=min(y1,y2) : a2=max(x1,x2) : b2=max(y1,y2) 通过上面的关系,我们把x1-y2与ltwh联系起来了。 那么你去做吧,基本上这个线条可以画出来,但不会太精确,在线条接近水平或垂直的时候就会有误差了,出现误差的原因是,控件有一个最小宽度与最小高度!你可以随便建立一个exe工程观察一下常用的控件,他们的height/width最小只能设置到15或者更大一些,而usercontrol
,也就是我们的控件,其height/width最小只能设置到30,所以如果没有考虑到这个因素,做出来的mline控件总会出现误差的,如果你把做出
来的mline控件,以(x1,y1)为圆心,让(x2,y2)绕着它画圆,你会发现线条的一些细微变化,这种变化是不能容忍的。
所以mline控件的重点是要理解这个控件的真实形状,它不仅仅是一个长方形的区域内做一条对角线,而是这样的一个样子:
在它的区域当中,有一片冗余区域,我们不能在这里画线,理由是这个冗余区域正是这个控件的最小区域。这个冗余区域我设置它为一个空心矩形,它与mline控件的整个区域是重合的,它中间的空心区域才是我们画线的地方。空心区域应该是由最小宽度与最小高度决定的,让minwid
th表示最小宽度,minheight表示最小高度,那么空心区域与控件区域的左边界=minwidth/2,右边界=minwidth/2,上边界=minheight/2,下边
界=minheight/2,你应该可以想象出来这个样子。
... 下一页