80分求答:popupmenu菜单项TItemMenu中如何加入鼠标事件?

fisher_older 2009-07-20 10:16:31
我现在想要在popupmenu的菜单项中进行自画,并能响应鼠标事件。但是其TMenuItem中并不包含鼠标事件。若继承TCustomMenuItem类似乎可以加入鼠标事件,但是产生的新类与TItemMenu类型不匹配,无法添加到popupmenu中。各位大虾有何妙招?

...全文
149 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-07-23
  • 打赏
  • 举报
回复
帮顶
yct0605 2009-07-23
  • 打赏
  • 举报
回复
帮你顶了,楼主的意思差不多都应该明白了,尝试拦截WM_NCHITTEST消息看看。
  • 打赏
  • 举报
回复
最简单的方法是拦截WM_NCHITTEST消息,不过没有验证是否对popupmenu也有效。
fisher_older 2009-07-23
  • 打赏
  • 举报
回复
顶,希望还有更好的答案
sanguomi 2009-07-21
  • 打赏
  • 举报
回复
你要加什么鼠标操作?
fisher_older 2009-07-21
  • 打赏
  • 举报
回复
sanguomi,谢谢您的回复,但是您的方法我还是没能实现。该怎么调用您定义的这几个函数?
fisher_older 2009-07-21
  • 打赏
  • 举报
回复
感谢各位的热心解答。
可能大家还没太明白我的意思。MenuItem菜单项的事件中不包含onMousemove等事件。比如我要在鼠标移到某个菜单项时菜单的颜色或者文字发生改变,甚至是判断鼠标的坐标位置,这时候就需要用到鼠标事件。当然类似的还有onMouseUp等事件。不知道如何实现?
bdmh 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 fisher_older 的回复:]
我现在想要在popupmenu的菜单项中进行自画,并能响应鼠标事件。但是其TMenuItem中并不包含鼠标事件。若继承TCustomMenuItem类似乎可以加入鼠标事件,但是产生的新类与TItemMenu类型不匹配,无法添加到popupmenu中。各位大虾有何妙招?
[/Quote]
你是不是写错了,应该是TMenuItem吧
sanguomi 2009-07-21
  • 打赏
  • 举报
回复
pStruct: PCWPStruct;
pStruct := PCWPStruct(lParam);
第2个函数加这句
sanguomi 2009-07-21
  • 打赏
  • 举报
回复
这个用钩子吧


function MenuWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
var
begin
case MSG of
WM_WM_LBUTTONDOWN:
begin
end;
Wm_.. //加你要处理的消息
end;
end;

function WindowsHook(Code: Integer; wParam: Integer; lParam: Integer): LRESULT; stdcall;
var
ClassName: array[0..63] of Char;
lastWndProc: Pointer;
begin
if (Code = HC_ACTION) and ((pStruct^.message <> WM_CREATE) or (pStruct^.message <> $01E2)) and
(GetClassName(pStruct^.hwnd, @ClassName[0], SizeOf(ClassName)) = 6) and
(StrPas(@ClassName[0]) = '#32768') then
begin
lastWndProc := Pointer(GetWindowLong(pStruct^.hwnd, GWL_WNDPROC));
if lastWndProc <> @MenuWndProc then
begin
SetWindowLong(pStruct^.hwnd, GWL_WNDPROC, Integer(@MenuWndProc));
MenuOldWndProc := lastWndProc;
end;
end;
Result := CallNextHookEx(WH_CALLWNDPROC, Code, wParam, lParam);
end;

SetWindowsHookEx(WH_CALLWNDPROC, WindowsHook, hInstance, GetCurrentThreadId);
shuihan20e 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sanguomi 的回复:]
你要加什么鼠标操作?
[/Quote]
除了鼠票点击外还有其他的?

onclick,onupdateui?
fisher_older 2009-07-20
  • 打赏
  • 举报
回复
具体内容见:《Delphi中制作特效菜单》
http://industry.ccidnet.com/art/1077/20031001/808829_1.html

“…… 但是,利用这种方法制作自定义菜单的功能还是受到了一定的限制。我们只能对OnAdvancedDrawItem、OnClick、OnDrawItem、OnMeasureItem等有限几个事件作出反应并对菜单项进行定制,我们没有办法对鼠标事件作出反应。利用鼠标事件,当鼠标滑过菜单项时,我们可以实现诸如加亮、渐变或其他的菜单项显示技术。显然这是十分有意义的。……”

该怎么实现呢?多谢了!

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