这个用钩子吧 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);
http://industry.ccidnet.com/art/1077/20031001/808829_1.html“…… 但是,利用这种方法制作自定义菜单的功能还是受到了一定的限制。我们只能对OnAdvancedDrawItem、OnClick、OnDrawItem、OnMeasureItem等有限几个事件作出反应并对菜单项进行定制,我们没有办法对鼠标事件作出反应。利用鼠标事件,当鼠标滑过菜单项时,我们可以实现诸如加亮、渐变或其他的菜单项显示技术。显然这是十分有意义的。……” 该怎么实现呢?多谢了!
嘿
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);
pStruct := PCWPStruct(lParam);
第2个函数加这句
可能大家还没太明白我的意思。MenuItem菜单项的事件中不包含onMousemove等事件。比如我要在鼠标移到某个菜单项时菜单的颜色或者文字发生改变,甚至是判断鼠标的坐标位置,这时候就需要用到鼠标事件。当然类似的还有onMouseUp等事件。不知道如何实现?