MFC中如何将对话框封装成dll并内嵌到主界面上

xdjinjian 2014-12-07 02:01:56
网上关于封装dll的有很多 但都是弹出型的 即弹出一个额外的对话框,如何将对话框内嵌到主界面上? 我将被调用的对话框的样式选择child后 是内嵌进去了 但是运行时会出错
...全文
2597 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhllxt 2014-12-10
  • 打赏
  • 举报
回复
引用 10 楼 xdjinjian 的回复:
[quote=引用 8 楼 zhllxt 的回复:] [quote=引用 6 楼 xdjinjian 的回复:] 十分感谢 就是有个小问题 弹出的对话框不会跟随主界面移动 设置了 child也不行 难道只能用 onmove 然后传rect 给子对话框 从新设置位置来实现吗
不可能的,在对话框的图形编辑器上直接设置Style:Child是肯定会自动随着父窗口移动的,我做的现成的程序在这呢,客户都用了几年了,但是父窗口尺寸变了,需要主动在父窗口的OnSize里去通知new出来的子窗口,从而子窗口也手动MoveWindow来改变大小。[/quote] 你的 是通过dll 调用的吗?[/quote] 确定是通过基于MFC的DLL调用的,而且有十几个这样的DLL,每调用一个DLL导出函数生成一个WS_CHILD的子对话框,就在主对话框中建立一个选项卡与其对应。
xdjinjian 2014-12-09
  • 打赏
  • 举报
回复
引用 8 楼 zhllxt 的回复:
[quote=引用 6 楼 xdjinjian 的回复:] 十分感谢 就是有个小问题 弹出的对话框不会跟随主界面移动 设置了 child也不行 难道只能用 onmove 然后传rect 给子对话框 从新设置位置来实现吗
不可能的,在对话框的图形编辑器上直接设置Style:Child是肯定会自动随着父窗口移动的,我做的现成的程序在这呢,客户都用了几年了,但是父窗口尺寸变了,需要主动在父窗口的OnSize里去通知new出来的子窗口,从而子窗口也手动MoveWindow来改变大小。[/quote] 你的 是通过dll 调用的吗?
xdjinjian 2014-12-09
  • 打赏
  • 举报
回复
引用 8 楼 zhllxt 的回复:
[quote=引用 6 楼 xdjinjian 的回复:] 十分感谢 就是有个小问题 弹出的对话框不会跟随主界面移动 设置了 child也不行 难道只能用 onmove 然后传rect 给子对话框 从新设置位置来实现吗
不可能的,在对话框的图形编辑器上直接设置Style:Child是肯定会自动随着父窗口移动的,我做的现成的程序在这呢,客户都用了几年了,但是父窗口尺寸变了,需要主动在父窗口的OnSize里去通知new出来的子窗口,从而子窗口也手动MoveWindow来改变大小。[/quote] 额 如果子对话框 用 dll调用的话 就会不跟着移动的
zhllxt 2014-12-09
  • 打赏
  • 举报
回复
引用 6 楼 xdjinjian 的回复:
十分感谢 就是有个小问题 弹出的对话框不会跟随主界面移动 设置了 child也不行 难道只能用 onmove 然后传rect 给子对话框 从新设置位置来实现吗
不可能的,在对话框的图形编辑器上直接设置Style:Child是肯定会自动随着父窗口移动的,我做的现成的程序在这呢,客户都用了几年了,但是父窗口尺寸变了,需要主动在父窗口的OnSize里去通知new出来的子窗口,从而子窗口也手动MoveWindow来改变大小。
zhllxt 2014-12-08
  • 打赏
  • 举报
回复
思路: 1、新建基于MFC的DLL,在DLL中做一个导出函数,在该导出函数中new出对话框类,导致函数返回CWnd*也就是new出来的窗口实例指针。如下:
CWnd *  InitData( CWnd * pWnd/*父窗口指针,由调用者传入,一般是主对话框*/ )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CDlgCKTD * pDlg = new CDlgCKTD;
	if( pDlg->Create( CDlgCKTD::IDD,CWnd::FromHandle( pWnd->GetSafeHwnd() ) ) )
	{
		pDlg->SetParent( pWnd );
		pDlg->ShowWindow( SW_SHOW );

		return pDlg;
	}
	return NULL;
}
2、在主对话框中加载动态库并调用导出函数,获取DLL中的子窗口句柄,然后进行显示,移动位置等操作。
void CMainFrame::Load(CString strModuleName,CString strTitle,LPARAM lParam/* = 0*/ )
{
	//判断选项卡个数是否超过设定
	CIni ini;
	if( m_wndTab.GetItemCount() >= (int)ini.GetInt( _T("system"),_T("maxtabs"),10 ) )
	{
		_STARTPROMPT;
		if( StartPrompt ) StartPrompt( PROMPT_TYPE_POPUP,_T("选项卡过多,请关闭某些选项卡后再尝试打开!"),0x0000ff,PROMPT_POS_TOP_CENTER,this,NULL,FALSE );
		return;
	}
	HMODULE hDll = LoadLibrary( strModuleName );
	if( hDll )
	{
		typedef CWnd * ( * INTIDATA)(CWnd *);
		INTIDATA InitData = (INTIDATA)GetProcAddress( hDll,"InitData" );
		if( InitData )
		{
			unsigned int uVersion = 0;
			CWnd * pWnd = InitData( GetActiveView() );
			if( pWnd )
			{
					pWnd->ShowWindow( SW_SHOWNORMAL );
					pWnd->UpdateWindow();
			}
		}
	}
}
3、在DLL中用WS_CHILD形式的窗口并附加在主窗口中会出现的问题是:WS_CHILD窗口中TAB键会失效,解决办法参见:http://support.microsoft.com/kb/233263/zh-cn
xdjinjian 2014-12-08
  • 打赏
  • 举报
