MDIChild窗体真的不能放在dll里吗?请高手执教
我不管啦!!高手一定要告诉我应该怎么办? 问题点数:0、回复次数:11Top
1 楼ilikeff8(迷茫)回复于 2003-02-01 22:03:07 得分 0
当然可以,不过你要重新指定application给mdi窗口,并且在DLLEntryPoint里要做下处理Top
2 楼ilikeff8(迷茫)回复于 2003-02-01 22:09:40 得分 0
TApplication *App=NILL;
...
void ShowIt(TApplication *LinkApp)
{
if (!App) // 只需连接一次
{
App=Application;
Application=Link;
}
MdiForm=new TMdiForm(Application);
MdiForm->Show();
}
...
int WINAPI DllEntryPoint(...)
{
if ((reason==DLL_PROCESS_DETACH)&&(App))
Application=App;
return 1;
}
Top
3 楼voxforce(阿便)回复于 2003-02-01 22:14:58 得分 0
能不能具体点,我好苯阿Top
4 楼voxforce(阿便)回复于 2003-02-01 22:15:21 得分 0
谢Top
5 楼voxforce(阿便)回复于 2003-02-03 16:04:34 得分 0
照你这样做,没问题,就是关闭主窗口的后,出现异常。不知道为什么?Top
6 楼ilikeff8(迷茫)回复于 2003-02-03 16:09:50 得分 0
具体我也没怎么用过
你需要单步跟踪一下
可能reason的其他情况也要处理一下?,如果不是内存溢出,在close时捕获掉异常好了Top
7 楼Jim3(Jim)回复于 2003-02-05 10:41:03 得分 0
学习Top
8 楼Behard(我爱天安门)回复于 2003-02-08 15:07:47 得分 0
应该是关闭子窗体的问题
如果在关闭主窗体前关闭子窗体就可以的了
见:
http://expert.csdn.net/Expert/topic/1139/1139410.xml?temp=3.142947E-02Top
9 楼sczyq(我又...........)回复于 2003-03-19 13:31:12 得分 0
完全可以,终于搞通了。
原因是,放在 MDIForm 内的 MDIChild 窗口,最后窗口不能由自己关闭,应该由主程序来关闭,否则就出错。
因此,当 MDIChild 自己关闭(点“关闭”或其他自己的关闭控制)时,通过FormCloseQuery来给主程序发消息,让主程序来关闭自己。关闭后,通过FormDestroy通知主程序释放动态装入的DLL。
由主程序控制的关闭,则省略FormCloseQuery。Top
10 楼sczyq(我又...........)回复于 2003-03-19 13:33:24 得分 0
// DLL
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "Unit3.h"
extern "C" __declspec(dllexport) void __stdcall OpenDLLChild(TApplication *ParentApplication,
TForm *MainForm);
TApplication *DllApplication = NULL;
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if ( reason==DLL_PROCESS_ATTACH ) //装载 DLL
{
DllApplication=Application; //保存DLL的 Application 对象
}
if ( reason==DLL_PROCESS_DETACH ) //释放 DLL
{
Application=DllApplication; //恢复保存的Application 对象
}
return 1;
}
//---------------------------------------------------------------------------
void _stdcall OpenDLLChild(TApplication *ParentApplication,
TForm *MainForm)
{
Application=ParentApplication;
TForm3 *Form3 = new TForm3(MainForm);
Form3->Parent = MainForm;
Form3->ParentWindows = MainForm;
Form3->Caption = MainForm->Caption;
Form3->Show();
}
//---------------------------------------------------------------------------
Top
11 楼sczyq(我又...........)回复于 2003-03-19 13:36:20 得分 0
// Unit3.h in DLL project
// Form3->FormStyle = fsMDIChild
//---------------------------------------------------------------------------
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public: // User declarations
TWinControl *ParentWindows;
__fastcall TForm3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
//===========================================================================
// Unit3.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
ShowWindow(Handle,SW_HIDE);
if (WindowState == wsMinimized || Caption.Length()==0)
{
Parent=NULL;
Action = caFree;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if (WindowState != wsMinimized && Caption.Length()>0)
PostMessage(ParentWindows->Handle,WM_USER,0,10000+Tag);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormDestroy(TObject *Sender)
{
PostMessage(ParentWindows->Handle,WM_USER,10000+Tag,0);
}
//---------------------------------------------------------------------------
Top




