iCAx开思工具箱

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 24843|回复: 0
打印 上一主题 下一主题

UG/OPEN调用对话框界面的一点心得及疑问(ZZZ请看一下,也请别的大侠指点一下)

[复制链接]
跳转到指定楼层
楼主
发表于 2008-11-16 16:36:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  本人初次接触UG/OPEN的二次开发,目前主要参考"UG OPEN 二次开发与实例精解"及"UG/OPEN API编程基础"两本书。目前在调用对话框界面时碰到一些问题:
1、目前这两本书上的通过MenuScript定制的UG菜单调用对话框的程序实例都是通过UG菜单调用通过UIStyle或MFC定制的对话框进行后续的操作。在讨论其中的一些样程序时,实际还需要通过UG菜单直接调用一用户指定的动作(我在这里用动作action描述这一菜单触发机制,action通常是用户自行定义的function,当中可能含有通过UIStyle或MFC定制的对话框,当中也可能含有的是别的程序实现,如直接由UG/OPEN API提供的常用标准对话框,eg.,uc1603())
2、按照参考书籍上的描述,通过MenuScript定制的UG菜单调用action通常由下述过程完成:
a.通过MenuScript定制UG菜单,如:

!uf_sample_app.men (放在startup目录下)
!==========================================================
VERSION 120
EDIT UG_GATEWAY_MAIN_MENUBAR
TOP_MENU
CASCADE_BUTTON SAMPLE_APP_MENU
LABEL Sample
END_OF_TOP_MENU
MENU SAMPLE_APP_MENU
BUTTON SAMPLE_APP_BUTTON2
LABEL Test Callback Returns
ACTIONS User_defined_fun
END_OF_MENU
!上述语句确保UG启动后在UG/help后面出现Sample菜单
=====================================================================

b.添加事件触发表,如:
UF_MB_cb_status_t User_defined_fun(
UF_MB_widget_t       widget,
UF_MB_data_t      client_data,
UF_MB_activated_button_p_t call_button );

UF_MB_action_t actionTable[] =
{
{ "User_defined_fun", User_defined_fun, NULL   },
{ NULL, NULL, NULL }
};
c.定义事件函数的动作:
static UF_MB_cb_status_t User_defined_fun(
    UF_MB_widget_t             widget,
    UF_MB_data_t               client_data,
    UF_MB_activated_button_p_t call_button )
{
  char msg[133];
  int response=0;
  sprintf(msg, "Response number is %d",response);
  UF_UI_lock_ug_access( UF_UI_FROM_CUSTOM );
  uc1601( msg, 1 );
  UF_UI_unlock_ug_access( UF_UI_FROM_CUSTOM );     
  }

d.完成上述设置后,在ufusr或ufsta中添加应用程序注册即可:
extern DllExport void ufsta(char *param, int *returnCode, int rlen)
{
......
static UF_MB_cb_status_t User_defined_fun(UF_MB_widget_t,UF_MB_data_t,UF_MB_activated_button_p_t);
.......
UF_MB_add_actions( actionTable );
....
}
e.将编译后生成的.dll文件放到startup目录下

按照我阅读前面提到的两本参考书后得到的理解,只要完成上述设置后,我在启动UG后,通过选择主菜单上生成的Sample菜单,点击其中的Test Callback Returns可以弹出在User_defined_fun中设置的uc1601对话框,可是实际上,什么情况也没有发生.百思不得其解后,我只有参考UG/help中的ufx_sample_app.c样程进行分析,发现,实际上在UG/help发布的样程中,起ufsta函数中除了使用UF_MB_add_actions( actionTable );外,应该还使用了调用的应用程序的名称注册程序,具体到目前的程序中,应该是如下表示:
char name[] = "User_defined_fun";
appData.name       = name;
appData.id         = 0;
UF_MB_register_application( &appData );
通过以上程序完成名称的注册后,重新启动Ug,发现现在可以通过UG菜单调用我自己设定的应用函数,显示uc1601对话框。

总结:菜单调用函数的注册不能仅仅是调用函数的MB_add_action(actionTable)调用,还必须通过appData完成调用函数名称的注册(这一项是我参考的以上两本书中没有提到的)。

按照我原来的理解,通过设定actionTable[]结构数组,已经在当中当中列出了与User_defined_funUser_defined_fun关联的响应事件及函数
UF_MB_action_t actionTable[] =
{
{ "User_defined_fun", User_defined_fun, NULL   },
{ NULL, NULL, NULL }
};

这个定义加上前面的UF_MB_add_actions( actionTable );已经足够在通过UG菜单调用响应的事件函数了,因为在参考书中的UIStyle和MFC定制的对话框就是通过上述过程实现的,并没有再进行名称的注册。

为什么通过UG菜单调用UIStyle或MFC定制的对话框不需要名字注册,而调用UG/OPEN API标准对话框却需要进行名字注册?请ZZZ和各位大侠指点一下。

此外,再请教ZZZ一个调试的问题,ZZZ也曾经谈到过UG/OPEN的内部模式程序可以通过Debug在UG内部进行跟踪调试,我也查了相关的书,(以VC++ 6.0为准),谈到可以按如下步骤设置:

a. 选择Project->settings菜单
b. 在Project Settings对话框中选择Debug标号
c. 在"Exceutable for debug session:"中输入ugraf.exe的全路径名并在后面跟上"ugraf.exe".
d. 在"Working directory:",指定Vc++运行ug的目录,公共的工作目录是c:\Temp.
以上内容我都能够理解,但如下内容:
e. 在"rogram arguments"中输入执行UG的参数,其语法与启动ug的语法一致。这当中谈到的参数是什么参数,又用了什么语法?ZZZ或者哪位大侠能够详细指点一下?谢谢了

我现在只能自己设定一个变量,然后通过对话框显示变量值跟踪对应位置的程序执行情况,繁琐且不方便.所以希望能够采用如上所谈到的方式对内部模式程序进行调试.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 支持支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手板模型制作,在线3D打印服务

QQ|小黑屋|手机版|开思工具箱 CAD工具箱_CAM工具箱  

GMT+8, 2024-11-29 00:13 , Processed in 0.012995 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表