看流星社区

 找回密码
 注册账号
查看: 1783|回复: 0

custom draw

[复制链接]

该用户从未签到

发表于 2014-3-25 10:12:45 | 显示全部楼层 |阅读模式
不同控件发送WM_NOTIFY消息(lParam里面包含NM_CUSTOMDRAW通知码)时,lParam指向的结构体可

能是不同的,既可以是NMCUSTOMDRAW,也可以比结构体NMCUSTOMDRAW大,但第一个成员必

须是NMCUSTOMDRAW,如TreeView控件发送NM_CUSTOMDRAW通知码时,lParam指向的是NMTVCUSTOMDRAW结构体,这个结构体的第一个成员是NMCUSTOMDRAW结构体

typedef struct tagNMCUSTOMDRAWINFO {
    NMHDR hdr;
    DWORD dwDrawStage;//表示当前绘制阶段
    HDC    hdc;
    RECT   rc;
    DWORD dwItemSpec;
    UINT   uItemState;
    LPARAM lItemlParam;
} NMCUSTOMDRAW;

typedef struct tagNMTVCUSTOMDRAW
{
    NMCUSTOMDRAW nmcd;
    COLORREF     clrText;
    COLORREF     clrTextBk;
#if (_WIN32_IE >= 0x0400)
    int iLevel;
#endif
} NMTVCUSTOMDRAW;


dwDrawStage成员可以有以下值:

CDDS_POSTERASE:清除循环完成后
CDDS_POSTPAINT:绘制循环完成后
CDDS_PREERASE:清楚循环开始时
CDDS_PREPAINT:绘制循环开始时

CDDS_ITEM:指明dwItemSpec, uItemState, and lItemlParam成员有效。
CDDS_ITEMPOSTERASE:清除an item后
CDDS_ITEMPOSTPAINT:绘制an item后
CDDS_ITEMPREERASE:清除an item前
CDDS_ITEMPREPAINT:绘制an item前
CDDS_SUBITEM:Version 4.71. Flag combined with CDDS_ITEMPREPAINT or CDDS_ITEMPOSTPAINT if a subitem is being drawn. This will only be set if





如果dwDrawStage成员==CDDS_PREPAINT,有以下返回值:

CDRF_DODEFAULT:自己画,不发送NM_CUSTOMDRAW

CDRF_NOTIFYITEMDRAW:绘制items前、后都发送NM_CUSTOMDRAW

CDRF_NOTIFYPOSTERASE:清除an item后发送NM_CUSTOMDRAW

CDRF_NOTIFYPOSTPAINT:绘制an item后发送NM_CUSTOMDRAW

CDRF_NOTIFYSUBITEMDRAW:Version 4.71. The control will notify the parent when a list view subitem is being drawn


如果dwDrawStage成员==CDDS_ITEMPREPAINT,有以下返回值:

CDRF_NEWFONT:为item指定新的字体

CDRF_SKIPDEFAULT:应用程序手工绘制the item,The control不绘制the item.



下面是例子:

case WM_NOTIFY:
   phdr=(NMHDR*)lParam;//不管lParam是指向什么结构体,起始部分都是NMHDR
   switch(phdr->code)//根据通知码的不同,从而知道指向什么结构体
   {
    case TVN_BEGINDRAG://说明lParam指向的是一个NM_TREEVIEW结构体
     ptree=(NM_TREEVIEW*)lParam;

     break;
    case NM_CUSTOMDRAW://可以发送NM_CUSTOMDRAW通知码的控件很多
     pcd=(NMCUSTOMDRAW*)lParam;
     if(wParam==ID_HWNDTREE)//如果是TREEVIEW控件发送的
     {
      ptvcd=(NMTVCUSTOMDRAW*)lParam;
      if(ptvcd->nmcd.dwDrawStage==CDDS_PREPAINT)//Before the painting cycle begins
      {
       //the control will send NM_CUSTOMDRAW notification messages to the parent,before and after drawing items
       return CDRF_NOTIFYITEMDRAW;
      }
      if(ptvcd->nmcd.dwDrawStage==CDDS_ITEMPREPAINT)//Before an item is drawn
      {
       newfont=(HFONT)GetStockObject(ANSI_FIXED_FONT);
       SelectObject(ptvcd->nmcd.hdc,newfont);
       ptvcd->clrText=RGB(255,0,0);
       ptvcd->clrTextBk=RGB(0,150,50);
       return CDRF_NEWFONT;
      }
     }
     break;
    default:
     break;

   }
   break;
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 08:01

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表