最近忙于美化界面,然而wince上面提供的功能比桌面上要少的多,网上可供选择的控件也少的可怜(后来发现还是有些的,没有调研就没有发言权啊!:()。好在功夫不负有心人,借鉴别人的代码,也给我倒腾出带图片的按钮、不规则形状按钮、可在每行中显示图片的listctrl。希望最近有时间可以把这些整理出来写成博客,这次先不提这。这里要说的让人迷惑的Custom Draw与Owner draw。
可能有不少人对于这两个概念不怎么了解,或者没有听说过,更不用说它们有什么区别了!不幸的是,我之前也是其中一个...
从字面上来看,custom draw应该可以解释成定制式的绘制,而owner draw可以表达为自定义绘制。那么先看看何谓定制?通俗的说,就是
- 改变控件的某些属性(控件的背景色),然后让windows来处理绘制的工作。
- 只想自己绘制控件的某些部分,让windows来处理其他的部分。
- 完全自己来绘制整个控件,那么告诉windows什么都不用做。
说到这,owner draw,可以等同于上面说的第三种情况,就是你必须处理绘制控件的所有工作。所要做的工作更多,更复杂,所花费的时间也更多。因而custom draw是首选,没办法了,再选owner draw--喜欢没事找事?...
那么custom draw如何绘制和通知windows你的决定呢?这就必须要处理NM_CUSTOMDRAW消息。接收该消息的函数原型如下:
void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
其中参数pNMHDR包含有控件的窗口句柄,id等,当然重要的是包含了当前所处的绘制阶段信息,总共有4个阶段:
你可以在相应的阶段进行绘制工作,并通知windows要处理哪些工作,那么如何通知呢?通过参数pResult。
可能你觉得奇怪,这就结束了?本来我是打算根据看的博客原文详细翻译成中文的,可惜被抢先了。那么不如只概要的总体上描述,毕竟不管原文还是翻译的文章都比较长。有兴趣深究的可以看下面的链接:
原文: http://www.codeproject.com/KB/list/lvcustomdraw.aspx?msg=875581
翻译: http://blog.csdn.net/dylgsy/article/details/818550