自绘制当然少不了好好认识下NMCUSTOMDRAW这个结构体了
c# 中需要自己定义所有结构体

struct NMCUSTOMDRAW
{
    NMHDR hdr;
    int dwDrawStage
}
使用.net c#自绘制ListView控件(基础第二篇)public struct NMHDR

dwDrawStage当前绘制状态 取值及含义
{
    CDDS_POSTERASE 擦除循环结束
    CDDS_POSTPAINT 绘制循环结束
    CDDS_PREERASE 准备开始擦除循环
    CDDS_PREPAINT 准备开始绘制循环
    CDDS_ITEM 指定dwItemSpec,uItemState,lItemlParam参数有效

    CDDS_ITEMPOSTERASE 列表项擦除结束
    CDDS_ITEMPOSTPAINT 列表项绘制结束
    CDDS_ITEMPREERASE 列表项准备开始列表项擦除
    CDDS_ITEMPREPAINT 准备开始列表项绘制
    CDDS_SUBITEM 指定列表子项
}
常用CDDS_PREPAINT 与 CDDS_ITEMPREPAINT = CDDS_ITEM | CDDS_PREPAINT

uItemState当前列表项的状态 取值及含义
{
    CDIS_CHECKED 标记状态 
    CDIS_DEFAULT 默认状态
    CDIS_DISABLED 禁止状态
    CDIS_FOCUS 焦点状态
    CDIS_GRAYED 灰化状态
    CDIS_SELECTED 选中状态
    CDIS_HOTLIGHT 热点状态
    CDIS_INDETERMINATE 不定状态
    CDIS_MARKED 标注状态
}

Message.Result指向状态值的指针,指定系统后续操作,依赖于dwDrawStage:

当dwDrawStage为CDDS_PREPAINT
Message.Result取
{
    CDRF_DODEFAULT 默认操作,即系统在列表项绘制循环过程不再发送NM_CUSTOMDRAW。     
    CDRF_NOTIFYITEMDRAW 指定列表项绘制前后发送消息。
 
    CDRF_NOTIFYPOSTERASE 列表项擦除结束时发送消息。 
    CDRF_NOTIFYPOSTPAINT 列表项绘制结束时发送消息。
}

当dwDrawStage为CDDS_ITEMPREPAINT
Message.Result取
{    
    CDRF_NEWFONT 指定后续操作采用应用中指定的新字体。
 
    CDRF_NOTIFYSUBITEMDRAW 列表子项绘制时发送消息。 
    CDRF_SKIPDEFAULT 系统不必再绘制该子项。
}

相关文章: