博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用.net c#自绘制ListView控件(基础第二篇)

Posted on 2007-12-05 21:04  a-peng  阅读(3724)  评论(0编辑  收藏  举报
自绘制当然少不了好好认识下NMCUSTOMDRAW这个结构体了
c# 中需要自己定义所有结构体

struct NMCUSTOMDRAW
{
    NMHDR hdr;
    int dwDrawStage
}
public struct NMHDR
{
   
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 系统不必再绘制该子项。
}