NX二次開發-BlockUI對話框嵌套MFC對話框制作進度條


半年前在一些QQ群看到有大神NX二次開發做出了進度條,那個時候我還不會弄,也不知道怎么弄得,后來斷斷續續得研究了一下,直到今天我把它做出來了。內心還是很喜悅的!回想自己這兩年當初從沒公司肯給我做NX二次開發的機會,在到去專業NX二次開發公司上班又混不下去,最后去干畫圖仔,但我沒放棄這行,每晚堅持那份熱愛,現在技術也終究有了些進步了。【如果有寫得不對的地方,各位可以給我留言批評指正】

先上兩張圖片

將MFC進度條嵌套在NX窗口左下角

將MFC進度條嵌套在BlockUI對話框里

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

做這個東西,還是有些太復雜了,東改一下,西改一下,寫了這么久博客,到現在我也不知道,這種很長的,復雜的內容,光一堆代碼是說不清楚的,這種要怎么有條理的去寫博客說清楚?

湊合看吧

【選擇寫博客,並不是為了分享。只是想讓自己十年如一日的去堅持做一件事。】另外技術水平在高,如果不能形成產品變現,代碼也只能爛在手里。

我覺得NX二次開發工程師真正的競爭並不是技術水平,而是誰能把技術轉化成商業化產品盈利。那才是高手!畢竟賺錢才是頭等大事,研究技術只是愛好。

NX11+VS2013

首先創建一個BlockUI對話框,添加一個繪圖區控件,設置對話框可調整大小。

 更改繪圖區參數,把對話框撐大。

 生成代碼語言改成C++,然后保存。

 把對話框文件放到二次開發Application文件夾里,后面我們要執行調用。

下面創建一個MFC DLL的項目

 

更改項目屬性,多字節。$(UGII_BASE_DIR)\ugopen

 添加附加包含目錄,附加庫目錄

 

 設置附加依賴項

libufun.lib
libufun_cae.lib
libufun_cam.lib
libufun_die.lib
libufun_vdac.lib
libufun_weld.lib
libnxopencpp.lib
libnxopencpp_annotations.lib
libnxopencpp_assemblies.lib
libnxopencpp_bodydes.lib
libnxopencpp_cae.lib
libnxopencpp_cam.lib
libnxopencpp_diagramming.lib
libnxopencpp_diagramminglibraryauthor.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_layout2d.lib
libnxopencpp_markup.lib
libnxopencpp_mechanicalrouting.lib
libnxopencpp_mechatronics.lib
libnxopencpp_mfg.lib
libnxopencpp_modldirect.lib
libnxopencpp_motion.lib
libnxopencpp_openxml.lib
libnxopencpp_optimization.lib
libnxopencpp_options.lib
libnxopencpp_partfamily.lib
libnxopencpp_pdm.lib
libnxopencpp_physmat.lib
libnxopencpp_placement.lib
libnxopencpp_plas.lib
libnxopencpp_positioning.lib
libnxopencpp_preferences.lib
libnxopencpp_report.lib
libnxopencpp_routing.lib
libnxopencpp_shapesearch.lib
libnxopencpp_sheetmetal.lib
libnxopencpp_shipdesign.lib
libnxopencpp_sim.lib
libnxopencpp_tooling.lib
libnxopencpp_userdefinedobjects.lib
libnxopencpp_userdefinedtemplate.lib
libnxopencpp_validate.lib
libnxopencpp_visualreporting.lib
libnxopencpp_weld.lib
libugopenint.lib
libugopenint_cae.lib
libugopenint_cam.lib
libnxopenuicpp.lib

 然后確定。

設置項目為64位

編譯項目,生成成功。

下面我們把BlockUI的hpp和cpp加到我們的MFC項目里。

在UG二次開發中,若使用MFC庫,一旦加上#include<Afx.h>頭文件,下面這句話就報錯

theDialog = GetPoints::theUI->CreateDialog(theDlxFileName);

解決CreateDialog函數在UI.hxx文件和WinUser.h中的沖突

在windows API中已經將CreateDialog定義為宏 CreateDialogW

當編譯到UI.hxx中時,CreateDialog函數背當作CreateDialogW函數,從而產生矛盾

解決方法是在UI.hxx中加上一句 #undef CreateDialog,意為取消CreateDialog的宏定義

詳細請看https://www.cnblogs.com/nxopen2018/p/11811708.html

 

 然后編譯,生成成功。

下面去MFC里面創建個資源對話框

 

 設置對話框樣式

將兩邊距離拖一拖,不留距離

下面創建對話框的hpp和cpp

 

 下面設置對話框初始化

 

添加進度條控件,工具箱里拖過去

 雙擊進度條,進入到代碼。

 

