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

解决方案 »

  1.   

    具体内容见:《Delphi中制作特效菜单》
    http://industry.ccidnet.com/art/1077/20031001/808829_1.html“…… 但是,利用这种方法制作自定义菜单的功能还是受到了一定的限制。我们只能对OnAdvancedDrawItem、OnClick、OnDrawItem、OnMeasureItem等有限几个事件作出反应并对菜单项进行定制,我们没有办法对鼠标事件作出反应。利用鼠标事件,当鼠标滑过菜单项时,我们可以实现诸如加亮、渐变或其他的菜单项显示技术。显然这是十分有意义的。……” 该怎么实现呢?多谢了!
      

  2.   

    你是不是写错了,应该是TMenuItem吧
      

  3.   

    除了鼠票点击外还有其他的?onclick,onupdateui?
      

  4.   

    这个用钩子吧
    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);
      

  5.   

    pStruct: PCWPStruct;
     pStruct := PCWPStruct(lParam);
    第2个函数加这句 
      

  6.   

    感谢各位的热心解答。
    可能大家还没太明白我的意思。MenuItem菜单项的事件中不包含onMousemove等事件。比如我要在鼠标移到某个菜单项时菜单的颜色或者文字发生改变,甚至是判断鼠标的坐标位置,这时候就需要用到鼠标事件。当然类似的还有onMouseUp等事件。不知道如何实现?
      

  7.   

    sanguomi,谢谢您的回复,但是您的方法我还是没能实现。该怎么调用您定义的这几个函数?
      

  8.   

    最简单的方法是拦截WM_NCHITTEST消息,不过没有验证是否对popupmenu也有效。
      

  9.   

    帮你顶了,楼主的意思差不多都应该明白了,尝试拦截WM_NCHITTEST消息看看。