程序分两部分,左边中TreeView,右边是显示区,我打算将将所有功能都写成独立的DLL, 程序启动时固定的目录下搜索,每个DLL都有一个相同名称的函数返回一个Caption。 在TreeView中以此名加一节点,如果Dll中为窗体,则双击此节点后将此窗体做为MDI子窗体显示,如为ListView则在左边显示出来。
这样的话各个子功能模块就可以灵活组合。现在请问如何将DLL中的子窗体控件完美融合到主程序中。

解决方案 »

  1.   

    太多的DLL调用好像在程序退出时,出现错误,我没有解决,就放弃了。
    楼主有办法吗?
      

  2.   

    如只是将DLL中的窗体单独用模式或非模式方式弹出不会错的,在程序退出时出现错误可能是因为你没有正确释放。我现在想如何能将它做为子窗体显示或融合。
      

  3.   

    我做过,与我联系[email protected]
      

  4.   

    AttachThreadInput ()通常,系统内的每个线程都有自己的输入队列。本函数(既“连接线程输入函数”)允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 
    返回值 详细的跟我联系  [email protected]
      

  5.   

    laughcsdn(笑傲中国软件) :你好,请问如何和你联系,我的信箱:[email protected]
      

  6.   

    to ZyxIp(绝望中的平静) :给你留言了
      

  7.   

    我以前做过一个简单的测试程序,留下EMAIL,给你发过去!
      

  8.   

    多谢大家。我的地址:[email protected]
      

  9.   

    算了,还是简单说说原理吧。其实很简单的,在你右边的显示区放个Panel,
    procedure ShowDllForm(AppHandle: THandle;
      AParentWindow: HWND); stdcall;
    var
      OldStyle: integer;
      ARect: TRect;
      DC1, DC2: HDC;
    begin
      Application.Handle := AppHandle;
      with TForm2.Create(Application) do
      begin
        Windows.SetParent(Handle, AParentWindow);
        Windows.GetClientRect(AParentWindow, ARect);
        SetWindowPos(Handle, HWND_TOP, 0, 0,
          ARect.Right - ARect.Left,
          ARect.Bottom - ARect.Top, SWP_SHOWWINDOW);
        Visible := True;
      end;
    end;
      

  10.   

    调用的时候 AppHandle传入应用程序句柄, AParentWindow 传入Panel.handle就可以了。那个TForm2.Create(Application) 中的TForm2要根据你自己的类来写[注意,这个是Dll中的窗口]还有,这里没有考虑释放问题,释放我是在Dll的Form的OnClose中使用Action := caFree来释放的。另外还要考虑重复调用问题,作个计数器就可以了。
      

  11.   

    注意Dll中的Form默认要使他为Visible为False!
      

  12.   

    我出差回来了,给我mail吧,我发给你
      

  13.   

    to ZyxIp :已经发给你了,查收先