在Window上所有的组件都是用画出来的,所以redraw的观念应该没什么问题。如果你想自订Control,这表示目前现有的组件已经无法提供你所要的功能。
这也证明事情很大条,你必须要去用Graphic去画一大堆Control的图形,还要管理Mouse click时图形要如何变化。光是画这些图你就已经很靠背了。
所以,除非到山穷水尽的地步,不然不要干这种事。
自订Control要注意以下几点事项:
1.继承Composite。选择继承Composite就表示可能会有其它人继承你的Control。
2.继承Canvas。选择继承Canvas就表示未来不会有人再继承你的Control。
3.覆写(Override)computeSize()的方法,该方法形式如下:
public Point computeSize(int wHint, int hHint, boolean changed);
先说明一下此方法是作用。
一般SWT Control,可以指定Size(尺寸)和Location(位置)。例如:
SWTControl.setSize(100, 100);
SWTControl.setLocation(10, 10);
但是某些情况下,我们希望SWT Control的Size是能够依照内容所占的比例而自动设定,这时我自只要呼叫SWT Control的pack()方法。Control就会自动配置尺寸。
请注意, SWT Control凭什么自动判断Control的尺寸 ?
答案就是,SWT Control会去呼叫computeSize()来计算尺寸的大小。
讲到这里你也应该很清楚computeSize()的作用。所以你之所以实作computeSize()方法,就是为了让SWT Control能够自动计算SWT Control的尺寸。
再来先绍介参数(Parameter)
wHint:此参数全名叫Width Hint,这样你应该可以看出一点弊端。「宽度暗示」,也就是说,当你希望computeSize()计算之后的宽度(Width)能够是自己指定的值,而不要经由computeSize()去计算,那么你就可以指定你所想要的值。我猜你不知我在讲三小,举例说明比较容易:
Point resultSize = SWTControl.computeSize(100, SWT.DEFUALT);
System.out.println("Width:" + resultSize.x);
System.out.println("Height:" + resultSize.y);
得到的结果
Width:100 // 因为这个是我所指定的值,所以computeSize()不会变更它
Height:23 // 而这个结果是我未指定(设成SWT.DEFUALT),就会经过computeSize()计算出结果
我想,智障也看的懂我想表达的东西,你再看不懂,也只好去撞墙了。
hHint:同上。
changed:这是为了快取而设的参数值。因为并不是每次SWT Control去呼叫computeSize()时,SWT Control的尺寸都会变更,有时候明明尺寸没有变更,却还要再去计算一次,那是一件很耗效能的事情。
所以,当你接到的changed是true时,则表示尺寸已经变更,需要再重新计算一次。相对的,如果接到false,就表示尺寸没变更,只要把上一次的结果值回傅回去就可以了,省下不必要的计算。