UG NX二次开发之使用MFC创建dll程序
NX自带的UI控件也有不少,但是有很多功能受限,但是在Windows用用程序中的控件确有很多,而且功能强大,但是也有一个缺点,就是界面风格与NX的不一样,有种另类的感觉。本文介绍一下用MFC来做NX的二次开发。
我开发时的配置如下:
VS2010+NX8.5
下面说一下大概的过程:
1、在VS2010中新建项目,选择MFC DLL,输入名称nx_mfc01,选择项目位置,如下图
在下一步中选择“应用程序设置”,把DLL类型设置为“带静态链接的MFC的规则DLL(R)”,然后点【完成】
如下图
VS自动使用模板生成若干个文件,如下图
目前生成的这些文件只是一框架,什么也没做,连个对话框也没有。下面就新建一个对话框。
在VS菜单中选择【视图】【资源视图】,在资源视图中点开nx_mfc01可以看到项目中的资源只有一个VS_VERSION_INFO,在这个文件里面可以修改生成的dll程序的属性,这里可以设置也可以不设置,如果对程序的管理比图正规,这里就要修改一下啦。本次介绍就随便修改一下,如下图
在资源视图中右击nx_mfc01,选择【添加】【资源】,也可以直接在菜单中添加
在弹出的对话框中选择”Dialog”,添加其它的东西也可以,然后选择“新建”按钮
然后VS自动切换到一个对话框而已界面,在这个界面上可以自己设计想要的对话框样式。如下图
本次在界面上布局如下
做到这里后,项目里面只是有了一个对话框资源,还没有处理对话框的程序。下面给对话框添加一个类来做交互。
在对话框主界面上右击,选择【添加类】,在弹出的对话框中输入类名为“mfcDlg”,其它默认就可以了,如下图
然后再在Listview控制上右击,选择【添加变量】,在弹出的对话框中输入变量名“m_list_var”
如下图
然后双击对话框布局上的确定按钮,VS自动切换到这个按钮的消息处理函数上。如下图
如果对MFC比较熟悉,后面这做法就是按MFC程序设计的方法来做。但是到现在为止这个项目还不能在UG中使用,下面来介绍如何把UG的入口函数添加进来。
先在项目的属性中添加NX的头文件路径和链接库
如下:
【C/C++】,【常规】选项中设置“附加包含目录”为“$(UGII_BASE_DIR)\ugopen”
【链接器】,【常规】选项中设置“附加库目录”为“$(UGII_BASE_DIR)\ugopen”
【链接器】,【输入】选项中设置“附加依赖项”如下
libufun.lib
libnxopencpp.lib
libnxopencpp_annotations.lib
libnxopencpp_assemblies.lib
libnxopencpp_bodydes.lib
libnxopencpp_cae.lib
libnxopencpp_cam.lib
libnxopencpp_die.lib
libnxopencpp_display.lib
libnxopencpp_drafting.lib
libnxopencpp_drawings.lib
libnxopencpp_facet.lib
libnxopencpp_features.lib
libnxopencpp_fields.lib
libnxopencpp_formboard.lib
libnxopencpp_gateway.lib
libnxopencpp_geometricanalysis.lib
libnxopencpp_geometricutilities.lib
libnxopencpp_issue.lib
libnxopencpp_layer.lib
libnxopencpp_mechatronics.lib
libnxopencpp_modldirect.lib
libnxopencpp_motion.lib
libnxopencpp_optimization.lib
libnxopencpp_options.lib
libnxopencpp_pdm.lib
libnxopencpp_physmat.lib
libnxopencpp_positioning.lib
libnxopencpp_preferences.lib
libnxopencpp_routing.lib
libnxopencpp_shapesearch.lib
libnxopencpp_sheetmetal.lib
libnxopencpp_sim.lib
libnxopencpp_tooling.lib
libnxopencpp_userdefinedobjects.lib
libnxopencpp_validate.lib
libnxopencpp_visualreporting.lib
libnxopencpp_weld.lib
libugopenint.lib
libnxopenuicpp.lib
然后在项目源文件下新建一个nxInterface.cpp文件。在这个源文件中写入调用对话框的代码
static int report_error( char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133],
msg[133];
sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
irc, line, file);
UF_get_fail_message(irc, err);
UF_print_syslog(msg, FALSE);
UF_print_syslog(err, FALSE);
UF_print_syslog("\n", FALSE);
UF_print_syslog(call, FALSE);
UF_print_syslog(";\n", FALSE);
if (!UF_UI_open_listing_window())
{
UF_UI_write_listing_window(msg);
UF_UI_write_listing_window(err);
UF_UI_write_listing_window("\n");
UF_UI_write_listing_window(call);
UF_UI_write_listing_window(";\n");
}
}
return(irc);
}
mfcDlg *dlg = NULL;
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
/* Initialize the API environment */
if( UF_CALL(UF_initialize()) )
{
/* Failed to initialize */
return;
}
/* TODO: Add your application code here */
if(dlg == NULL)
{
dlg = new mfcDlg;
dlg->Create(IDD_DIALOG1);
}
if(dlg)
{
dlg->ShowWindow(SW_NORMAL);
}
/* Terminate the API environment */
UF_CALL(UF_terminate());
}
extern int ufusr_ask_unload( void )
{
//return( UF_UNLOAD_IMMEDIATELY );
return (UF_UNLOAD_UG_TERMINATE);
}
extern void ufusr_cleanup (void)
{
//释放申请的内存
if (dlg)
{
delete dlg;
dlg = NULL;
}
return;
}
代码说明:
#include "stdafx.h",一定要放在最前面,不然很可能会出错
在nxInterface.cpp文件中用使用是的非模态对话框,对于非模太对话框,要把对话框的指针dlg申明为全局变量,而且ufusr_ask_unload()一定要返回UF_UNLOAD_UG_TERMINATE才行,不然加载对话框程序后会闪退。如果是显示一个模态对话框,就没有这些限制。
下面为对话框添加一些动作,将前面确定按钮的消息回调函数修改为下面
void mfcDlg::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码 this->m_list_var.InsertColumn(0,_T("列1"),0,100); this->m_list_var.InsertColumn(1,_T("列2"),0,100); this->m_list_var.InsertItem(0,_T("行1列1")); this->m_list_var.SetItemText(0,1,_T("行1列2")); this->m_list_var.InsertItem(1,_T("行2列1")); this->m_list_var.SetItemText(1,1,_T("行2列2")); uc1601("设置列表视图",1); //CDialogEx::OnOK();}
最后编译运行,如下图
前面修改的属性版本等信息的结果如下图
文章来源:UG NX学习笔记