兩種Matlab圖像嵌入VC界面的實現(xiàn)方法_第1頁
兩種Matlab圖像嵌入VC界面的實現(xiàn)方法_第2頁
兩種Matlab圖像嵌入VC界面的實現(xiàn)方法_第3頁
兩種Matlab圖像嵌入VC界面的實現(xiàn)方法_第4頁
兩種Matlab圖像嵌入VC界面的實現(xiàn)方法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、兩種Matlab圖像嵌入VC界面的實現(xiàn)方法羅 鑫(中國電子科學研究院,北京 100041摘 要:Matlab圖像無法嵌入VC程序界面是混合編程應用中的一個問題,文章通過兩個實例分別介紹了兩種實現(xiàn)方法:利用COM組件技術的窗口嵌入方法和基于COM的統(tǒng)一數(shù)據(jù)傳輸機制的方法,這兩種方法都很好的實現(xiàn)了Matlab圖像嵌入VC界面。關鍵詞:Matlab;VC;混合編程;COM;UDT;中圖分類號: TP311 文獻標識碼A基金項目:總裝裝備重點預研基金(9140A06070106DZ1001。1 引 言Matlab是MathWorks公司推出的一套功能強大的科學計算軟件和科學計算語言,它擁有強大計算繪圖

2、功能和眾多完善的數(shù)學算法,廣泛的應用于信號處理,語音處理,圖像處理,電子仿真等各個科學和工業(yè)領域。由于Matlab 程序無法脫離Matlab環(huán)境運行的局限性,以及解釋語言執(zhí)行效率低下等原因,如何利用Matlab強大的計算、繪圖功能與高級開發(fā)語言(如VC混合編程,各取所長,提高效率,開發(fā)脫離Matlab環(huán)境的應用程序,一直是科研工作者研究的熱點問題。在利用VC和Matlab混合編程開發(fā)工程應用軟件中,Matlab的繪圖功能是除數(shù)學運算功能外應被用到最多的功能,開發(fā)人員往往利用VC部分進行數(shù)據(jù)庫操作和復雜界面開發(fā),利用Matlab部分可視化輸出數(shù)據(jù)處理結(jié)果。但是在應用中有一個問題,Matlab的圖

3、形只能輸出在自己的Figure窗口上,無法嵌入到VC的程序界面中,混合程序在應用時只能通過在主程序窗口之外彈出一個獨立的Figure 窗口來顯示繪圖結(jié)果,這給混合編程應用造成了很大的大障礙,不僅使混合程序的用戶體驗變得很差,而且在操控上更是帶來很多不便,也違背了混合編程應用的初衷。本文將介紹兩種Matlab圖形嵌入VC界面的解決辦法:利用COM組件技術的窗口嵌入方法和基于COM的統(tǒng)一數(shù)據(jù)傳輸機制的圖形嵌入方法。2 COM組件和統(tǒng)一數(shù)據(jù)傳輸機制組件對象模型(COM,Componet Object Model是微軟提出的以組件為發(fā)布單元的軟件開發(fā)技術。COM對象用C/S的方式,提供一類應用程序接口

4、,允許任何符合標準的程序訪問。COM對象是建立在二進制可執(zhí)行代碼的基礎上,因此COM組件對象是語言無關的,這一特性使得用不同編程語言開發(fā)的組件對象進行交互成為可能。Matlab可以通過Matlab編譯器和Matlab COM Builder將Matlab程序轉(zhuǎn)換為動態(tài)鏈接庫形式的COM組件,這些COM組件可以在其他程序中調(diào)用,這是VC和Matlab 混合編程的主要方式。 圖 1 UDT應用剪貼板傳輸數(shù)據(jù)示意圖COM提供了一個在應用之間數(shù)據(jù)交換的標準方案,稱為統(tǒng)一數(shù)據(jù)傳輸(UDT,uniform data transfer。統(tǒng)一數(shù)據(jù)傳輸建立在結(jié)構(gòu)化存儲技術的基礎之上,定義了兩個數(shù)據(jù)結(jié)構(gòu)FORMA

5、TETC和STGMEDIUM,分別用來描述數(shù)據(jù)格式和存儲介質(zhì),使得它可以適應更廣泛的數(shù)據(jù)類型和存儲介質(zhì),既提高了效率,又節(jié)約了資源。統(tǒng)一數(shù)據(jù)傳輸中的數(shù)據(jù)對象是一個COM對象,它通過IDataObject 接口為應用程序進行數(shù)據(jù)傳輸建立了標準,一旦應用程序?qū)崿F(xiàn)了一個數(shù)據(jù)對象,它就可以把此對象通過任一種傳輸協(xié)議傳給其他的應用程序。統(tǒng)一數(shù)據(jù)傳輸?shù)囊粋€典型應用是剪貼板,應用程序和組件通常剪貼板來獲得數(shù)據(jù)對象。統(tǒng)一數(shù)據(jù)傳輸機制應用剪貼板傳輸數(shù)據(jù)對象的原理如圖 1所示。在數(shù)據(jù)源程序一方,首先構(gòu)造一個COleDataSource對象,然后調(diào)用CacheGlobalData或者GetData成員函數(shù),用格式和

6、數(shù)據(jù)填充其內(nèi)部的格式緩沖區(qū),當我們調(diào)用SetClipboard成員函數(shù)時,數(shù)據(jù)對象被拷貝到剪貼板上;在客戶程序一方,我們調(diào)用AttachClipboard函數(shù),它把剪板上的IDataObject接口指針與COleDataObject對象聯(lián)系起來,之后我們調(diào)用GetData或者GetGlobalObject函數(shù)就可以得到每種格式的數(shù)據(jù)。3基于COM組件的窗口嵌入方式實現(xiàn)方法Windows系統(tǒng)中所有應用程序的窗口都是基于MFC類庫中CWnd類的。CWnd類有3個對操作窗口的函數(shù):FindWindow、SetWindowPos和SetParent,其中FindWindow可以尋找到Windows系統(tǒng)

7、中指定名稱的窗口;SetWindowPos能把窗口移動到指定的位置;而SetParent函數(shù)可以改變窗口的父窗口。利用這3條命令的組合,從理論上講可以將系統(tǒng)中的任何一個窗口變成另外一個窗口的子窗口并“嵌入”到其中。這給Matlab和VC混合編程中將Matlab產(chǎn)生的圖像和VC程序界面無縫集成提供了一條可行的途徑:首先,用Matlab程序產(chǎn)生一個不可見的Figure窗口,然后找到這個Figure窗口的句柄,將Figure 窗口設為VC程序的子窗口,去掉Figure窗口邊框并移動到指定位置,設置Figure窗口為可見。為了能在VC程序中調(diào)用Matlab的繪圖功能并控制Matlab繪圖,就要用到上面

8、介紹的COM組件技術。下面通過一個簡單的實例來說明利用COM組件技術將Matlab圖像嵌入VC界面的實現(xiàn)方法。在這個混合編程應用例子中,我們需要用VC控制參數(shù)的改變來控制Matlab產(chǎn)生不同參數(shù)的泊松分布圖像。我們編寫一個Matlab函數(shù)文件guitest1.m,它的功能是產(chǎn)生一個不可見的Figure圖像窗口,可以通過參數(shù)的改變改變圖像和控制窗口可見。function guitest1(LAMBDA,Ctrlx=0:1:100;y=poisspdf(x,LAMBDA;switch Ctrlcase 0 %產(chǎn)生一個名為“_guitest_”的不可見Figure窗口figure('Numb

9、erTitle','Off','Name','_guitest_','Visible','Off'case 1 %將Figure窗口設置為可見h=gcf;set(h,'Visible','On'endplot(x,y,'r'在Matlab7.04環(huán)境中運行>> mcc -W cpplib:GuiTestLib -T link:lib guitest1,將guitest1.m轉(zhuǎn)換為COM組件。用Visual C+ 6.0編寫一個基于對話框的MFC應用

10、程序工程,把COM組件加入工程,為其添加一個用于顯示圖像的按鈕、一個用于標志圖像顯示位置的圖片控件、及一對控制參數(shù)的編輯控件和微調(diào)控件。其中調(diào)用COM組件將Figure窗口嵌入VC界面的代碼如下:guitest1(lambda,ctrl0; / 調(diào)用COM組件產(chǎn)生一個不可見Figure窗口char FigName="_guitest_"HWND hFig = :FindWindow(NULL,FigName; / 獲得Figure窗口句柄long lStyle = :GetWindowLong(hFig,GWL_STYLE; / 去掉Figure窗口的標題欄和邊框:SetW

11、indowLong(hFig,GWL_STYLE,lStyle & (WS_CAPTION & (WS_THICKFRAME;:SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIV ATE | SWP_FRAMECHANGED;RECT PlotRec; / 獲取繪圖區(qū)域的位置和大小CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA;PlotArea->GetWindowRect(&PlotRec;long Width =

12、 PlotRec.right - PlotRec.left;long Height = PlotRec.bottom - PlotRec.top;:SetParent(hFig,PlotArea->GetSafeHwnd(;/ 設置Figure窗口為VC界面的子窗口并調(diào)整位置:SetWindowPos(hFig,NULL,1,1,Width-3,Height-3,SWP_NOZORDER | SWP_NOACTIV ATE;guitest1(lambda,ctrl1; /調(diào)用COM組件將Figure窗口顯示出來調(diào)用Matlab產(chǎn)生的COM組件時,需要將VC中的參數(shù)轉(zhuǎn)換為mwArray格式

13、,可以參考Matlab 文檔,由于不是實現(xiàn)方法的重點,本文不再詳述。這樣就通過一個COM組件和VC程序相配合實現(xiàn)了Matlab圖像嵌入VC界面,通過VC改變控制參數(shù)還可以控制圖像的變化。運行結(jié)果如圖2所示 圖 2 Matlab圖像嵌入VC界面效果圖4利用COM的統(tǒng)一數(shù)據(jù)傳輸機制的實現(xiàn)方法Matlab產(chǎn)生的輸出圖像可以通過Matlab的print命令輸出為JPEG、BMP、PNG等各種格式的圖片文件,還可以將圖像以圖片格式輸出到Windows系統(tǒng)的剪貼板中供其它程序調(diào)用。這些命令如下: Print dbmp filename /將Figure中的圖形輸出為filename.bmp文件;Print

14、 djpeg filename /將Figure中的圖形輸出為filename.jpeg文件;Print dmeta /將Figure中的圖形輸出到系統(tǒng)剪貼板中;這幾條命令給Matlab和VC混合編程中將Matlab產(chǎn)生的圖像嵌入VC程序界面提供了又一條可行的途徑。我們可以利用Matlab程序繪制數(shù)據(jù)圖像,并使用print命令將圖像輸出為圖片文件或輸出到剪貼板。現(xiàn)在的問題是VC程序如何獲取到Matlab程序產(chǎn)生的圖片文件或剪貼板中的圖像輸出,這涉及到了應用之間數(shù)據(jù)傳輸?shù)膯栴},就用到了COM組件的統(tǒng)一數(shù)據(jù)傳輸機制。下面我們通過一個例子,以最為便捷的讀取剪貼板的方式實現(xiàn)Matlab圖像嵌入VC界面

15、的混合編程。在這個例子中,我們需要用一個Matlab程序GDATcore.m來以隱藏窗口的方式顯示數(shù)據(jù)擬合圖像,并將圖像輸出到剪貼板中。GDATcore.m帶有4個輸入?yún)?shù):擬合函數(shù)選擇參數(shù)fuc、擬合函數(shù)的兩個參數(shù)k1、k2,以及采樣間隔dist(具體程序在此省略。我們在Matlab命令窗口下運行>> mcc -W cpplib:GDATcoreLib -T link:lib GDATcore,將GDATcore.m轉(zhuǎn)換為一個動態(tài)連接庫形式的COM組件。用Visual C+ 6.0編寫一個控制GDATcore參數(shù)的MFC應用程序工程,把編譯好的COM組件加入工程,添加控制GDAT

16、core.m4個參數(shù)的相關控件,并添加一個定位圖像顯示的圖片控件。工程中有一個繼承至CStatic類的CDisplayFigure類,它通過一個私有CDC成員變量memDC來保存圖像更新區(qū)域,函數(shù)Display實現(xiàn)把剪貼板中的圖形顯示在圖片控件所在位置的功能。Display的實現(xiàn)代碼如下:CClientDC dc(this;CRect client_rect;GetClientRect(&client_rect;CBitmap bitmapFigure;if ( memDC.GetSafeHdc( = NULL /設置圖像放置位置memDC.CreateCompatibleDC(&am

17、p;dc;bitmapFigure.CreateCompatibleBitmap(&dc,client_rect.Width(, client_rect.Height( ;memDC.SelectObject(&bitmapFigure;COleDataObject DataObject; /構(gòu)造COleDataObject對象用來獲取剪貼板中的圖形DataObject.AttachClipboard(;HGLOBAL hBmp = DataObject.GetGlobalData(CF_METAFILEPICT; /獲得圖片的句柄LPMETAFILEPICT lpBmp =

18、(LPMETAFILEPICT:GlobalLock(hBmp;memDC.SetMapMode(lpBmp->mm; /設置顯示模式memDC.SetViewportExt(client_rect.Width(, client_rect.Height( ;memDC.SetViewportOrg(client_rect.left, client_rect.top ; /設置顯示位置memDC.PlayMetaFile(lpBmp->hMF ; /放置圖像Invalidate(; /更新窗口圖形使用這個類時我們需要創(chuàng)建一個類對象并用一個圖片控件的位置來指定圖像輸出位置,在程序中還需

19、要加入下面的代碼:CDisplayFigure myfig;myfig.SubclassDlgItem(IDC_STATIC_FIG,this;GDATcore(fuc,k1,k2,dist; /調(diào)用組件產(chǎn)生新圖像myfig.Display(; /顯示圖像這樣,我們就利用統(tǒng)一數(shù)據(jù)傳輸機制實現(xiàn)了從剪貼板獲得圖像并輸出在VC界面上,在程序中我們可以通過VC界面控件改變參數(shù),然后調(diào)用Matlab組件輸出圖像到剪貼板,VC程序通過CDisplayFigure類將圖像輸出到指定的控件位置。實際程序運行如圖3所示: 圖 3 實際程序運行圖5 結(jié)語從兩個示例的運行結(jié)果可以看到,這兩種方法都能很好地將Matl

20、ab圖形嵌入VC程序界面中。利用這兩種實現(xiàn)方法,Matlab和VC混合編程應用中就可避免在程序窗口之外跳出一個獨立的圖像輸出窗口的情況,這給混合編程的在工程上的應用帶來很大的便利,同時也給其它應用提供了一個實現(xiàn)數(shù)據(jù)圖形繪制的途徑。本文作者創(chuàng)新點:在第一個方法中,利用COM組件的方式而不是直接調(diào)用Matlab底層C函數(shù)實現(xiàn)控制Figure窗口的隱現(xiàn)和圖形變化,易于實現(xiàn);在第二個方法中,利用COM組件的UDT機制,可以克服直接讀取剪貼板圖片不能太大的缺點,更可擴展為讀取磁盤文件或遠程圖片的實現(xiàn)。參考文獻3 潘愛民.COM原理及應用M.清華大學出版社.20034 苗春葆.MATLAB與VC混合編程J.中國仿真科技論壇電子期刊.第一期5 牟彧清,王汝霖,李國新.MATLAB與VC接口技術的研究J,微計算機信息,2006,7-3:P275-277。6 袁佑新,甘偉.Matlab與VC混合編程在網(wǎng)架結(jié)構(gòu)智能監(jiān)測系統(tǒng)中的應用J ,微計算機信息,2006,1-1:P103-105。Two Solutions to Integrate

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論