我将Dll中的TImage控件的 Parent属性 设置成外部运用程序的Form,
方法是继承 TImage 新建一个TMyImage类。这样可以实现图片的正常显示以及mousedown,mousemove等事件响应。
但是,问题出来了。
因为 Timage 可以响应鼠标中键和右键的MouseUP消息,但是无法响应鼠标左键的 MouseUP 消息,
可能与其继承的TControls有关,OnClick ,MouseDown以及MouseUP 三者之间消息影响所致。为了不影响封装性,我的设想是:
  在外部 form 和 TMyImage 之间,增加一个虚拟窗口,进行消息转发。在这里截获 WM_LBUTTONUP消息,来进行操作。
对这方面是个新手,还请帮忙指点一下,或者您有其他的思路,不妨一起探讨一番。

解决方案 »

  1.   

    一般不太可能WM_LBUTTONUP消息不响应吧,如果不是代码上的问题,直接用系统消息钩子
      

  2.   

    我上传了下,麻烦帮忙看一下。
    目前虽然通过间接调用一个TPanel,实现所要的功能,但是这样会增加一个控件的开销,最好能避免这样的方式。
    以下是Demo下载链接:
    http://download.csdn.net/source/1832457
      

  3.   

    提供一个思路:
    1、在TForm中实现如下接口:
    IHookWndProc = interface
      ['{15E92DD5-1CDD-4879-9A41-3960C2114CFF}']
        procedure HookWndProc(Hook: TWndMethod);
        procedure UnHookWndProc(Hook: TWndMethod);
      end;
    2、在TForm中重载WndProc(var Message: TMessage);在方法里面调用Hook进来的函数。实现上可以参考TApplication.HookMainWindow(Hook: TWindowHook);以及TApplication.UnhookMainWindow(Hook: TWindowHook);这个方法应该可以满足你的要求
      

  4.   

    感谢 yumenyoudian 的热心帮助,也感谢各位兄弟的友情up。
    我进行了尝试,尚有一些疑问:
    1. 不大明白您关于 IHookWndProc = interface  用法的意思,这里的TForm是指外部运用程序的Form?  2. 我在外部程序中,重载 WndProc函数,在这里面 针对MouseUP消息,调用dll中相应的处理函数,这样可以实现功能,不过有个缺点: 这样使得dll的封装不是很好,还需要外部添加WndProc函数,调用复杂。最理想是: 在dll中实现消息重载的函数,而且不需要增加额外的控件(比如我上面提到的TPanel)。 这样既不增加消耗,又能实现简单调用。--------------------------------------------------------------------------
    我的思路是: 在外部form使用 Dispatch 函数分派Mouseup消息后,到TControl接受这个消息之前的这段时间,想办法操作TMyImage控件类,在dll中截获该消息,优先处理Mouseup,再将其余消息继续传递下去。不知道这样的想法有没有办法实现,或者还有更好的实现方式,继续尝试,期待中
      

  5.   

    IHookWndProc = interface 是定义一个接口.我看看你的demo先