分不多,请大侠指点一下。
如图片,http://hi.baidu.com/apolloj/album/item/b55de91f733699c21ad57660.html
VC2008中,我能在主对话框中调用DLL中的对话框,但我想将DLL中的对话框嵌入到主对话中,使两个对话框成为一个整体。
有什么办法实现?
如图片,http://hi.baidu.com/apolloj/album/item/b55de91f733699c21ad57660.html
VC2008中,我能在主对话框中调用DLL中的对话框,但我想将DLL中的对话框嵌入到主对话中,使两个对话框成为一个整体。
有什么办法实现?
解决方案 »
- 与网站通信都有什么类
- 网络编程中怎么跨地区也能通信呢
- 关于VC简单的透明绘图 bitblt
- 我想在vc程序中调一个网页和一个exe应用程序怎么办?
- 如何使用Hook技术在Windows中禁止她人删除特定的文件
- 为什么在循环中使用CDC *pDC=this->GetDC();会内存泄露
- 急:如何改计算机名?SetComputerName?SetComputerNameEx
- 我实在是没有招数了。为什么相同的用法,::Ellipse,而::Rectangle会出问题。300分!
- 谢谢!ytandwy(云天) 。请进来拿分!
- MFC ClistBox判断选中的问题。
- vc 大量数据存储问题
- 请教VC的工程里stdafx.h文件的作用?
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 *
}
对话框属性设置child, 会如下图所示。不响应任何消息。只能强行中止进程。
http://hi.csdn.net/space-254387-do-album-picid-506632.html构造对象时就将父窗口,送过去。可以效果一样。
extern "C" __declspec(dllexport) void ShowDlg(CWnd *p)
{
DLLDialog dllDialog(p);
extern "C" __declspec(dllexport) void ShowDlg(CWnd *p)
{
DLLDialog dllDialog(p);
DWORD style = dllDialog.GetStyle();
dllDialog.ModifyStyle(style,WS_CHILD,1);
dllDialog.DoModal();
}
#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;
}
}
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);
}
}}
属性中设置....
可以了,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;
}
}
这个消息是销毁dll中的对话框
如果想整个程序直接退出用WM_CLOSE
不知道 DLL 对话框能不能嵌入主对话框的 TabCtrl 控件中。如果行,我就在主对话框中做一个TabCtrl。
在TabCtrl的不同页嵌入不同的DLL对话框。