c# 中需要自己定义所有结构体
struct NMCUSTOMDRAW
{
NMHDR hdr;
int dwDrawStage
}
{
public IntPtr hwndFrom;
public int idFrom;
public int code;
}
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
public struct NMCUSTOMDRAW
{
public NMHDR hdr;
public int dwDrawStage;//当前绘制状态(***)
public IntPtr hdc;//绘制操作所使用的设备环境
public RECT rc;//被绘制的矩形区域
public int dwItemSpec;//列表项的索引
public int uItemState;//当前列表项的状态
public int lItemlParam;//当前列表项的绑定数据
}
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 系统不必再绘制该子项。
}