在DLL中包含窗体

如何在DLL中包含窗体,并将其嵌入到主窗口中指定位置?采用C++Builder6平台,并且要求达到如下目标:
1.可以随时创建DLL中的窗口或卸载DLL中的窗口
2.可以动态加载或卸载包含窗口的DLL
3.主窗口启动时,焦点落在默认的嵌入窗口控件上
4.TSpeedButton可以响应鼠标移动事件
5.Tab键仅在嵌入窗口中跳动,不会跳出到主窗口控件上
6.嵌入窗口可以使用COM控件,如TADOQuery控件
7.嵌入窗口和主窗口都可以使用VCLSkin控件换肤
8.DLL中的窗口,实现业务功能时,和平常创建的工程窗口使用完全一致
本方案可以实现上述目标,具体步骤如下:
(1)先创建一个DLL工程,在DLL工程中包含接口文件IDLLObject.h,这是各个DLL中需要实现的功能,他辅助嵌入窗口处理一些来自主窗口的消息。调用的DLL的主工程窗口也需包含此文件,主窗口会调用这些接口,创建和管理嵌入窗口。IDLLObject.h内容如下:

#ifndef IDLLControlHPP
#define IDLLControlHPP
//DLL中的基本接口类,窗口消息处理须继承此类
#define VCLSKIN  false //是否使用VCLSkin换肤,false不使用;true使用
#include<vcl.h>
class IDLLObject
{
public:
    virtual void   __fastcall  Initialize(Forms::TApplication* AApp) = 0 ;
    virtual void   __fastcall  UNInitialize(void) = 0 ;
    virtual HANDLE __fastcall  MergeForm(Controls::TWinControl* AParent) = 0 ;
    virtual void   __fastcall  GetPulsVersion(char * PulsName,char * Version,char * description)=0;
	
    virtual void __fastcall  DelObject()=0;//卸载DLL中的窗体
    virtual void __fastcall  ShowObject(bool isShow)=0;//是否显示DLL中的窗体
};
#endif

(2)在创建的DLL工程中,添加一个普通的窗口,将边框设为bsNone。并添加CloseQuery事件处理代码。每个DLL中的窗口,都是如此。编写其他业务代码,则和普通工程中的窗口一样。

void __fastcall TfrmLogin::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    CanClose = caFree;
}

(3)每个DLL中的窗体,都需要有一个对IDLLObject接口的实现类,用来辅助此窗口实现系统控制功能。如:包含登录窗口的login.dll,其继承IDLLObject接口的类为TDLLFrmLoginHelp,名称自行命名。每个窗口和接口实现类须一一对应。

//*****************************************************//
//                                                     //
//      创建DLL内部窗体消息处理类DLLFrmLoginHelp.h        //
//                                                     //
//*****************************************************//
#include <windows.h>
#include "IDLLObject.h"
//处理DLL中包和的窗口的消息
//并补充处理按键和鼠标消息
//DLL所包含窗口的头文件
#include "LoginUnit.h"

class TDLLFrmLoginHelp:public IDLLObject
{
  private:
    TApplication *FMainApplication ;

    TControl * FMouseControl ;

    void __fastcall DoMessage(tagMSG &Msg, bool &Handled );
    bool DoMouseIdle();

    //DLL中包含的窗口类名,窗口在LoginUnit.h文件中
    TfrmLogin * m_pDLLFrmLogin;
  public:
    __fastcall  TDLLFrmLoginHelp();
    __fastcall  ~TDLLFrmLoginHelp();
    
    //实现接口,由外部主窗口调用
    void __fastcall   DelObject();
    void __fastcall   ShowObject(bool isShow);
    void __fastcall   Initialize(TApplication *AApp);
    void __fastcall   UNInitialize();
    HANDLE __fastcall MergeForm(TWinControl *AParent);
    void  __fastcall  GetPulsVersion(char * PulsName,char * Version,char * description);
};

/*DLLFrmLoginHelp.cpp类的成员函数实现*/
__fastcall TDLLFrmLoginHelp::TDLLFrmLoginHelp()
{
   m_pDLLFrmLogin   = NULL;
   FMainApplication = NULL;
   FMouseControl    = NULL;
}

__fa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值