NX自帶的UI控件也有不少,但是有很多功能受限,但是在Windows用用程序中的控件確有很多,而且功能強(qiáng)大,但是也有一個(gè)缺點(diǎn),就是界面風(fēng)格與NX的不一樣,有種另類的感覺。本文介紹一下用MFC來做NX的二次開發(fā)。
我開發(fā)時(shí)的配置如下:
VS2010+NX8.5
下面說一下大概的過程:
1、在VS2010中新建項(xiàng)目,選擇MFC DLL,輸入名稱nx_mfc01,選擇項(xiàng)目位置,如下圖
在下一步中選擇“應(yīng)用程序設(shè)置”,把DLL類型設(shè)置為“帶靜態(tài)鏈接的MFC的規(guī)則DLL(R)”,然后點(diǎn)【完成】
如下圖
VS自動(dòng)使用模板生成若干個(gè)文件,如下圖
目前生成的這些文件只是一框架,什么也沒做,連個(gè)對話框也沒有。下面就新建一個(gè)對話框。
在VS菜單中選擇【視圖】【資源視圖】,在資源視圖中點(diǎn)開nx_mfc01可以看到項(xiàng)目中的資源只有一個(gè)VS_VERSION_INFO,在這個(gè)文件里面可以修改生成的dll程序的屬性,這里可以設(shè)置也可以不設(shè)置,如果對程序的管理比圖正規(guī),這里就要修改一下啦。本次介紹就隨便修改一下,如下圖
在資源視圖中右擊nx_mfc01,選擇【添加】【資源】,也可以直接在菜單中添加
在彈出的對話框中選擇”Dialog”,添加其它的東西也可以,然后選擇“新建”按鈕
然后VS自動(dòng)切換到一個(gè)對話框而已界面,在這個(gè)界面上可以自己設(shè)計(jì)想要的對話框樣式。如下圖
本次在界面上布局如下
做到這里后,項(xiàng)目里面只是有了一個(gè)對話框資源,還沒有處理對話框的程序。下面給對話框添加一個(gè)類來做交互。
在對話框主界面上右擊,選擇【添加類】,在彈出的對話框中輸入類名為“mfcDlg”,其它默認(rèn)就可以了,如下圖
然后再在Listview控制上右擊,選擇【添加變量】,在彈出的對話框中輸入變量名“m_list_var”
如下圖
然后雙擊對話框布局上的確定按鈕,VS自動(dòng)切換到這個(gè)按鈕的消息處理函數(shù)上。如下圖
如果對MFC比較熟悉,后面這做法就是按MFC程序設(shè)計(jì)的方法來做。但是到現(xiàn)在為止這個(gè)項(xiàng)目還不能在UG中使用,下面來介紹如何把UG的入口函數(shù)添加進(jìn)來。
先在項(xiàng)目的屬性中添加NX的頭文件路徑和鏈接庫
如下:
【C/C++】,【常規(guī)】選項(xiàng)中設(shè)置“附加包含目錄”為“$(UGII_BASE_DIR)\ugopen”
【鏈接器】,【常規(guī)】選項(xiàng)中設(shè)置“附加庫目錄”為“$(UGII_BASE_DIR)\ugopen”
【鏈接器】,【輸入】選項(xiàng)中設(shè)置“附加依賴項(xiàng)”如下
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
然后在項(xiàng)目源文件下新建一個(gè)nxInterface.cpp文件。在這個(gè)源文件中寫入調(diào)用對話框的代碼
#include 'stdafx.h'
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include 'mfcDlg.h'
#include 'resource.h'
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
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)
{
//釋放申請的內(nèi)存
if (dlg)
{
delete dlg;
dlg = NULL;
}
return;
}
代碼說明:
#include 'stdafx.h',一定要放在最前面,不然很可能會(huì)出錯(cuò)
在nxInterface.cpp文件中用使用是的非模態(tài)對話框,對于非模太對話框,要把對話框的指針dlg申明為全局變量,而且ufusr_ask_unload()一定要返回UF_UNLOAD_UG_TERMINATE才行,不然加載對話框程序后會(huì)閃退。如果是顯示一個(gè)模態(tài)對話框,就沒有這些限制。
下面為對話框添加一些動(dòng)作,將前面確定按鈕的消息回調(diào)函數(shù)修改為下面
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('設(shè)置列表視圖',1);
//CDialogEx::OnOK();
}
最后編譯運(yùn)行,如下圖
前面修改的屬性版本等信息的結(jié)果如下圖
聯(lián)系客服