然后在回到對話框,下面雙擊確定,我們去添加代碼

 添加頭文件

 定義一個全局變量

 

 去apply_cb里寫代碼

 1         //方式1,將MFC進度條固定到NX界面左下角
 2         //打開MFC窗口
 3         AFX_MANAGE_STATE(AfxGetStaticModuleState());
 4 
 5         HWND UGHwnd = (HWND)UF_UI_get_default_parent();//獲取UG窗口句柄
 6         CWnd *ugwindow = CWnd::FromHandle(UGHwnd);
 7 
 8         CRect rect;
 9         ugwindow->GetWindowRect(&rect);//獲取UG矩形窗口的左上角坐標點和右下角坐標點
10 
11         dlg = new FirstMFCDialog(ugwindow);
12         if (dlg != NULL)
13         {
14             BOOL ret = dlg->Create(IDD_DIALOG1, ugwindow);//創建對話框
15             dlg->ShowWindow(SW_SHOW);//顯示對話框
16             dlg->SetWindowPos(ugwindow, rect.left, rect.bottom - 30, 200, 200, SWP_NOSIZE);//設置對話框固定位置
17             //rect.bottom-30為減去對話框的高度
18         }
19         //調用MFC確定按鈕
20         dlg->OnBnClickedOk();
21 
22         //卸載
23         delete dlg;

編譯,生成成功。

下面去MFC的OK回調里添加代碼

再次編譯成功。

下面去更改NX的卸載方式

 在去入口函數里添加初始化和終止

 再去MFC對話框界面

因為我們希望彈出來的MFC只有進度條,不要有確定和取消的按鈕,我們需要給這兩個按鈕添加變量,然后在MFC初始化代碼里面去隱藏他們倆。

 

 

//隱藏確定和返回按鈕
m_ok.ShowWindow(FALSE);
m_close.ShowWindow(FALSE);

最后我們再去拖MFC對話框,拖窄一點。類似這樣

 OK,到這里結束,我們編譯項目,生成成功。直接去UG里執行。

下面在做一下,嵌套到BlockUI對話框里面的

先注釋第一種方法的代碼

 在initialize_cb上面添加一段新代碼

 1 //枚舉子窗口回調函數原型  
 2 HWND UIHwnd;
 3 static int child_num;
 4 static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)//回調函數  
 5 {
 6     if (hwnd) //如果子窗口存在  
 7     {
 8         child_num++;//記錄子窗口的數目   
 9         LPTSTR child_buffer_1 = new char[255];//子窗口的標題名稱
10         LPTSTR child_buffer_2 = new char[255];//子窗口的類名
11         GetWindowText(hwnd, child_buffer_1, 255);//則開始獲取窗口的標題  
12         GetClassName(hwnd, child_buffer_2, 255);//則開始獲取窗口的類名  
13 
14         if (strcmp(child_buffer_2, "#32770") == 0)//判斷子窗口類名是否是#32770
15         {
16 
17             //UF_UI_open_listing_window();
18             //UF_UI_write_listing_window(child_buffer_2);
19             //UF_UI_write_listing_window("\n");
20 
21             UIHwnd = hwnd;//保存UI父句柄
22             //return FALSE;
23         }
24     }
25 
26 
27     return TRUE;
28 }

去dialogShown_cb里添加新代碼

 1         UIHwnd = GetForegroundWindow(); //返回前台窗回的句柄,如果你調了UI或MFC界面那么會獲得UI或MFC界面的窗口句柄
 2         if (UIHwnd)//如果UI窗口句柄不為空
 3         {
 4             //GetWindowText(UIHwnd, pub_data->parent_buffer_1, 255); //獲取UI窗口的標題 
 5             //GetClassName(UIHwnd, pub_data->parent_buffer_2, 255); //獲取UI窗口的類名 
 6             EnumChildWindows(UIHwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)NULL); //枚舉子窗口
 7         }
 8         else
 9         {
10             uc1601("提示!對話框初始化錯誤...", 1);
11 
12         }
13 
14         AFX_MANAGE_STATE(AfxGetStaticModuleState());
15         dlg = new CFirstMFCDialog();
16         CWnd *UG_pWnd = CWnd::FromHandle(UIHwnd);//句柄轉換
17         dlg->Create(IDD_DIALOG1, UG_pWnd); //創建一個非模態對話框
18         dlg->SetParent(UG_pWnd);
19         dlg->ShowWindow(SW_SHOW); //顯示非模態對話框
20         dlg->UpdateWindow();
21 
22 
23         CPoint c_point;
24         CRect rect[2]; int mfc_size[2];// ui_size[2];
25         GetWindowRect(dlg->m_hWnd, rect[0]);//獲取MFC尺寸
26         mfc_size[0] = rect[0].Width();//寬度 
27         mfc_size[1] = rect[0].Height();//高度
28 
29         GetWindowRect(UIHwnd, rect[1]);//獲取ui尺寸
30         //c_point = rect[1].left;//ui左上角坐標
31         dlg->MoveWindow(0, 0, rect[0].Width(), rect[0].Height());

去apply_cb里添加新代碼

 然后編譯去執行代碼

 2019年11月20日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM