承接上一篇「VC與Matlab聯合編程(一)」的基礎介紹,本文將透過一個完整的實戰案例,詳細演示如何在VC++環境中調用經Matcom編譯後的MATLAB函數,重點解析函數參數傳遞、返回值處理以及圖形介面整合的關鍵技術。
我們將建立一個名為huatu.m的MATLAB函數,功能包含:接收用戶輸入的區間端點值、在該區間繪製正弦波曲線、生成隨機座標點並在圖中以綠點標示。這個案例將完整展示VC如何處理Matcom編譯函數的輸入參數與返回值。
在VC++ 6.0中新建一個名為Example2的基於對話框MFC可執行檔專案。
在Matcom IDE (MIDEVA) 中建立huatu.m,程式碼如下:
function [x_rand, y_rand] = huatu(left, right)
x = left:0.01:right;
y = sin(x);
plot(x, y);
hold on;
x_rand = left + (right - left) * rand;
y_rand = sin(x_rand);
plot(x_rand, y_rand, 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g');
hold off;
xlabel('X軸'); ylabel('Y軸');
title('正弦波與隨機點');
grid on;

圖1:Matcom編輯器中的huatu.m函數
在Matcom命令視窗測試函數:huatu(0, 2*pi),確認繪圖正常。

圖2:函數執行結果驗證
將Matcom產生的四個核心檔案複製到Example2專案目錄:
huatu.h、huatu.cpp(預設位置:安裝目錄\matcom45\samples\Debug)matlib.h、v4501v.lib(預設位置:安裝目錄\matcom45\lib)選擇「專案」→「加入專案」→「檔案」,將上述四個檔案全部加入。

圖3:專案中已加入的Matcom相關檔案
在Example2Dlg.cpp開頭加入:
#include "matlib.h"
#include "huatu.h"

圖4:標頭檔引入位置
在資源編輯器中佈置以下控制項:
IDC_BUTTON_DRAW,標題:「畫圖」)ID_PIC)
圖5:完成的對話框介面佈局
按Ctrl+W開啟類向導,為各編輯框建立CString或double型別變數,為圖形顯示區建立CStatic變數m_picCtrl。

圖6:控制項變數對應表
為按鈕添加BN_CLICKED訊息處理函數OnButtonDraw(),核心程式碼:
void CExample2Dlg::OnButtonDraw()
{
UpdateData(TRUE); // 從介面獲取輸入值
// 初始化Matcom函式庫
if (!initM(MATCOM_VERSION)) {
AfxMessageBox(_T("Matcom函式庫初始化失敗!"));
return;
}
// 準備輸入參數
double left = _ttof(m_strLeft);
double right = _ttof(m_strRight);
double x_rand, y_rand;
// 調用Matcom編譯的huatu函數
// 注意:Matcom生成的C++函數簽名為 void huatu(double left, double right, double *x_rand, double *y_rand)
huatu(left, right, &x_rand, &y_rand);
// 顯示返回的隨機點座標
m_strRandX.Format(_T("%.4f"), x_rand);
m_strRandY.Format(_T("%.4f"), y_rand);
UpdateData(FALSE); // 更新介面顯示
// 在靜態圖片控制項中顯示生成的圖形
// 這裡需要將Matcom生成的圖形導出為BMP或使用其他方式繪製到m_picCtrl
// 簡化示範:這裡假設Matcom函數內部已處理繪圖到指定HWND
exitM(); // 釋放函式庫資源
}

圖7:按鈕點擊事件處理函數
執行程式,輸入區間端點(如 0 和 6.28),點擊「畫圖」,即可看到正弦波與隨機綠點。

圖8:程式執行效果圖
若遇到fatal error C1010: unexpected end of file while looking for precompiled header directive,請按下列設定:

圖9:解決C1010錯誤的設定
initM()與exitM(),避免資源洩漏GetDC()獲取繪圖面本範例展示了VC與Matlab透過Matcom實現「無縫整合」的核心流程。掌握此模式後,即可將MATLAB強大的數學運算、訊號處理、影像分析等功能直接嵌入VC++應用程式中。後續文章將深入解析Matcom生成C++代碼的內部結構與優化技巧。
作者聯繫:QQ 44760299,歡迎技術交流探討。