yehao's Blog

公用控件的消息分类 WM_NOTIFY详解

http://hi.baidu.com/422053362/item/86b5bc088a8801006c9048eb

公用控件分为三类消息,

第一类消息:由应用程序发送给控件的消息,用于改变控件的属性或使用控件的功能

用SendMessage or PostMessage as so on.


例如以下消息都是:

ACM_OPEN
ACM_PLAY
ACM_STOP


SB_GETBORDERS
SB_GETICON
SB_GETPARTS
SB_GETRECT
SB_GETTEXT
SB_GETTEXTLENGTH
SB_GETTIPTEXT
SB_GETUNICODEFORMAT
SB_ISSIMPLE
SB_SETBKCOLOR
SB_SETICON
SB_SETMINHEIGHT
SB_SETPARTS
SB_SETTEXT
SB_SETTIPTEXT
SB_SETUNICODEFORMAT
SB_SIMPLE

TB_ADDBITMAP
TB_ADDBUTTONS
TB_ADDSTRING
TB_AUTOSIZE
TB_BUTTONCOUNT
TB_BUTTONSTRUCTSIZE
TB_CHANGEBITMAP
TB_CHECKBUTTON

第二类消息:在控件上有event发生时,控件给父窗口发送的消息,包括:

WM_NOTIFY:
WM_NOTIFYFORMAT:用来决定窗口 在WM_NOTIFY消息中是接收ANSI还是Unicode 结构体

第三类消息:其实不能算独立的消息,而是通知码,英文叫Notification Messages,或者说是附加消息,一般是附加在第二类消息WM_NOTIFY或者WM_COMMAND消息的lParam上

像以下这些消息:
NM_CHAR
NM_CUSTOMDRAW
NM_CLICK
NM_DBLCLK
NM_HOVER
NM_KEYDOWN
NM_KILLFOCUS
NM_NCHITTEST
NM_OUTOFMEMORY
NM_RCLICK
NM_RDBLCLK
NM_RELEASEDCAPTURE
NM_RETURN
NM_SETCURSOR
NM_SETFOCUS
NM_TOOLTIPSCREATED


ACN_START//附加在WM_COMMAND消息上
ACN_STOP//附加在WM_COMMAND消息上


NM_CLICK (status bar)
NM_DBLCLK (status bar)
NM_RCLICK (status bar)
NM_RDBLCLK (status bar)
SBN_SIMPLEMODECHANGE


TBN_BEGINADJUST
TBN_BEGINDRAG
TBN_CUSTHELP
TBN_DELETINGBUTTON
TBN_DRAGOUT
TBN_DROPDOWN
TBN_ENDADJUST
TBN_ENDDRAG
TBN_GETBUTTONINFO
TBN_GETDISPINFO
TBN_GETINFOTIP
TBN_GETOBJECT
TBN_HOTITEMCHANGE
TBN_QUERYDELETE
TBN_QUERYINSERT
TBN_RESET
TBN_TOOLBARCHANGE
TTN_GETDISPINFO
TTN_POP
TTN_SHOW


下面主要讲述WM_NOTIFY消息

其附加消息中,wParam是idCtrl;lParam是一个指针,指向NMHDR结构体 或者是 指向第一个成员是NMHDR结构体的结构体,上面说的第三类消息就附加在这里面

下面的例子说明了一个问题:不同控件同样是发送WM_NOTIFY消息,但是lParam却可以指向不同的结构体

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=#ff0000;
       ptvcd->clrTextBk=#009632;
       return CDRF_NEWFONT;
      }
     }
     break;
    default:
     break;

   }
   break;

posted on 2014-03-07 14:12 厚积薄发 阅读(1224) 评论(0)  编辑 收藏 引用 所属分类: Windows编程


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论