vc 怎么将MFC dll 的对话框 嵌入到 主对话框中?

apolloj 2010-03-31 05:50:50
分不多,请大侠指点一下。
如图片,http://hi.baidu.com/apolloj/album/item/b55de91f733699c21ad57660.html
VC2008中,我能在主对话框中调用DLL中的对话框,但我想将DLL中的对话框嵌入到主对话中,使两个对话框成为一个整体。
有什么办法实现?
...全文
641 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
glidingcloud 2011-05-03
  • 打赏
  • 举报
回复
luguo zishu.exe
jjjweiren 2011-01-22
  • 打赏
  • 举报
回复
各位高手,对于这个问题,能否给个能运行的代码给小弟。万分感激。
s669pengwei 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 apolloj 的回复:]
谢谢 arpnet99.
可以了,DLL对话框现在可以嵌入主对话框了, 不是很明白为什么一定要用无模式对话框。
请问在删除DLL时,pG_dlg->PostMessage(WM_CANCELMODE); 是发给谁的?主对话框吗?

贴出代码:
DLL中:
DLLDialog *pG_dlg;
extern "C" __declspec(dllexport) void ShowDlg(……
[/Quote]
我这样做是不成功的,pG_dlg->Create(IDD_DIALOG2)不能执行,触发ASSERT
瓶盒 2010-04-02
  • 打赏
  • 举报
回复
我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)
apolloj 2010-04-02
  • 打赏
  • 举报
回复
怎么给分啊?
apolloj 2010-04-02
  • 打赏
  • 举报
回复
明白了,谢谢楼上的。我的目标是做成一个统一的框架,然后,调用不周的DLL实现不对功能应用.
不知道 DLL 对话框能不能嵌入主对话框的 TabCtrl 控件中。如果行,我就在主对话框中做一个TabCtrl。
在TabCtrl的不同页嵌入不同的DLL对话框。
这不是鸭头 2010-04-02
  • 打赏
  • 举报
回复
pG_dlg->PostMessage(WM_CANCELMODE);
这个消息是销毁dll中的对话框
如果想整个程序直接退出用WM_CLOSE
apolloj 2010-04-02
  • 打赏
  • 举报
回复
谢谢 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;
}
}
这不是鸭头 2010-04-02
  • 打赏
  • 举报
回复
扩展dll中对话框的属性设为child
属性中设置....
这不是鸭头 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 apolloj 的回复:]
引用 14 楼 arpnet99 的回复:
引用 11 楼 apolloj 的回复:
引用 10 楼 bottlebox 的回复:
我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)

你是说在DLL 中用函数设成CHILD?我照你的方法试了,可是跟POP类型没有区别啊?
extern "C"……
[/Quote]
你要把扩展dll中的对话框属性设置成child
apolloj 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 arpnet99 的回复:]
引用 11 楼 apolloj 的回复:
引用 10 楼 bottlebox 的回复:
我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)

你是说在DLL 中用函数设成CHILD?我照你的方法试了,可是跟POP类型没有区别啊?
extern "C" __declspec(dllexport) ……
[/Quote]
使用无模式对话框如下,仍然不能将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);
}
}

}
这不是鸭头 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 apolloj 的回复:]
引用 10 楼 bottlebox 的回复:
我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)

你是说在DLL 中用函数设成CHILD?我照你的方法试了,可是跟POP类型没有区别啊?
extern "C" __declspec(dllexport) void ShowDlg(CWnd *p) ……
[/Quote]
我都用无模式对话框....
模式对话框的没有试过....
这不是鸭头 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bottlebox 的回复:]
对话框风格要改为child类型
[/Quote]
//#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;
}
}
副组长 2010-04-02
  • 打赏
  • 举报
回复
你是什么DLL?
apolloj 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bottlebox 的回复:]
我原来经验是窗口风格保留默认的pop类型,在程序中建立后,用CWnd::ModifyStyle动态的加上一个child风格。(pop风格不去掉)
[/Quote]
你是说在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();
}
apolloj 2010-04-01
  • 打赏
  • 举报
回复
回楼上:
对话框属性设置child, 会如下图所示。不响应任何消息。只能强行中止进程。
http://hi.csdn.net/space-254387-do-album-picid-506632.html

构造对象时就将父窗口,送过去。可以效果一样。
extern "C" __declspec(dllexport) void ShowDlg(CWnd *p)
{
DLLDialog dllDialog(p);
SullenSun 2010-04-01
  • 打赏
  • 举报
回复
没试过,按上面的做应该没有问题。。
oyljerry 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 apolloj 的回复:]
我按楼上的1楼的方法试了,如果编译成DEBUG版,运行到 dllDialog.SetParent(p); 这一行时会报错,点忽略,会继续执行,导出对话框,如果运行RELEASE版,则不会.两个版本都不会使DLL对话框嵌入主对话窗啊.

DLL中的对话框导出函数:
extern "C" __declspec(dllexport) void ShowDlg(CWnd *p)
{
DLLDia……
[/Quote]
对话框构造函数中有个参数就是指定父窗口,子对话框属性设置child
瓶盒 2010-04-01
  • 打赏
  • 举报
回复
对话框风格要改为child类型
apolloj 2010-04-01
  • 打赏
  • 举报
回复
没有人帮我啊?
加载更多回复(4)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