Chinaunix首页 | 论坛 | 博客
  • 博客访问: 341538
  • 博文数量: 82
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 19:13
文章分类

全部博文(82)

文章存档

2015年(1)

2014年(1)

2013年(1)

2012年(12)

2011年(3)

2010年(25)

2009年(37)

2008年(2)

我的朋友

分类: C/C++

2013-01-30 10:51:45

http://blog.csdn.net/markman101/article/details/3591355


NMHDR   =   Notify   Message   Handler

NMHDR   结构包含下列成员:  
  typedef   struct   tagNMHDR   {  
  HWND   hwndFrom;     //   handle   of   control   sending   message  
  UINT   idFrom;//   identifier   of   control   sending   message  
  UINT   code;     //   notification   code;   see   below  
  }   NMHDR;  
   
  消息通过下面的宏定义之:  
  ON_NOTIFY(   wNotifyCode,   idControl,   memberFxn   )  
  wNotifyCode    
  通知消息标识符代码,如   TBN_BEGINADJUST。    
  idControl    
  发送通知的控件的标识符。    
  memberFxn    
  接收到通知时调用的成员函数。    
   
  成员函数将用下列原型声明:  
  afx_msg   void   memberFxn(   NMHDR   *   pNotifyStruct,   LRESULT   *   result   );  

 

在WM_NOTIFY中,lParam中放的是一个称为NMHDR结构的指针。在wParam中放的则是控件的ID。  
   
          NMHDR结构是很值得一提的,该结构包括有关制作该通知的控件的任何内容,而不受空间和类型的限制,他的来历也是很有意思的。  
          在最初的windows3.x中,根本就不存在什么WM_NOTIFY,控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口。简单的通知仅发送一个WM_COMMAND消息,包含一个通知码和一个在wParam中的控件ID及一个在lPraram中的控件句柄。这样一来,wParam和lParam就都被填充了,没有额外的空间来传递一些其它的消息,例如鼠标按下的位置和时间。  
          为了克服这个困难,windows3.x就提出了一个比较低级的解决策略,那就是给一些消息添加一些附加消息,最为明显的就是控件自画用到的DRAWITEMSTRUCT。不知道大家对这个结构熟悉不,不过,如果你是老手,你应该非常清楚这个结构,这个结构包含了9个内容,几乎你需要控制的信息都给你提供了。为什么说它比较低级呢?因为不同的消息附加的内容不同,结果就是一盘散沙,非常混乱。  
          在win32中,MS又提出了一个更好的解决方案:引进NMHDR结构。这个结构的引进就是消息统一起来,利用它可以传递复杂的信息。这个结构的布局如下:  
          NMHDR  
          {  
                  HWnd   hWndFrom   ;   相当于原WM_COMMAND传递方式的lParam  
                  UINT   idFrom   ;       相当于原WM_COMMAND传递方式的wParam(low-order)  
                  UINT   code   ;           相当于原WM_COMMAND传递方式的Notify   Code(wParam"s   high-order)  
          };  
          对于这个结构的应用于WM_NOTIFY信息结构,结果WM_NOTIFY就变成了:  
          A、无附加信息。结构变得很简单,就是一个NMHDR结构。  
          B、有附加信息。定义一个大的结构,它的第一个元素就是NMHDR结构,它的后面放置附加信息。

 

举例://得到选中的列

void   CMyView::OnColumnclick(NMHDR*   pNMHDR,   LRESULT*   pResult)    
  {        
  NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;  
     

//得到选中的列       
  column=pNMListView->iSubItem;   

}

 

 

void CBillDlg2::OnGridEndEdit(NMHDR *pNotifyStruct ,LRESULT *pResult)//响应控件通知消息GVN_ENDLABELEDIT
{//自定义这个消息响应函数
  if(m_showbill)//控制显示对话框
  return ;
  /*typedef   struct   tagNMHDR   
  {   
          HWND     hwndFrom;   
          UINT     idFrom;   
          UINT     code;                   //   NM_   code   
  }      NMHDR; */  

  NM_GRIDVIEW *pitem=(NM_GRIDVIEW *)pNotifyStruct;
  if(pitem->iRow<0)
   return ;
  
  if(pitem->iColumn==m_nAmountCol||pitem->iColumn==m_nPriceCol)
  {
    CString  strAmount;
 CString  strPrice;
 strAmount=m_Grid.GetItemText(pitem->iRow,m_nAmountCol);
 strPrice=m_Grid.GetItemText(pitem->iRow,m_nPriceCol);
 int nAmount=atoi(strAmount);
 if(nAmount<=0)
  return;
 float fPrice=atof(strPrice);
 if(fPrice<=0)
 

 return;

 double dmoney=fPrice*(double)nAmount;
 CString  strMoney;
    strMoney.Format("%f",dmoney);
 m_Grid.SetItemText(pitem->iRow,m_nMoneyCol,strMoney);


  }

m_Grid.Refresh();

}

阅读(666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~