首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向VCL对齐队列中添加非VCL窗口。

向VCL对齐队列中添加非VCL窗口。
EN

Stack Overflow用户
提问于 2011-11-11 18:51:59
回答 1查看 690关注 0票数 9

一些背景(类似于的延续):

因此,我有一个应用程序,它加载不同的插件,并为每个插件在一个上创建一个新的选项卡。

  • 每个DLL都有一个与其相关联的TForm。
  • 表单是以它们的父级hWnd作为新的TTabSheet创建的。因为就VCL而言,TTabSheets不是表单的父级(不想使用动态RTL,也不想使用其他语言制作的插件),所以我必须手动处理调整大小。

对于这种“插件”类型的应用程序,我似乎遇到了许多新问题(但有很好的学习经验)。

因此,我目前的斗争是尝试有一个插件没有插入到一个TTabSheet,但将调整大小和对齐的形式直接。

因为这更容易用图片来解释:

现在,我可以手动进行对齐和调整大小,但我更希望让VCL对齐过程(alClient、alTop等)为我做。那样的话,我只需要在它的形式上设置插件对齐,而无需考虑。

在查看了VCL源代码之后,我开始逐步了解对齐代码以及它是如何调用的。基本上,当一个TControl获得一个WM_RESIZE时,它会:

调用AlignControl()

  • AlignControl()的
  1. 调用Realign()将得到客户端rect,调用AlignControls()
  2. AlignControls()将按以下顺序调用DoAlign():alTop、alBottom、alLeft、alRight、alClient、alCustom、alNone
  3. DoAlign()将遍历FControls和FWinControls (即TLists),并将它们对齐为appropriately

因此,我的想法是,如果我创建了一个新的TWinControl,将它的句柄设置为插件表单(窗口)句柄,并将其插入到FControls列表中,并使用适当的对齐方式来完成我的工作。

我当然在这里,所以很不幸地失败了。在退出有关无效窗口句柄的应用程序时,我甚至会得到一个AV。我的猜测是,我创建的TWinControl试图释放不再存在的插件表单(窗口)的句柄。

我试过的是:

代码语言:javascript
复制
procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
  NewWinControl : TWinControl;
begin
  NewWinControl := TWinControl.Create(frmMain);
  NewWinControl.WindowHandle := AHandle;
  NewWinControl.Align := Align;
  NewWinControl.Width := frmMain.ClientWidth;
  NewWinControl.Height := 30;
  NewWinControl.Parent := frmMain;
end;

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
  NewWinControl : TWinControl;
begin
  NewWinControl := TWinControl.Create(frmMain);
  NewWinControl.WindowHandle := AHandle;
  NewWinControl.Align := Align;
  NewWinControl.Width := frmMain.ClientWidth;
  NewWinControl.Height := 30;
  TWinControl(frmMain).Insert(NewWinControl);
end;

哦,有什么想法?

编辑1:

好的,这正确地将控件添加到列表中,并符合TAlign集(为什么我花了8个小时试图找出一些事情,我在这里发帖,然后答案就是appears...oh --有人可能会发现这个问题和我的漫谈很有用):

代码语言:javascript
复制
procedure AddHandleToControlList(AHandle: DWORD; AName: PChar; ATop, ALeft, AWidth, AHeight: Integer; AAlign: TAlign);
var
  NewWinControl : TWinControl;
begin
  NewWinControl := TWinControl.Create(frmMain);
  With NewWinControl Do
    begin
    Name := AName;
    Top := ATop;
    Left := ALeft;
    Width := AWidth;
    Height := AHeight;
    Align := AAlign;
    WindowHandle := AHandle;
    Visible := True;
  end;
  TWinControl(frmMain).InsertControl(NewWinControl);
end;

现在的问题是,当应用程序关闭时,我将得到无效的错误AV.我将继续!!

编辑2: Ok,所以是TWinControl.DestroyWindowHandle引发AV,因为窗口句柄已经不存在了。我在想一个干净的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-11 19:32:15

TWinControl派生一个新类,并重写其虚拟DestroyWindowHandle()方法,以不释放所提供的HWNDTWinControl.DestroyWindowHandle()的默认实现调用Win32 API DestroyWnd()函数。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8098568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档