荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店