先罗嗦一下:
我有个习惯,就是使用common control的时候尽量避免自己重绘.这样做有许多好处:
1.编程简单,不容易出问题.
2.不会因为界面增加程序体积.
3.能够自动拥有系统提供的主题和特效.
当然有的时候会出现点问题.
比如Tracebar控件.我一直认为这样的控件本应该设计得更好.下面是两个版本的截图.
两者绝对都符合我的风格:至简.


但是前者的两个Tracebar怎么看都不像是播放器的控件.
就连以界面简洁为特征之一的Foobar2000都进行了一定的重绘.

好了,兜了一圈直入正题.- -~
捕获NM_CUSTOMDRAW这个Notify(我不知道这个应该怎么翻译,消息?肯定不是.通知?通知好像有别的地方用到了....)
通常被认为正确的使用方法是这样:
case NM_CUSTOMDRAW:
lpDraw = (LPNMCUSTOMDRAW)lParam;
switch(lpDraw->dwDrawStage) {
case CDDS_PREPAINT:
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
switch(lpDraw->dwItemSpec) {
case TBCD_CHANNEL:
....
return CDRF_SKIPDEFAULT;
case TBCD_THUMB:
....
return CDRF_SKIPDEFAULT;
}
break;
}
break;
要注意的主要是返回值,尤其是CDDS_PREPAINT消息的返回值.
具体的细节像TBCD_CHANNEL和TBCD_THUMB我就不说了,我不是MSDN. ^_^
可以说这个和通常的重绘没有两样.但是Tracebar自身设计的问题,却有点让程序员难以驾驭.

这个问题是通常大家使用Tracebar控件常见的问题.面对这种问题.我至今没有找到较好的解决方案.
强制进行背景重绘,强制窗口覆盖等方法通常都有效,却都不是通用的解决方案.最终我在BinPlayer的解决方案是自己绘制了这些"类"Tracebar控件...毕竟以后要支持PNG皮肤,很多东西都要做到很通用.
No comments:
Post a Comment