荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: scanf (carefully), 信区: Visual
标 题: 这样在dll中创建窗体![转载]
发信站: 荔园晨风BBS站 (Wed Oct 22 11:57:31 2003), 站内信件
这两天老有问这个问题,我就对此简单地写了一个小结,有不足之处,还请指出,谢
谢。
调用DLL中的Dlg或SDI/MDI, 只是不能再使用APP类了,因为它是从CWinThread继承过
来,内部的线程机制导出了问题的出现。
(1)对于调用DLL中的Dialog,很简单,直接调用就是
如: extern "C"
void LoadDialog()
{
CTestDlg dlg;
if (dlg.DoModal == IODK)
{
//......
}
}
(2)对于调用DLL中的SDI/MDI, 不那么直接。需要保证Doc/View和MainFrame之间的
关联,因此得保留原来在APP中用的CDocTempate类及对它的使用。为此,我们可以自己
建一个类如CSDIMain来做接替原来APP中的工作(当然不用类,就直接用问题也不大,毕
竟都是创建工作都是在堆上进行的),
如:
BOOL CSDIMain::InitInstance()
{
// 创建模板
if(m_pTemplate == NULL)
{
m_pTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDIForTestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDIForTestView));
}
CSDIForTestDoc* pDocument = new CSDIForTestDoc;
// 创建新的frame
CFrameWnd* pFrame = m_pTemplate->CreateNewFrame(pDocument, NULL);
if (NULL == pFrame)
{
AfxMessageBox("Create frame failed");
return FALSE;
}
调用如:
extern "C"
void LoadSDI()
{
CSDIMain sdi;
sdi.InitInstance();
}
就样子,就搞定了。
BTW: 如果你是将一个EXE工程移到DLL中,在Copy h文件和cpp文件时,不要忘记
把资源也拷过来,否则,当然是会出错的。因为Frame中用到了
--
→我:(打劫内裤,快脱,不然,老子毙了你!)
看 ● ○ ╮╮ 看
↓ █┳ ┗█┛ \█/ 我倒!~~↓
面 ┏┓ ┛┗ ● 面
→你:(大哥,我今天没穿啊,不要~不要啊!)
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.110]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店