基於COM的Matlab 圖像嵌入MFC界面

1.生成 guitest1.m 文件函數

function guitest1( ctrl1 )

x=-1:0.01:1;
y=x.^2;

switch ctrl1
    case 0  %產生一個名爲「_guitest1_」的不可見窗口
        figure('NumberTitle','Off','Name','_guitest1_','Visible','Off');
    case 1  %將figure設置爲可見
        h=gcf;  % gcf返回當前Figure對象的句柄值
        set(h,'Visible','On');
end

plot(x,y,'r');
        
end

2.編譯,注意:在MATLAB環境執行時,VS不能是運行的。ui

mcc -W cpplib:GuiTestLib -T link:lib guitest1 -C

//不加 -C 不會生成 GuiTestLib.ctf文件

3.新建項目,MFC項目引入外部庫文件目錄設置等spa

// C/C++附加包含目錄:
D:\MATLAB2016a\extern\include
// 連接器--常規--附加庫目錄
D:\MATLAB2016a\extern\lib\win64\microsoft
// 連接器--輸入--附加依賴項((中間必須是回車分開,回車之後自動生成分號,不是空格鍵,也不是手動添加分號)
mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib libmex.lib GuiTestLib.lib

4.將生成的.dll,.h,.ctf,.lib四個文件拷貝到vs項目下(生成.exe後還須要將dll拷貝到exe所在文件夾下)。MFC項目中加入 code

    #include "mclmcr.h"   
    #include "matrix.h"   
    #include "mclcppclass.h"   
    #include "myaddtestlib.h"  。在項目中調用MATLAB生成的函數時,注意查看.h文件中函數聲明(在最後一行)。orm

5.MFC添加名爲 IDC_PLOTAREA 的圖片控件,並添加一個按鈕以及設置相應函數:對象

void CmatcomDlg::OnBnClickedButton1()
{
	//調用Matlab產生的COM組件時,須要將VC中的參數轉換爲mwArray格式
	static double gui_hid = 0;
	static double gui_show = 1;
	// 爲變量分配內存空間,能夠查幫助mwArray   
	// 1,1表示矩陣的大小(mxDOUBLE_CLASS表示變量的精度)   
	static mwArray mw_hid(1, 1, mxDOUBLE_CLASS);
	static mwArray mw_show(1, 1, mxDOUBLE_CLASS);
	mw_hid.SetData(&gui_hid, 1);
	mw_show.SetData(&gui_show, 1);

	// 調用COM組件產生一個不可見Figure窗口
	//dll對應的.h頭文件最後關於guitest1函數聲明(有返回值時與.m形參不一樣)
	//咱們的項目中是:extern LIB_GuiTestLib_CPP_API void MW_CALL_CONV guitest1(const mwArray& ctrl1);
	guitest1(mw_hid);

	CString FigName =_T("_guitest_");
	static	HWND hFig = ::FindWindow(NULL, FigName); // 得到Figure窗口句柄
	static long lStyle = ::GetWindowLong(hFig, GWL_STYLE);//得到窗口樣式
	// 去掉Figure窗口的標題欄和邊框
	::SetWindowLong(hFig, GWL_STYLE, lStyle & (~WS_CAPTION) & (~WS_THICKFRAME));
	::SetWindowPos(hFig, NULL, 0, 0, 0, 0, SWP_NOMOVE |
		SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE| SWP_FRAMECHANGED);
	//獲取繪圖區域的位置和大小
	RECT PlotRec; 
	static 	CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA);
	PlotArea ->GetWindowRect(&PlotRec);
	long Width = PlotRec.right - PlotRec.left;
	long Height = PlotRec.bottom - PlotRec.top;
	// 設置Figure窗口爲VC界面的子窗口並調整位置
	::SetParent(hFig, PlotArea ->GetSafeHwnd());
	::SetWindowPos(hFig, NULL, 1, 1, Width - 3, Height - 3, SWP_NOZORDER | SWP_NOACTIVATE);
	
	//調用COM組件將Figure窗口顯示出來
	guitest1(mw_show);
}

在OnInitDialog()中添加如下的代碼:圖片

bool res = false;
	res = mclInitializeApplication(NULL,0);
	if (!res) {
		/*DWORD errNO = GetLastError();
		CString errString;
		errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO);
		AfxMessageBox(errString);*/
		AfxMessageBox(_T("mclInitializeApplication() is wrong!"));
	}
	res = GuiTestLibInitialize();
	if (!res) {
		/*DWORD errNO = GetLastError();
		CString errString;
		errString.Format(_T("GuiTestLibInitialize() is wrong with %d"), errNO);
		AfxMessageBox(errString);*/
		AfxMessageBox(_T("GuiTestLibInitialize() is wrong!"));
	}

添加ondestroy消息處理函數:內存

// TODO: 在此處添加消息處理程序代碼
	bool res1;
	res1 = mclTerminateApplication();
	if (!res1) {
		/*DWORD errNO = GetLastError();
		CString errString;
		errString.Format(_T("mclInitializeApplication() is wrong with %d"), errNO);
		AfxMessageBox(errString);*/
		AfxMessageBox(_T("mclTerminateApplication()  is wrong!"));
	}

	GuiTestLibTerminate();

6.必定要分清x86和x64的區別,分別設置附加依賴項,同時編譯時必定要選擇x86仍是X64.it

在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,二者都有定義。即在 VC 下,_WIN32 必定有定義io

所以,WIN32/_WIN32 能夠用來判斷是否 Windows 系統(對於跨平臺程序),而 _WIN64 用來判斷編譯環境是 x86 仍是 x64

7.// 連接器--輸入--附加依賴項((對於VS2015,中間必須是回車分開,回車之後自動生成分號,不是空格鍵,也不是手動添加分號),我就是這裏搞錯了,才走了那麼多彎路。 mclmcrrt.lib; libmx.lib ;libmat.lib ;mclmcr.lib; GuiTestLib.lib

相關文章
相關標籤/搜索