倾家荡产,求高手解决! ( 积分: 220 )

  • 主题发起人 主题发起人 我要学会天天编程
  • 开始时间 开始时间

我要学会天天编程

Unregistered / Unconfirmed
GUEST, unregistred user!
最近作一个项目,要求使用DLL封装一些窗体,然后显示在主窗体的一些容器上,比如说,我主窗体上有一个Panel,我在DLL中封装了一个Form,然后我将这个Form显示在Panel里面,我的做法s是:
通过主窗体传递 ParentHandle,设置DLL窗体的ParentHandle属性,窗体顺利的出现在了 主窗体上。
但是这样做,出现了一个问题,如果我在主窗体上放置了别的控件,我DLL中生成的窗体无法接受到焦点,我的意思是,对于Tab,箭头等都失灵了,他们只能在主窗体上的控件上切换。不知道各位大富翁有没有遇到这种问题,另外,对于MDI的解决方法,我知道,我主要像知道非MDI窗口下解决焦点问题的方案,谢谢了!
 
最近作一个项目,要求使用DLL封装一些窗体,然后显示在主窗体的一些容器上,比如说,我主窗体上有一个Panel,我在DLL中封装了一个Form,然后我将这个Form显示在Panel里面,我的做法s是:
通过主窗体传递 ParentHandle,设置DLL窗体的ParentHandle属性,窗体顺利的出现在了 主窗体上。
但是这样做,出现了一个问题,如果我在主窗体上放置了别的控件,我DLL中生成的窗体无法接受到焦点,我的意思是,对于Tab,箭头等都失灵了,他们只能在主窗体上的控件上切换。不知道各位大富翁有没有遇到这种问题,另外,对于MDI的解决方法,我知道,我主要像知道非MDI窗口下解决焦点问题的方案,谢谢了!
 
Windows.SetParent(hWndChild, hWndNewParent: HWND)
 
这个我使用了,对于TForm控件,设置ParentWindow就可以了,关键的地方应该不在这,我主要像知道是什么原因导致了 DLL窗体在主窗体中不能相应Tab,箭头等键盘事件。
 
没人知道嘛?
大富翁们帮帮吗啊?
 
//我测试过,是可以用TAB键切换焦点的
procedure OpenDllForm(AApplication : TApplication; AHandle : THandle); stdcall;
begin
DllApplication := Application;
Application := AApplication;
if DllForm=nil then
DllForm := TDllForm.Create(Application);
windows.SetParent(DllForm.Handle, AHandle);
DllForm.ShowModal;
FreeAndNil(DllForm);
Application := DllApplication;
end;
 
//Exe
procedure OpenDllForm(AApplication : TApplication; AHandle : THandle); stdcall; External 'Project1.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDllForm(Application, Panel1.Handle);
end;
 
to xianguo
这个你没有看清楚我的问题啊!我在DLL做的窗口会显示在主窗体的Panel上,而不是单独的ShowModal,如果showModal的话,肯定可以切换焦点的!我想主要是主窗体不知道子窗体的存在,在收到tab或者箭头的消息时,不能发送到对应的窗口中
 
试试ABC for Delphi套件中的Tformpanel来替代你的Panel
 
to peerson,
什么是 ABC for Dephi??其实我们主要的问题是采用了DLL封装窗体,而且为了避免带包编译带来的版本问题,所以实际上DLL间是不能传递对象的。不管是TPanel还是TFormPanel都是不合适的,我在实现的时候都是传的Handle,所以才会有焦点的问题。
 
ABC for Delphi是一套控件。
Tformpanel是为了解决窗体嵌入Panel的问题独立设置的,给他Handle或注册的窗体Name,就能显示及控制该窗体。
如果不适合就算了,我也是刚用到它,呵呵。
 
激活这个窗口试下呢?

sendMessage(Handle, WM_NCACTIVATE, Ord(True), 0);
 
在主窗口截获消息 CM_DIALOGKEY就可以了。
 
多人接受答案了。
 
后退
顶部