NSWindow的风格一直只有两种,很难看。Panel倒是有种HUD风格的,但window没有,毕竟window和panel的titile大小还是不一样的,网上有关于HUDWindow的代码,不过那是把window的titlebar给隐藏掉,自己画上三个button和右下角可以resize的东东,如果用这个window来弹出sheet的话会很诡异的出现……
就是sheet从window的最上面弹出来了,底层window看不到titlebar了~
@@AL@.*
NSWindow在设置成Texture模式之后可以设置背景色,不过这是单色,渐进色设置不了。最简单的方法就是先给window设置背景色,再覆盖上一层NSView来填充content的颜色,不过这样不是浑然一体的,每个window都要这样搞的话还是很麻烦的。 krUtOVI
所以只能从被apple隐藏起来的方法里找办法了~所以class-dump出来看看~ ij ?7MP
你会发现在NSWindow.h中绘制界面的函数几乎没有,不想那些继承与NSView的控件一样,那么多私有的绘制方法。那window是怎样绘制的呢。 w\)K0RN
仔细观察,你会发现NSWindow有很多扩展类,而且window功能性的东西是非常多的,所以它的重绘肯定是委托给别人来做了(这一点通过获取NSWindow的closebutton可以知道,那三个button都不是标准的NSButton,而是 NSThemeButton?记不太清楚了)。经过查找可以发现函数
非常可疑,而且dump出来的类有一个叫做NSThemeFrame的,查看它的类方法,哈哈,发现了吧,全是跟window有关的绘制方法。
suY47DCX)
jr=9.=jI8k
所以接下来的事情就很简单了,写一个类继承 NSThemeFrame *'>_X X
P_(8+)ud-
PVIOe}N
那么需要重写哪些函数呢~我们的目标是重画TitleBar,具体窗体的内容不需要重画,因为反正有一个NSView要覆盖在上面的,所以一个方法就足够了,废话少说,上代码 )9hqd
Lc{AB!Br
r fqwxr45h
这样你就有一个属于自己自定义的TitileBar的window了~ KN}#8.'>3
当然你自己实现的画还可以区分HUD啊,Texture啊啥的风格来重画~ ;z'&$#pA
当然你也可以通过重写
来画背景。
h.edb6
到这里可以说重绘NSWindow已经完成了,但是怎样通过styleMask来控制它的重绘呢,怎样创建一个IBPlugin来在IB里拖出你自己的window呢,怎样为这个window设置一个你自己的contentview呢? |'h (S|
且听下(下下?)回分解~先讲完重绘,再讲创建IBPlugin。 CD&a_-'z$K
8 0tA5AP
这里给出KAGradient的代码(支持10.4/10.5/10.6)很简单的一个工厂模式,为了使用接口一致,所以堆NSGradient做了封装~_KAGradient在10.5/10.6有performance问题~ 7m2iL#5[
#Zdh<.
NNt n
T8S&9BM7
[+\He/M6
nt2b}u>*
*y4DK6OFe
Ic'D# m
T\gs
sVh)Ofn
2hHRitt36
|>ztx}\
Mi.#x_

NSWindow在设置成Texture模式之后可以设置背景色,不过这是单色,渐进色设置不了。最简单的方法就是先给window设置背景色,再覆盖上一层NSView来填充content的颜色,不过这样不是浑然一体的,每个window都要这样搞的话还是很麻烦的。 krUtOVI
所以只能从被apple隐藏起来的方法里找办法了~所以class-dump出来看看~ ij ?7MP
你会发现在NSWindow.h中绘制界面的函数几乎没有,不想那些继承与NSView的控件一样,那么多私有的绘制方法。那window是怎样绘制的呢。 w\)K0RN
仔细观察,你会发现NSWindow有很多扩展类,而且window功能性的东西是非常多的,所以它的重绘肯定是委托给别人来做了(这一点通过获取NSWindow的closebutton可以知道,那三个button都不是标准的NSButton,而是 NSThemeButton?记不太清楚了)。经过查找可以发现函数
|
jr=9.=jI8k
所以接下来的事情就很简单了,写一个类继承 NSThemeFrame *'>_X X
|
PVIOe}N
那么需要重写哪些函数呢~我们的目标是重画TitleBar,具体窗体的内容不需要重画,因为反正有一个NSView要覆盖在上面的,所以一个方法就足够了,废话少说,上代码 )9hqd
|
r fqwxr45h
这样你就有一个属于自己自定义的TitileBar的window了~ KN}#8.'>3
当然你自己实现的画还可以区分HUD啊,Texture啊啥的风格来重画~ ;z'&$#pA
当然你也可以通过重写
|
到这里可以说重绘NSWindow已经完成了,但是怎样通过styleMask来控制它的重绘呢,怎样创建一个IBPlugin来在IB里拖出你自己的window呢,怎样为这个window设置一个你自己的contentview呢? |'h (S|
且听下(下下?)回分解~先讲完重绘,再讲创建IBPlugin。 CD&a_-'z$K
8 0tA5AP
这里给出KAGradient的代码(支持10.4/10.5/10.6)很简单的一个工厂模式,为了使用接口一致,所以堆NSGradient做了封装~_KAGradient在10.5/10.6有performance问题~ 7m2iL#5[
|
NNt n
|
[+\He/M6
|
*y4DK6OFe
|
T\gs
|
2hHRitt36
|
Mi.#x_
|