PS:调用内部函数难在没有函数说明,很多东西要自己去猜!要习惯NX官方的函数思路
1、找函数,我偷懒找了 王牌飞行员_里海 写的博客 :https://www.cnblogs.com/KMould/p/14107352.html,他博客还有对应函数的参数、修饰!
MT_set_ug_title为NX标题设置函数,以下是函数参数和修饰
2、使用内部函数:
//加载dll
auto libugui = LoadLibrary("libugui.dll");
if (libugui)
{
//声明函数指针,和导出dll时头文件中函数类型一致
typedef void(*SetNXTitle)(char* title,int a);
SetNXTitle MyFunc;
//通过函数名获取函数在dll中的地址
MyFunc = (SetNXTitle)GetProcAddress(libugui, "?MT_set_ug_title@@YAXPEADI@Z");
if (MyFunc != NULL)
{
MyFunc("设置新的UG标题" , 0);
}
//释放对dll的引用
FreeLibrary(libugui);
}
设置后显示如下图:
注:void MT_set_ug_title(char *,unsigned int) 中 unsigned int 这个参数我也不清楚有什么作用,但是不加这个参数就会在设置标题后面显示“(无历史记录)”
3、在NX的使用中,切换模块NX标题是会变的,如下图,这样切换模块后刚刚设置的新UG标题就会被NX重设了。要想在NX重设标题过后实时设置回来,需要做一个定时触发,让NX启动就加载程序达到实时更新标题栏
//用SetTimer建一个计时器,每秒触发一次
以下为一个完整的功能,实时更新NX标题显示内容为模块、显示文档路径、设计员名称(如有)
#include <uf.h>
#include <uf_ui.h>
#include <uf_part.h>
#include <uf_attr.h>
#include <atlstr.h>
void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime);//回调函数
extern "C" DllExport void ufsta(char *param, int *retCode, int paramLen) //启动UG就开始监控
{
if (UF_initialize()) { return; }
SetTimer(NULL, NULL, 1000, (TIMERPROC)TimerSetTitle);//每秒触发一次
UF_terminate();
}
extern "C" DllExport int ufusr_ask_unload()
{
return (UF_UNLOAD_UG_TERMINATE);
}
void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
char prt0[132] = ""; //当前部件路径
tag_t DispTag = UF_PART_ask_display_part();
UF_PART_ask_part_name(DispTag, prt0); //获得显示部件全路径
char fileDir[MAX_FSPEC_BUFSIZE];
char fileName[UF_CFI_MAX_FILE_NAME_BUFSIZE];
const char *filePath = prt0;
uc4576(filePath, 2, fileDir, fileName);//分割路径和部件名称
char str[MAX_FSPEC_BUFSIZE] = "";//使用代码获取当前版本会更好
char NX_app[256] = "";//模块变量
char DesignName[50] = "";//设计员名字
// 如果填写了设计人员的属性,读出并加入到显示
if (DispTag != NULL_TAG)
{
int title_type;
UF_ATTR_find_attribute(DispTag, UF_ATTR_string, "设计员", &title_type);
if (title_type)
{
UF_ATTR_value_t sValue;
char attr_value_string[257] = "";
sValue.value.string = attr_value_string;
char AttrTitle[UF_ATTR_MAX_TITLE_LEN + 1];
UF_ATTR_read_value(DispTag, "设计员", UF_ATTR_string, &sValue);
if (strlen(sValue.value.string)) sprintf(DesignName, "<%s>", sValue.value.string);
}
}
int module_id;
UF_ask_application_module(&module_id);//获取当前模块
if (module_id == UF_APP_MODELING)
{sprintf(NX_app, " 建模 - [%s当前路径]〓 ", DesignName);}
else if (module_id == UF_APP_DRAFTING)
{sprintf(NX_app, " 制图 - [%s当前路径]〓 ", DesignName);}
else if (module_id == UF_APP_CAM)
{sprintf(NX_app, " 加工 - [%s当前路径]〓 ", DesignName);}
else if (module_id == UF_APP_GATEWAY)
{sprintf(NX_app, " 基本环境 - [%s当前路径]〓 ", DesignName);}
else if (DispTag == NULL_TAG)
{sprintf(NX_app, " [没有部件]");}
else
{sprintf(NX_app, " [%s当前路径]〓 ", DesignName);} //其它模块有需要再弄
sprintf(str, "%s%s", NX_app, fileDir);
//加载dll
auto libugui = LoadLibrary("libugui.dll");
if (libugui)
{
//声明函数指针,和导出dll时头文件中函数类型一致
typedef void(*SetNXTitle)(char* title,int a);
SetNXTitle MyFunc;
//通过函数名获取函数在dll中的地址
MyFunc = (SetNXTitle)GetProcAddress(libugui, "?MT_set_ug_title@@YAXPEADI@Z");
if (MyFunc != NULL)
{
MyFunc(str, 0);
}
//释放对dll的引用
FreeLibrary(libugui);
}
}