Windows 将非VCL窗口添加到VCL对齐队列
一些背景(某种程度上是以下内容的延续):Windows 将非VCL窗口添加到VCL对齐队列,windows,delphi,winapi,delphi-xe,vcl,Windows,Delphi,Winapi,Delphi Xe,Vcl,一些背景(某种程度上是以下内容的延续): 因此,我有一个应用程序,它加载不同的插件并创建 TPageControl上的每个新选项卡 每个DLL都有一个与其关联的TForm 创建表单时,将其父hWnd作为新的TTabSheet。 因为TTabSheets不像VCL那样是表单的父级 担心(不想使用动态RTL和中制作的插件) 其他语言)我必须手动处理大小调整 对于这种“插件”类型的应用程序,我似乎遇到了很多新问题(但学习经验非常丰富) 因此,我目前的努力是尝试有一个插件,它不会插入到TTabShe
- 因此,我有一个应用程序,它加载不同的插件并创建 TPageControl上的每个新选项卡
- 每个DLL都有一个与其关联的TForm
- 创建表单时,将其父hWnd作为新的TTabSheet。 因为TTabSheets不像VCL那样是表单的父级 担心(不想使用动态RTL和中制作的插件) 其他语言)我必须手动处理大小调整
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个小时试图弄明白一些事情,我在这里发布,然后答案就出现了……哦,有人可能会发现这个问题和我的漫谈很有用):
现在的问题是,当应用程序关闭时,我得到无效错误AV…我将继续
编辑2:
好的,是TWinControl.DestroyWindowHandle引发AV,因为窗口句柄不再存在。我正在尝试想出一个干净的解决方案。从
TWinControl
派生一个新类,并重写它的虚拟DestroyWindowHandle()
方法,以不释放您提供的HWND
。TWinControl.DestroyWindowHandle()
的默认实现调用Win32 APIDestroyWnd()
函数。这是一个比我所做的更优雅的解决方案!太好了,谢谢+哇。我不确定这是黑客还是诡计,但见鬼,给出一个随机窗口控件VCL特性肯定是有用的!谢谢你们两个!这不是一个黑客。TWinControl的CreateWindowHandle()
和DestroyWindowHandle()
方法故意是虚拟的,以允许自定义窗口管理。
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;