MFC调用对话框dll弹出非模态对话框


思路:
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();
			}
		}
	}
}



转载出处:http://bbs.csdn.net/topics/390948839

你可能感兴趣的:(MFC)