回复
引用 5 楼 Sandrer 的回复:
[quote=引用 2 楼 xdjinjian 的回复:] 主界面 typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("mfcdll.dll"); if(hmod==NULL) { AfxMessageBox("Fail"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress (hmod,"Show"); if(lpproc!=(TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod);
最后的调用为什么要加“*”号呢?[/quote] 额 我在网上找的 貌似这样可以
xdjinjian 2014-12-08
  • 打赏
  • 举报
回复
引用 4 楼 zhllxt 的回复:
思路: 1、新建基于MFC的DLL,在DLL中做一个导出函数,在该导出函数中new出对话框类,导致函数返回CWnd*也就是new出来的窗口实例指针。如下:
CWnd *  InitData( CWnd * pWnd/*父窗口指针,由调用者传入,一般是主对话框*/ )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CDlgCKTD * pDlg = new CDlgCKTD;
	if( pDlg->Create( CDlgCKTD::IDD,CWnd::FromHandle( pWnd->GetSafeHwnd() ) ) )
	{
		pDlg->SetParent( pWnd );
		pDlg->ShowWindow( SW_SHOW );

		return pDlg;
	}
	return NULL;
}
2、在主对话框中加载动态库并调用导出函数,获取DLL中的子窗口句柄,然后进行显示,移动位置等操作。
void CMainFrame::Load(CString strModuleName,CString strTitle,LPARAM lParam/* = 0*/ )
{
	//判断选项卡个数是否超过设定
	CIni ini;
	if( m_wndTab.GetItemCount() >= (int)ini.GetInt( _T("system"),_T("maxtabs"),10 ) )
	{
		_STARTPROMPT;
		if( StartPrompt ) StartPrompt( PROMPT_TYPE_POPUP,_T("选项卡过多,请关闭某些选项卡后再尝试打开!"),0x0000ff,PROMPT_POS_TOP_CENTER,this,NULL,FALSE );
		return;
	}
	HMODULE hDll = LoadLibrary( strModuleName );
	if( hDll )
	{
		typedef CWnd * ( * INTIDATA)(CWnd *);
		INTIDATA InitData = (INTIDATA)GetProcAddress( hDll,"InitData" );
		if( InitData )
		{
			unsigned int uVersion = 0;
			CWnd * pWnd = InitData( GetActiveView() );
			if( pWnd )
			{
					pWnd->ShowWindow( SW_SHOWNORMAL );
					pWnd->UpdateWindow();
			}
		}
	}
}
3、在DLL中用WS_CHILD形式的窗口并附加在主窗口中会出现的问题是:WS_CHILD窗口中TAB键会失效,解决办法参见:http://support.microsoft.com/kb/233263/zh-cn
十分感谢 就是有个小问题 弹出的对话框不会跟随主界面移动 设置了 child也不行 难道只能用 onmove 然后传rect 给子对话框 从新设置位置来实现吗
Sandrer 2014-12-08
  • 打赏
  • 举报
回复
引用 2 楼 xdjinjian 的回复:
主界面 typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("mfcdll.dll"); if(hmod==NULL) { AfxMessageBox("Fail"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress (hmod,"Show"); if(lpproc!=(TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod);
最后的调用为什么要加“*”号呢?
xdjinjian 2014-12-07
  • 打赏
  • 举报
回复
dll 函数 Show extern "C" __declspec(dllexport) void Show() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CTest test; test.DoModal (); }
xdjinjian 2014-12-07
  • 打赏
  • 举报
回复
主界面 typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("mfcdll.dll"); if(hmod==NULL) { AfxMessageBox("Fail"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress (hmod,"Show"); if(lpproc!=(TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod);
lis2012 2014-12-07
  • 打赏
  • 举报
回复
你调用的代码怎么写的?

15,977

社区成员

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

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