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學習筆記
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















