马上注册登录,享用更多网站功能!
您需要 登录 才可以下载或查看,没有帐号?立即注册
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或者哪位大侠能够详细指点一下?谢谢了
我现在只能自己设定一个变量,然后通过对话框显示变量值跟踪对应位置的程序执行情况,繁琐且不方便.所以希望能够采用如上所谈到的方式对内部模式程序进行调试. |