邵 麟,謝 濱,閆 磊(北京林業(yè)大學(xué),北京 100083)
基于MFC的激光筆輔助教學(xué)系統(tǒng)的界面設(shè)計
邵 麟,謝 濱,閆 磊
(北京林業(yè)大學(xué),北京 100083)
目前投影儀和大屏幕在教學(xué)、展示、會議、演講等各個方面得到了廣泛應(yīng)用。但是,用戶與計算機之間的交互,仍局限于鍵盤和鼠標(biāo)。本文將在闡述MFC框架結(jié)構(gòu)的基礎(chǔ)上介紹一種基于MFC的激光筆輔助教學(xué)系統(tǒng)的界面設(shè)計,通過OPENCV開源計算機視覺庫分析攝像頭所采集的激光的移動路徑,借助復(fù)雜的圖像處理技術(shù),將位置信息返回給MFC進行處理,最終使用戶能夠?qū)崿F(xiàn)遠距離的實時繪制激光移動軌跡,根據(jù)所需進行標(biāo)記與繪畫等。
MFC;界面設(shè)計;激光筆輔助教學(xué)
Microsoft Visual Studio 2010是微軟公司推出的功能強大的可視化Windows平臺集成開發(fā)環(huán)境,MFC是其中的一個重要組成部分[1]。MFC(Microsoft Foundation Class Library)是微軟公司對大部分標(biāo)準(zhǔn)Win32 API函數(shù)的封裝,是面向?qū)ο蟮幕A(chǔ)類庫,利用這些類可以有效地完成基于Windows的程序開發(fā)。
MFC類庫是C++語言與Windows的接口,提供了大量預(yù)先編寫的類和代碼。利用MFC編寫程序的本質(zhì)是選擇該類庫中合適的類,并調(diào)用其下相應(yīng)成員函數(shù)來完成程序所需的特定功能。
AppWizard(應(yīng)用程序向?qū)В┖虲lass Wizard(類向?qū)В┦荲isual C++中兩個十分重要的向?qū)ЫM件。AppWizard可以用來生成一個MFC類庫的Windows應(yīng)用程序基本框架,它以一系列對話框的形式來詢問用戶所建立的應(yīng)用程序的類型和特征信息,根據(jù)用戶的選擇自動生成應(yīng)用程序的基本源代碼;Class Wizard用來管理程序中的類、對象和消息,協(xié)助用戶在應(yīng)用程序框架中添加代碼以完成具體的功能[2]。
整體上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實現(xiàn)方法,用戶所要做的就是通過預(yù)定義的接口把應(yīng)用程序特有的東西填入這個輪廓[2]。這種利用向?qū)ё詣由捎脕硗瓿沙R?guī)編程任務(wù)的源代碼的形式,大大簡化了Windows應(yīng)用程序的設(shè)計工作并節(jié)約了設(shè)計者的開發(fā)時間。
3.1 MFC消息映射機制
MFC使用一種消息映射機制來處理消息,在應(yīng)用程序框架中的表現(xiàn)就是一個消息與消息處理函數(shù)一一對應(yīng)的消息映射表,以及消息處理函數(shù)的聲明和實現(xiàn)等代碼[3]。當(dāng)窗口接收到消息時,會到消息映射表中查找該消息對應(yīng)的消息處理函數(shù),然后由消息處理函數(shù)進行相應(yīng)的處理。
3.2 消息分類
MFC中消息分為以下三類:
(1)標(biāo)準(zhǔn)消息。除WM_COMMAND外,所有以WM_開頭的消息是標(biāo)準(zhǔn)消息。從CWnd派生的類,都可以接收到這類消息; (2)命令消息。來自菜單、加速鍵或工具欄按鈕的消息。消息名以WM_ COMMAND呈現(xiàn)。在MFC中,通過菜單項的標(biāo)識(ID)來區(qū)分不同的命令消息。從CCmdTarget派生的類,都可以接收到這類消息; (3)通知消息。由控件產(chǎn)生的消息,例如,按鈕的單擊,列表框的選擇等均產(chǎn)生此類消息,為的是向其父窗口通知事件的發(fā)生。消息名也是WM_COMMAND。
從CCmdTarget派生的類,都可以接收到這類消息[4]。
MFC中各派生類與接收的消息類型關(guān)系如圖1所示。
圖1 MFC派生類與接受消息類型關(guān)系圖
4.1 功能介紹
目前,多媒體演示 已滲透到人類活動的方方面面,投影儀和大屏幕在教學(xué)、展示、會議、演講等處更是得到了廣泛應(yīng)用。但是,用戶與計算機之間的交互,仍局限于鍵盤和鼠標(biāo),當(dāng)用戶想一邊講演一邊標(biāo)注時,只能局限于計算機旁,不能自由走動,當(dāng)遠離計算機時,雖能用世面上一些激光筆指示所講內(nèi)容,卻又不能對所講內(nèi)容留下標(biāo)記。基于以上缺憾,本實驗設(shè)計了激光筆輔助教學(xué)系統(tǒng),用戶能借助激光筆遠距離的在投影幕布上進行指示的同時又能對指示內(nèi)容進行相應(yīng)的標(biāo)記,利用攝像頭采集激光的移動軌跡,運用OPENCV計算機視覺庫對采集到的視頻進行復(fù)雜的圖像處理,最終將激光點的坐標(biāo)返回給MFC進行最后的實時繪圖工作。以下重點闡述激光筆輔助教學(xué)系統(tǒng)中MFC所起到的重要作用。
4.2 設(shè)計流程
功能流程圖如圖2所示。
圖2 功能流程圖
4.3 獲取桌面窗口句柄
本實現(xiàn)的目的是在大屏幕上激光筆所指示位置留下對應(yīng)的軌跡痕跡,即需要在整個桌面上進行繪圖工作。那么,我們需要獲取到跟桌面相關(guān)的句柄,此后所有的繪圖操作,都在桌面這個窗口上顯示,而定義一個CWindowDC類型的對象意味著它可以訪問整個屏幕區(qū)域(包括客戶區(qū)域和非客戶區(qū)域),滿足了本實驗的要求,具體實現(xiàn)代碼如下:CWindowDC dc(GetDesktopWindow());//指示一個和桌面窗口相關(guān)的dc
4.4 設(shè)置線寬、顏色等信息
在MFC中,對資源的操作通常都是通過一個與資源相關(guān)的類來完成的。對話框資源也有一個相應(yīng)的基類。因此首先需要創(chuàng)建一個類與要調(diào)用的子對話框相關(guān)聯(lián)(或者也可以選擇程序中已有的一個類與之相關(guān)聯(lián))[3]。
本實驗自定義一個設(shè)置線寬的對話框類CSettingDlg和應(yīng)用一個已有的顏色對話框類CColorDialog,具體實現(xiàn)代碼實現(xiàn)如下:
CSettingDlg dlg;//生成一個自定義設(shè)置線寬的對話框的類的對象dlg.m_nLineWidth=m_nLineWidth;//將先前設(shè)置的值保留下來并顯示if(IDOK==dlg.DoModal())// {
m_nLineWidth=dlg.m_nLineWidth;//當(dāng)用戶選擇確定按鈕時將線寬值保存起來
}
CColorDialog dlg; //生成一個已有的顏色對話框的類的對象
dlg.m_cc.rgbResult=m_clr;//保存上次選擇的顏色
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;// 當(dāng)用戶選擇確定按鈕時將顏色值保存起來
}
最后在View.cpp中的消息處理函數(shù)中按照用戶的選擇創(chuàng)建畫筆,代碼實現(xiàn)如下:
CPen pen(PS_SOLID,m_nLineWidth,m_clr);//按照上文指定的線寬和顏色創(chuàng)建畫筆
dc.SelectObject(&pen);//將此畫筆選擇到設(shè)備描述表當(dāng)中
4.5 繪圖工作
完成以上處理工作后,在Microsoft Visual Studio 2010中完成OPENCV計算機視覺開發(fā)庫的環(huán)境配置,并利用OPENCV處理后得到的坐標(biāo),在MFC中,使用dc.MoveTo()和dc.LineTo()函數(shù)根據(jù)不同的需求選擇不同的劃線方式。具體實現(xiàn)代碼不再累述。
4.6 激光筆輔助教學(xué)系統(tǒng)運行效果如圖3所示
圖3 效果圖
本文主要闡述了MFC的基本框架結(jié)構(gòu)和基于MFC的激光筆輔助教學(xué)系統(tǒng)的界面設(shè)計。從MFC的實現(xiàn)步驟中可以看出MFC是C++實現(xiàn)界面可視化的核心,借助于MFC應(yīng)用程序框架可以更加方便地編寫Windows應(yīng)用程序,也便于開發(fā)更加復(fù)雜的應(yīng)用程序。
[1]車忠志,孫雪雁.MFC應(yīng)用程序基本框架分析[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2010(09):9-12.
[2]楊建紅.文檔/視圖結(jié)構(gòu)的MFC應(yīng)用程序基本框架分析[J].湖北工學(xué)院學(xué)報,2004(04):25-30.
[3]徐璇,姜明新,黃靜,徐晶,李敏.基于MFC的工程軟件界面設(shè)計[J].電子設(shè)計工程,2011(21):13-15.
[4]孫鑫.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
本文系北京林業(yè)大學(xué)2015年北京市大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計劃項目(項目編號: S201510022086 )資助。
10.16640/j.cnki.37-1222/t.2015.21.242