如何在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