分不多,请大侠指点一下。
如图片,http://hi.baidu.com/apolloj/album/item/b55de91f733699c21ad57660.html
VC2008中,我能在主对话框中调用DLL中的对话框,但我想将DLL中的对话框嵌入到主对话中,使两个对话框成为一个整体。
有什么办法实现?

解决方案 »

  1.   

    调用DLL函数时,把主对话框的句柄作为参数传递进去,然后DLL中把参数中的句柄作为父窗口创建对话框..
      

  2.   

    我按楼上的1楼的方法试了,如果编译成DEBUG版,运行到 dllDialog.SetParent(p); 这一行时会报错,点忽略,会继续执行,导出对话框,如果运行RELEASE版,则不会.两个版本都不会使DLL对话框嵌入主对话窗啊.DLL中的对话框导出函数:
    extern "C" __declspec(dllexport) void ShowDlg(CWnd *p) 
    {
        DLLDialog dllDialog;
        dllDialog.SetParent(p);  //设置父窗口。
        dllDialog.DoModal();
    }在主对话框的按键响应函数:
    void CDialog_DLLLoadDlg::OnBnClickedLoaddll()
    {
         // TODO: 在此添加控件通知处理程序代码
          typedef void (*lpFun)(CWnd *p);
         HINSTANCE hDll; //DLL句柄 
          hDll = LoadLibrary(_T("reg_dll_static.dll"));
         if (NULL==hDll)
         {
               AfxMessageBox(_T("DLL加载失败"));
       return ;
         }
         lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");
         if (NULL==pShowDlg)
         {
            AfxMessageBox(_T("DLL中函数寻找失败")); 
    return ;
         }
         pShowDlg(this->GetOwner());  //调用DLL对话窗,并传送主对窗CWnd *
    }
      

  3.   

    对话框构造函数中有个参数就是指定父窗口,子对话框属性设置child
      

  4.   

    回楼上:
    对话框属性设置child, 会如下图所示。不响应任何消息。只能强行中止进程。
    http://hi.csdn.net/space-254387-do-album-picid-506632.html构造对象时就将父窗口,送过去。可以效果一样。
    extern "C" __declspec(dllexport) void ShowDlg(CWnd *p) 
    {
        DLLDialog dllDialog(p);
      

  5.   

    我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)
      

  6.   

    你是说在DLL 中用函数设成CHILD?我照你的方法试了,可是跟POP类型没有区别啊?
    extern "C" __declspec(dllexport) void ShowDlg(CWnd *p) 
    {
        DLLDialog dllDialog(p);
    DWORD style = dllDialog.GetStyle();
        dllDialog.ModifyStyle(style,WS_CHILD,1);
        dllDialog.DoModal();
    }
      

  7.   

    //#include <stdafx.h>
    #include "DLL_Dlg.h"CDLL_Dlg *pG_dlg;
    extern "C" __declspec(dllexport) void ShowDlg(CWnd*pParentCWnd)
    {
    if (pG_dlg==NULL)
    {
    pG_dlg = new CDLL_Dlg;

    if (pG_dlg)
    {
    pG_dlg->m_pRectangle = pParentCWnd;
    pG_dlg->Create(IDD_DIALOG_DLL);
    pG_dlg->ShowWindow(TRUE);
    }
    }}
    extern "C" __declspec(dllexport) void ExitDlg()
    {
    if (pG_dlg)
    {
    pG_dlg->PostMessage(WM_CANCELMODE);
    delete pG_dlg;
    pG_dlg = NULL;
    }
    }
      

  8.   

    使用无模式对话框如下,仍然不能将DLL对话框嵌入到主对话框中,仍然是分开的两个对话框啊.
    DLLDialog *pG_dlg;
    extern "C" __declspec(dllexport) void ShowDlg(CWnd*pParentCWnd)
    {
        if (pG_dlg==NULL)
        {
            pG_dlg = new DLLDialog;
            DWORD style = pG_dlg->GetStyle();
            pG_dlg->ModifyStyle(style,WS_CHILD,1);
            if (pG_dlg)
            {
    pG_dlg->SetParent(pParentCWnd);
                pG_dlg->Create(IDD_DIALOG2);
                pG_dlg->ShowWindow(TRUE);
            }
        }}
      

  9.   

    你要把扩展dll中的对话框属性设置成child
      

  10.   

    扩展dll中对话框的属性设为child
    属性中设置....
      

  11.   

    谢谢 arpnet99.
    可以了,DLL对话框现在可以嵌入主对话框了, 不是很明白为什么一定要用无模式对话框。
    请问在删除DLL时,pG_dlg->PostMessage(WM_CANCELMODE); 是发给谁的?主对话框吗?贴出代码:
    DLL中:
    DLLDialog *pG_dlg;
    extern "C" __declspec(dllexport) void ShowDlg(CWnd* pParentCWnd)
    {
        if (pG_dlg==NULL)
        {
            pG_dlg = new DLLDialog(pParentCWnd);
            if (pG_dlg)
            {
                pG_dlg->Create(IDD_DIALOG2);
    pG_dlg->ShowWindow(TRUE);
            }
        }
    }
    extern "C" __declspec(dllexport) void ExitDlg()
    {
        if (pG_dlg)
        {
            pG_dlg->PostMessage(WM_CANCELMODE);
            delete pG_dlg;
            pG_dlg = NULL;
        }
    }主框中:
    void CDialog_DLLLoadDlg::OnBnClickedLoaddll()
    {
    // TODO: 在此添加控件通知处理程序代码
     typedef void (*lpFun)(CWnd *p);
     if (NULL!=m_hDll)
     {return ;}
         m_hDll = LoadLibrary(_T("reg_dll_static.dll"));
         if (NULL==m_hDll)
         {
               AfxMessageBox(_T("DLL加载失败"));
       return ;
         }
         lpFun pShowDlg = (lpFun)GetProcAddress(m_hDll,"ShowDlg");
         if (NULL==pShowDlg)
         {
            AfxMessageBox(_T("DLL中函数寻找失败")); 
    return ;
         }
     pShowDlg(this->GetDlgItem(IDC_STATIC));
    }void CDialog_DLLLoadDlg::OnBnClickedLoaddll2()
    {
    // TODO: 在此添加控件通知处理程序代码
    typedef void (*lpFun)(void);
    if (NULL!=m_hDll)
    {
    lpFun pDelDlg = (lpFun)GetProcAddress(m_hDll,"ExitDlg");
    pDelDlg();
    FreeLibrary(m_hDll);
    m_hDll=NULL;
    }
    }
      

  12.   

    pG_dlg->PostMessage(WM_CANCELMODE); 
    这个消息是销毁dll中的对话框
    如果想整个程序直接退出用WM_CLOSE
      

  13.   

    明白了,谢谢楼上的。我的目标是做成一个统一的框架,然后,调用不周的DLL实现不对功能应用.
    不知道 DLL 对话框能不能嵌入主对话框的 TabCtrl 控件中。如果行,我就在主对话框中做一个TabCtrl。
    在TabCtrl的不同页嵌入不同的DLL对话框。
      

  14.   

    我这样做是不成功的,pG_dlg->Create(IDD_DIALOG2)不能执行,触发ASSERT