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