我将主程序做成exe,功能模块窗体封装在dll中,调用后,dll中的窗体和主程序的窗体不同,并且在任务栏上有单独的一部分,也就是说,我希望
1,将dll中的窗体调用出来后,图标与主程序一致
2,不在工具栏上出现单独的一块,也就是MDI的效果,
之所以不用MDI,是因为试验了很久都不行,直接调用dll的普通窗体倒是很容易,以下是相关代码:
dll中的代码
.....
procedure Load_frmTest;stdcall;
begin
try
frmTest := TfrmTest.Create(nil);
frmTest.ShowModal;
finally
frmTest.Freel;
end;
end;exports
Load_frmTest;
....
1,将dll中的窗体调用出来后,图标与主程序一致
2,不在工具栏上出现单独的一块,也就是MDI的效果,
之所以不用MDI,是因为试验了很久都不行,直接调用dll的普通窗体倒是很容易,以下是相关代码:
dll中的代码
.....
procedure Load_frmTest;stdcall;
begin
try
frmTest := TfrmTest.Create(nil);
frmTest.ShowModal;
finally
frmTest.Freel;
end;
end;exports
Load_frmTest;
....
procedure Load_frmTest;stdcall;
begin
try
frmTest := TfrmTest.Create(nil);
frmTest.ShowModal;
frmTest.Parent := Handle;
finally
frmTest.Freel;
end;
end;
var
style : integer
begin
style := GetWindowLong(Application.Handle, GWL_EXSTYLE );
style := style or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW;
SetWindowLong(Application.Handle, GWL_EXSTYLE, style );
end;
再显示的话,只要把第二句改成
style := style or WS_EX_APPWINDOW and not WS_EX_TOOLWINDOW;
就行了。
是用MDI很方便,不知道你说的为什么不行,另外,你也可以直接使用一个Frm做为主窗体,上面放个Pannel
创建出来的窗体的Parent属性都设置为这个Pannel就行,这样很方便.建议你看下Raise控件的源代码,个人感觉这个架构不错.
//DLL部分procedure Load_frmTest(App: THandle);stdcall;
var
sHandle: THandle;
begin
sHandle := Application.Handle;
Application.Handle := App;
frmTest := TfrmTest.Create (Application);
try
frmTest.ShowModal;
finally
frmTest.Free;
end;
Application.Handle := sHandle;
end;exports
Load_frmTest;//调用部分
procedure TForm1.Button1Click(Sender: TObject);
begin
Load_frmTest(Application.Handle) ;
end;
理想的办法是:在dll接口函数中创建窗口(new)后返回窗口指针(而不是handle,且不要show),然后在主窗口中将dll窗口“拖”到一个panel中,我比较喜欢把他“拖”到一个pagecontrol中,这样就能形成“标签页”。至于拖动的代码,可以参考borland提供的demo
var
OldHandle: THandle;
begin
OldHandle := Application.Handle;
Application.Handle := AHandle;
frmTest := TfrmTest.Create(Nil);
try
frmTest.ShowModel;
finally
frmTest.Free;
Application.Handle := OldHandle;
end;
end;