首页
社区
课程
招聘
[求助]如何让控件自动发WM_NOTIFY消息?
发表于: 2008-11-16 11:27 12262

[求助]如何让控件自动发WM_NOTIFY消息?

2008-11-16 11:27
12262
记得以前写过一个小程序.
比如把鼠标移到一个控件上,控件会自动发消息给主程序,WM_NOTIFY.

截获这个控件,就能判断鼠标是否在这个控件上.
忘了怎么实现的了.
这次怎么搞,也收不到WM_NOTIFY 消息.

主要目的是,判断鼠标是否在button上.

有好办法的坛友们 赶紧告之一下吧.感激,感激,呵呵.
期待 forgot 的出现~``

上次非常感谢你的listview控件例子.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 107
活跃值: (1683)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
看雪第一美女
forgot大牛快来哦
2008-11-16 11:41
0
雪    币: 357
活跃值: (3403)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
forgot 快出来啊,美女叫你了
2008-11-16 11:47
0
雪    币: 282
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
forgot比较忙,美女请排队。
2008-11-16 12:09
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
标准Win32的CommonControls向你窗口发送WM_NOTIFY消息,所有的消息类别,在commctrl.h中定义如下:

#define NM_OUTOFMEMORY          (NM_FIRST-1)
#define NM_CLICK                (NM_FIRST-2)    // uses NMCLICK struct
#define NM_DBLCLK               (NM_FIRST-3)
#define NM_RETURN               (NM_FIRST-4)
#define NM_RCLICK               (NM_FIRST-5)    // uses NMCLICK struct
#define NM_RDBLCLK              (NM_FIRST-6)
#define NM_SETFOCUS             (NM_FIRST-7)
#define NM_KILLFOCUS            (NM_FIRST-8)
#if (_WIN32_IE >= 0x0300)
#define NM_CUSTOMDRAW           (NM_FIRST-12)
#define NM_HOVER                (NM_FIRST-13)
#endif
#if (_WIN32_IE >= 0x0400)
#define NM_NCHITTEST            (NM_FIRST-14)   // uses NMMOUSE struct
#define NM_KEYDOWN              (NM_FIRST-15)   // uses NMKEY struct
#define NM_RELEASEDCAPTURE      (NM_FIRST-16)
#define NM_SETCURSOR            (NM_FIRST-17)   // uses NMMOUSE struct
#define NM_CHAR                 (NM_FIRST-18)   // uses NMCHAR struct
#endif

其中并没有类似"NM_MOUSEMOVE"之类的消息。之前你用的是什么开发工具,使用的是什么控件?

解决此问题的一种SDK方法是,在父窗口中处理WM_MOUSEMOVE消息,它的参数是:

WM_MOUSEMOVE
fwKeys = wParam;        // key flags
xPos = LOWORD(lParam);  // horizontal position of cursor
yPos = HIWORD(lParam);  // vertical position of cursor

然后使用这个API

HWND ChildWindowFromPoint(
  HWND hWndParent,  // handle to parent window
  POINT Point       // structure with point coordinates
);

具体情况,自行MSDN吧。

我平时主要是用SDK编程,不太熟悉那些框架的东西。
2008-11-16 12:11
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
先SetWindowsLong改变下窗口处理函数,把相关的窗口消息处理给改下,鼠标在控件上移动是什么消息忘了,好像是什么WM_MOVE,然后在窗口处理函数里sendMessage WM_NOTIFY消息就行了。
2008-11-16 12:55
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
现在的问题是..
不知道为何我的对话框接收不到 WM_NOTIFY 消息.
已调用过 InitCommonControls
2008-11-16 16:32
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
主要是 DialogBox, 好像跟窗口 不太一样..
2008-11-16 16:40
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
9
这是一种办法,正式的说法叫子类化。

大致这样:

GetDlgItem()得到控件的窗口句柄。

GetWindowLong()得到原来的默认窗口过程

SetWindowLong()安装自己的子类过程。在该过程中响应WM_MOUSEMOVE消息,直接PostMessage()向父窗口发送WM_NOTIFY消息,对于其它消息,直接交给原来的默认窗口过程。

在父窗口中处理WM_NOTIFY消息。

不过既然已经子类化了,实际上不用多走这一步了,就直接在子类过程处理事件就可以了。

关于子类化,MFC的CWnd类提供如下成员函数进行封装(MSDN98):

BOOL SubclassDlgItem( UINT nID, CWnd* pParent );

Return Value

Nonzero if the function is successful; otherwise 0.

Parameters

nID

The control’s ID.

pParent

The control’s parent (usually a dialog box).
2008-11-16 22:25
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢楼上的回帖.

说简单一点.. 目的就是 获得 鼠标在 按钮上的 entering leaving事件.
试问... 子类化后,如何处理 WM_MOUSEMOVE 消息呢?
2008-11-17 08:23
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
11
我似乎明白你的意图了,你是要实现自绘按钮的功能,当鼠标悬停在按钮之上就显示某种动画特效,没猜错吧,呵呵。

我简单写了个对话框,对其中的一个按钮实现了子类化,简单实现你所说的鼠标移入移出的响应,你看一下就明白其原理了。

程序是用SDK写的。MFC的话我不熟,但原理是一样的。

就是个原理,所以很丑陋,将就着看吧。
上传的附件:
2008-11-17 19:55
0
雪    币: 250
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
这年头高手都不用MFC了...

还是用 Win32 或者 .NET吧
2008-11-18 17:49
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
是了!就是这个意思.非常感谢,给个联系方式吧.以后有问题多向你请教.
2008-11-18 17:52
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
14
请教不敢当。就是讨论而已。我也是一边查资料一边写的程序。

之前看书时知道一个子类化Edit控件的例子,但有些忘了。

好在现在谷歌百度什么的非常方便,才得以最终完成。

其中颇费周折的是我忘了如何对不需要子类处理的消息还给原来的窗口过程,刚开始我直接用函数指针调用,没想到成了无穷递归了。

后来不小心看见MSDN上的

GWL_WNDPROC Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the CallWindowProc function to call the window procedure.

才知道原来要用CallWindowProc来将消息传递下去。

于是最终成型。

其实用Spy++分析一下系统程序,还有一个消息WM_NCHITTEST,是先于WM_MOUSEMOVE发送到控制上的。

这个消息更加强大,MSDN98中这么说:

The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse.

这个消息很好很强大。
2008-11-18 21:27
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你qq多少啊?
我加上,以后有问题好相互探讨一下.
2008-11-20 07:40
0
雪    币: 207
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
ok,解决了.
封贴~ 感谢大家的热心回复
2008-11-20 08:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我也在找这个东西,WIN 32 SDK里面似乎不好实现呢,在MFC里面倒是很容易弄。
2009-3-10 15:22
0
游客
登录 | 注册 方可回帖
返回
//