SDK编程一日一学(控件响应右键)

来源:互联网 发布:ps4热血无赖淘宝暗号 编辑:程序博客网 时间:2024/05/22 14:53
我也刚学SDK,所以不知道怎么响应控件的右键单击事件,我开始以为只要处理WM_LBUTTONDOWN就可以了,但是不行,可以响应窗体的单击事件,但不能响应控件的。呵呵,经过查查资料发现了几个方法,其中一个方法很是猥琐,好了,先说一下那个猥琐点的。。。

   方法一是处理WM_CONTEXTMENU消息,鼠标右键单击控件都会响应这个消息,但是问题来了怎么知道单击了那个控件呢?这可能与WM_CONTEXTMENU消息的wparam和lparam有关系,我不知道这两个参数此时代表什么,但下面代码可以实现右键单击事件,先获取鼠标位置,在用WindowFromPoint获取鼠标位置处的控件句柄,然后与我们想要右键单击的那个控件句柄相比较,相等的话就弹出右键菜单。。哈哈。。该方法的确相当猥琐。。你可以查一下WM_CONTEXTMENU消息的wparam和lparam参数,看看有没有给我们提供好的方法。。

case WM_CONTEXTMENU:
    {
       POINT Point;
       GetCursorPos(&Point);
       HWND hList=GetDlgItem(hwnd,IDC_LIST1);
       HWND hList2=WindowFromPoint(Point);
       if(hlist==hList2)
       {  
            TrackPopupMenu(PopMenu,TPM_LEFTALIGN,Point.x,Point.y,0,hwnd,NULL);
       }
       ULONG ControlId=wparam&0x0000FFFF;
       break;
    }

   方法2:当控件被单击或其它各种击时都会发送一个WM_NOTIFY消息,这个最近我才知道,唉!早知道有这个消息,我就。。。。,好了有了这个消息,我们就可以正规的处理控件的右键功能了,当有这个消息时,wparam为发生事件的控件ID,lparam为一个指向NMHDR结构的指针,这个指针是什么呢?如下:

typedef struct tagNMHDR
{
    HWND hwndFrom;
    UINT idFrom;
    UINT code;         // NM_ code
}   NMHDR;
typedef NMHDR FAR * LPNMHDR;

这个结构里面的那个code就是通知吗,这个通知吗可能是:

   NM_CLICK——用户在控件上按下了鼠标左键。

   NM_DBLCLK——用户在控件上双击鼠标左键。

   NM_KILLFOCUS——控件失去了键盘输入焦点。

   NM_OUTOFMEMORY——控件在运行中内存耗尽。

   NM_RCLICK——用户在控件上按下了鼠标右键。

   NM_RDBLCLK——用户在控件上双击鼠标右键。

   NM_RETURN——用户在控件上按下了回车键。

   NM_SETFOCUS——控件得到了键盘输入焦点。

所以要响应右键信息,只需处理NM_RCLICK即可,代码如下:

case WM_NOTIFY:
    {
     if(你的控件ID==wparam)
     {
     if(NM_RCLICK==((NMHDR*)lparam)->code)
      {

          做相应的操作。。
       }
     }
     break;
    }