没有高手做过吗?加分到150了!!有关dll导出dialog,做为MDI子窗体显示问题.大家帮忙看看呀,分多哟.

1982pc 2007-08-02 09:49:15

情况是这样,我现在已经生成一个了一个dll的dialog工程,然后在这里面我自己写了一个导出类CReashExport,里面有一个函数为,
void CReashExport::ShowReashDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CReashDlg dlg;
dlg.DoModel();
}

在其他模块我只需要:
void CReashDlgTestDlg::OnOK()
{
CReashExport exportDlg;
exportDlg.ShowReashDlg();
}
就可以显示这里模块了.

但现在我需要将我的dailog显示做为在一个多文本的对话框的子窗体中,就想他本身的自窗体一个效果,该怎么改呢?试了不少方法,都有问题.各位帮忙看看.

原贴http://community.csdn.net/Expert/topic/5682/5682522.xml?temp=.1387293

解决者,两边都给分,谢谢啦
...全文
226 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
1982pc 2007-08-02
  • 打赏
  • 举报
回复
写错了就是MDI里的子窗体效果,你给那段好象不能有相应的效果呢。
guxingfeiyu 2007-08-02
  • 打赏
  • 举报
回复
文本对话框?指的是什么?让窗体出现在一个文本框中?父窗口的句柄传递为这个文件框的句柄。窗体类型设置为WS_CHILD。
1982pc 2007-08-02
  • 打赏
  • 举报
回复
回 guxingfeiyu(孤星飞雨):
你这个方法在其他地方调用的时候是不是该
exportDlg = new CReashExport();
HWND temp = exportDlg->ShowReashDlg(this->m_hWnd);
::ShowWindow(temp,SW_SHOW);
如果是的话,好象也只是子窗体,也没有实现像对文本对话框中子窗体的效果.

回dazedase(什么也不懂,什么也不会,所以我是菜星)(▲▲▲▲▲→★)

你的方法可行也确实实现效果了,但这个子窗体会覆盖到上面那些快捷工具条该怎么调整呢?(还有你忘了句,ShowWindow;)


哎为什么我以前直接传父窗体的this指针进来

这样
ShowReashDlg(Cwnd* hparent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pReash=new CReashDlg(); // pReash是CReashDlg类型的全局对话框指针,其资源必须设置为Child属性
pReash->Create(IDD_REASH,hparent);
pReash->ShowWindow(SW_SHOW);
}
就不得行呢?必须是窗口句柄;
dazedase 2007-08-02
  • 打赏
  • 举报
回复
把导出类的CReashDlg设置成非模态(不能DoModal),然后修改ShowReashDlg函数加上一个参数:
ShowReashDlg(HWND hparent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pReash=new CReashDlg(); // pReash是CReashDlg类型的全局对话框指针,其资源必须设置为Child属性
pReash->Create(IDD_REASH);
SetParent(pReash->m_hWnd,hparent);
}
在其他模块你只需要:
void CReashDlgTestDlg::OnOK()
{
//CReashExport exportDlg; 必须将exportDlg改为CReashDlgTestDlg的全局指针
pexportDlg=new CReashExport();
pexportDlg->ShowReashDlg(this->m_hWnd);
}
guxingfeiyu 2007-08-02
  • 打赏
  • 举报
回复
做法:
1、dll中定义一个全局指针变量CReashDlg * m_pMyDlg,在Dll初始化的时候m_pMyDlg = NULL。
2、dll中创建对话框的函数这样做:
HWND CreateDlg(HWND m_pParentDlg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd * pParentWnd = CWnd::FromHandle(m_pParentDlg);
if(m_pMyDlg)delete m_pMyDlg;

m_pMyDlg = new CReashDlg();
m_pMyDlg->Create(IDD_REASHDLG,pParentWnd );
return m_pMyDlg->GetSafeHwnd();
}
3、可以把CreateDlg的返回值保存到主程序的变量中,象其他对话框操作一样。
4、在退出DLL的部分if(m_pMyDlg) delete m_pMyDlg;m_pMyDlg = NULL;
sxcong 2007-08-02
  • 打赏
  • 举报
回复
Dialog也是Wnd,和View一样处理
无模,然后MoveWindow
1982pc 2007-08-02
  • 打赏
  • 举报
回复
那就是说我在一个CFormView类里调用就可以了?
guxingfeiyu 2007-08-02
  • 打赏
  • 举报
回复
要传的是View的句柄,MainFrm是主框架啊,当然是不行!!
1982pc 2007-08-02
  • 打赏
  • 举报
回复
这段代码就是在这个MainFrm类调用的呀
exportDlg = new CReashExport();
HWND temp = exportDlg->ShowReashDlg(this->m_hWnd);
::ShowWindow(temp,SW_SHOW);
guxingfeiyu 2007-08-02
  • 打赏
  • 举报
回复
MDI的子窗体效果也是可以的啊。你把CXXXView的句柄作为父窗体句柄传进去,然后用MoveWindow设置窗体位置。

15,979

社区成员

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

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