iCAx开思工具箱

标题: 生成两层MFC DLL对话框的问题? [打印本页]

作者: dreamerwj    时间: 2004-8-18 09:03
标题: 生成两层MFC DLL对话框的问题?
   我现在要做一个标准件库(盘起工业标准件库),数据存在SQL Server中,零件
  
用Grip程序绘制,由于标准件种类与尺寸系列繁多,在UG界面中我想做两层对话框。
   第一个为公共界面(一个MFC DLL程序,负责选择标准件种类),第二层为具体零
  
件对话框(MFC DLL编制的多个.dll文件,负责选择尺寸系列并生成零件)。
   我想让第一个对话框中有一个按钮通过控件选择定位出具体零件对应的.dll文件
  
路径并调用其对应的对话框,然后第一个对话框消失,通过第二个对话框生成零件。  
  
  现在我在第一个对话框的一个按钮中编写以下代码:
  typedef void (WINAPI * TESTDLL)();
  HINSTANCE hmod;
  hmod = :oadLibrary ("E:/liebiao *** u.dll");
  if(hmod==NULL)
  {
  AfxMessageBox("Fail");
  }
  TESTDLL lpproc;
  lpproc = (TESTDLL)GetProcAddress (hmod,"DisplayDialog");
  if(lpproc!=(TESTDLL)NULL)
    (*lpproc)();
  FreeLibrary(hmod);
可以调出第二个对话框,但此时第一个对话框却不关闭,并由此导致点击第二层对话
  
框中的按钮不能够在UG环境中生成零件(本来设置好UG环境,单独调用该.dll是可以
  
生成零件的,但作为一个仅提供对话框资源的DLL,在其中设置UG环境的语句根本不起
  
作用。)
以下是第二层对话框对应的Dll程序调用对话框的函数:
extern "C" __declspec(dllexport) void DisplayDialog()
{
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
       CMyDialog dlg;
     dlg.DoModal();
}
  
大家帮我看看怎么通过第二个对话框在UG环境中生成零件。
作者: 深夜摔键盘    时间: 2004-8-18 10:35
不太清楚你的意图,不在其位呀。
  
如果你采用LOAD 第二个DLL,来显示第二个对话框,可是,你第二个对话框中控件的消息你打算怎么处理?另外,第一个对话框应该是你自己去关闭,都第二个对话框出现后,第一个不可能自动关闭的。
  
为什么不用UI STYLER来做对话框?我觉得你的问题如果使用UI STYLER的对话框嵌套机制应该很容易的解决的。
作者: haiying    时间: 2004-8-18 11:01
按你的做法, 第一个对话框不会自动消失,不过可以通过第二个对话框生成图形的,要在第二个对话框中添加ug  的入口函数。
作者: suye007    时间: 2004-8-18 14:12
haiying wrote:
按你的做法, 第一个对话框不会自动消失,不过可以通过第二个对话框生成图形的,要在第二个对话框中添加ug  的入口函数。

  
对,既然单独调用第二个对话框的dll可以生成图形,就应该可以实现
作者: dreamerwj    时间: 2004-8-18 17:09
第二个对话框能够运行是因为它是加入了UG头文件,并设置好了UG的入口函数;但现在通过LoadLibrary();GetProcAddress ();FreeLibrary()这种方式调用对话框(和纯粹的VC调用dll无区别),因此,UG头文件和UG的入口函数在这里就成为摆设,要是UG/OPEN API提供了一种调用自己的.dll的函数多好。
用UI STYLER来做对话框,由于设计到多个数据库和众多的数据表,我想它是难胜其任。
大家帮想一个好的解决办法吧!
作者: 深夜摔键盘    时间: 2004-8-18 17:48
UI STYLER来做对话框,,控件少了点,但是和库/表的多少应该没多少关系。
  
你的问题,就在于怎样响应第二个对话框中控件的消息。
可以查一下关于MFC扩展DLL的资料,只有这个才可以导出一个类,也就是你第二个对话框的类!把类定义导了出来,那么在第一个DLL中可以初始化第二个对话框类的对象,这样,它的所有控件信息才可以被响应。
  
-------个人观点,仅供参考。
作者: dreamerwj    时间: 2004-8-18 21:35
深夜摔键盘 ,你前面说用UI STYLER的对话框嵌套机制。那第二层UI Styler对话框(具体零件对应一个数据库的多个表,应分给多人完成)想用ADO连接,该怎么连接?最后怎么把别人编写的UI Styler文件包含进来?我总觉的还是离不开MFC DLL。望指点迷径,最好能够给一个参考例子(zhouhaifeng_2001@hotmail.com),谢谢!
作者: 深夜摔键盘    时间: 2004-8-19 07:59
在第二个DLL中,把ADO的三个智能指针搞成全局对象,可以在第二个对话框的构造函数中初始化组件,打开一个库连接就可以,然后在各控件的回调函数中对数据库进行读写操作。
参考例子,我手头也没有,以前论坛里有几个多重对话框嵌套的例子,你问问他们,看看谁有。至于你说的第二个UI STYLER的文件怎么包含,可以参考帮助中的extern int UF_STYLER_create_dialog (
char * dialog_file,  
UF_STYLER_callback_info_t * cbs,  
int number_of_cbs,  
void * client_data,  
int * response );
  
其中第二个参数,就是控件的回调函数,UG为你做好了你想要的。
作者: dreamerwj    时间: 2004-8-19 10:14
我这里有一个程序,帮看看是不是要在test.cpp中定义ADO的三个智能指针和一些通用函数(可被UI Styler对话框控件响应函数调用),其他的.c、.h文件直接加载进去,并在各自UI Styler 对话框.c文件中定义extern int <enter the name of your function> ( int *response )用来响应。
作者: 深夜摔键盘    时间: 2004-8-20 02:23
其他人写得style对话框作为你得二级对话框时,将UI STYLER生成得C文件编译为DLL,将所有控件响应函数都定义为输出函数,所有数据类型得声明都放在头文件中。
  
在第一个对话框的VC工程中,把第二个对话框的lib文件包进去,头文件也包进去。然后在第一个对话框的某个控件响应函数中使用 UF_STYLER_create_dialog 来创建第二个对话框即可。
作者: dreamerwj    时间: 2004-8-20 13:42
我先做做看!
作者: hd726    时间: 2010-1-7 16:47
我也下载了试试
哪位大哥有UI的教程啊?
作者: printsimp    时间: 2010-1-8 22:56
好像很复杂




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3