摘要:提出了一種數(shù)據(jù)庫便攜技術(shù),介紹了一種異形窗口技術(shù),并綜合利用了Visual C++多線程等技術(shù)實現(xiàn)了一個工程實例。還提出了一種新的思路:利用桌面程序和便攜式數(shù)據(jù)庫來開發(fā)CAI軟件,不僅能讓學生脫機練習,解決學生宿舍無法訪問高校局域網(wǎng)服務(wù)器的問題,而且稍加變化即可用于上機考試,靈活機動。通過編程設(shè)置數(shù)據(jù)源的方式配合其他技術(shù)手段來達到數(shù)據(jù)庫便攜的目的,并對兩種數(shù)據(jù)庫便攜技術(shù)進行了性能上的分析研究。
關(guān)鍵詞:異形窗口;數(shù)據(jù)庫便攜;數(shù)據(jù)庫性能
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2013)12-2764-04
如今基于Web瀏覽器的B/S程序得以流行,究其原因,不僅是因為B/S程序本身具有使用便捷、易于維護等優(yōu)點,還與社會及開發(fā)人員對B/S應(yīng)用的盲目跟風有一定關(guān)系。針對基于Visual C++技術(shù)開發(fā)的C/S程序,存在著應(yīng)用程序的界面美化不夠、沒有合適的數(shù)據(jù)庫便攜技術(shù)等問題。
本文介紹了一種異形窗口技術(shù)和一種數(shù)據(jù)庫便攜解決方案,并利用這種方案開發(fā)出一個工程實例。本實例的目的在于解決日常教學中遇到的如下問題:狀況較好的校園有線網(wǎng)絡(luò)往往需要一筆費用,而WLAN也價值不菲且經(jīng)常不暢通,且高校中普遍存在學生宿舍區(qū)無法訪問教學區(qū)服務(wù)器的情況。若采用B/S結(jié)構(gòu)來開發(fā)CAI軟件,反而要受校園網(wǎng)絡(luò)狀況的限制。相比之下,一款便攜的桌面練習系統(tǒng)對于學生學習相關(guān)課程具有非常大的優(yōu)勢,很受歡迎。
1 一種異形窗口技術(shù)
隨著Microsoft憑借Windows在操作系統(tǒng)上取得的巨大成績,Windows用戶界面也日益成為業(yè)界標準。統(tǒng)一的界面給廣大用戶對應(yīng)用軟件的學習與使用帶來了很大方便。但每天都面對同一副面孔,日久天長難免會產(chǎn)生一些厭倦,開發(fā)一些“離經(jīng)叛道”,一改Windows應(yīng)用程序千篇一律的“標準”界面,一定會給你帶來一種清新的感覺。 標準Windows應(yīng)用程序窗口一般為帶有標題欄的淺灰色矩形外觀,因而“異形”對話框/窗口也主要是顏色與外形上動手腳。
本文利用位圖創(chuàng)建異形對話框原理是根據(jù)象素的顏色來進行“扣像”處理,對所有非指定顏色象素區(qū)域進行區(qū)域組合,并將異形窗口功能封裝成類,便于使用。這一技術(shù),實際上就是實現(xiàn)對話框/窗口的位圖背景,并且對指定的顏色區(qū)域進行透明處理。具體是利用SetTransparentColor來設(shè)置某種顏色是透明色。部分關(guān)鍵代碼如下:
BOOL CDialogSS::SetTransparentColor (COLORREF col, BOOL bTrans)
{
if (g_pSetLayeredWindowAttributes == NULL) return FALSE;
if (bTrans)
{
// 把此對話框設(shè)置為layered樣式
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// 調(diào)用pSetLayeredWindowAttributes函數(shù),參數(shù)alpha為0
g_pSetLayeredWindowAttributes(m_hWnd, col, 0, LWA_COLORKEY);
}
else
{
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
// 重繪窗口
::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
}
return TRUE;
}
其中是通過如下關(guān)鍵代碼來獲取到函數(shù)指針:
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)
GetProcAddress(hUser32, "SetLayeredWindowAttributes");
在創(chuàng)建異形窗口時,先創(chuàng)建一副bitmap,將透明的部分設(shè)置成某種單色,比如green,然后在代碼中作如下初始化:
SetBitmap(IDB_BITMAP_R); // 設(shè)置背景bitmap
SetTransparentColor(RGB(0, 255, 0)); // 設(shè)置透明顏色為綠色
本文還實現(xiàn)了一種HUD (平視顯示器)效果,即在鏤空的鐘表界面中間來顯示倒計時,這種炫酷的技術(shù)是采用異形窗口配合CPaintDC來實現(xiàn)的。本異形窗口為一個Dialog,采用單獨的線程來創(chuàng)建此對話框,以便與主界面互不影響。效果如圖1所示。
2 讓數(shù)據(jù)庫更“便攜”
2.1 合理選擇數(shù)據(jù)庫并使之便攜
如今數(shù)據(jù)庫功能越來越強大,并發(fā)能力越來越強,但往往需要在用戶電腦上安裝相關(guān)數(shù)據(jù)庫軟件,而程序開發(fā)者往往也不夠重視數(shù)據(jù)庫的可移植性,造成程序更換電腦后,不能運行。而本文提供一種方案,使數(shù)據(jù)庫與軟件更加便攜,具體思路為:
1)選用功能足夠而小巧的數(shù)據(jù)庫。數(shù)據(jù)庫軟件的選擇方面,在權(quán)衡了性能與便利兩方面的因素后,棄用SQL Server等配置復雜的大型數(shù)據(jù)庫,而選用對Visual C++支持良好的Access數(shù)據(jù)庫,對于一般的應(yīng)用都能滿足。
2)棄用手工配置數(shù)據(jù)源的方式,用編程代替。筆者考慮到的第一種方法是采用ADO的方式來訪問數(shù)據(jù)庫。ADO是一種面向?qū)ο蟮木幊探涌?,是對當前微軟所支持的?shù)據(jù)庫進行操作的最簡單直接的方法。采用ADO創(chuàng)建連接,無需手工配置數(shù)據(jù)源,核心代碼如下:
//實例化連接
HRESULT hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));
//用于DataGrid控件動態(tài)添加數(shù)據(jù)源
m_pConnection→CursorLocation =adUseClient;
//實例化記錄集
m_pRecordset.CreateInstance(_T("ADODB.Recordset"));
m_pConnection→ConnectionString=_T("uid=myid;pwd=123;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\\\\127.0.0.1\\config_share\\DataBase.mdb;");
//打開連接
hr = m_pConnection→Open(L"",L"",L"",adCmdUnspecified);
2.2 一種性能優(yōu)化方案的提出及性能研究實驗
程序在運行時需要經(jīng)常訪問數(shù)據(jù)庫,隨著題量逐漸增大,以及考試狀態(tài)下訪問人數(shù)的增加,對數(shù)據(jù)庫訪問速度的要求愈來愈高。ADO是建立在OLE DB之上的高層數(shù)據(jù)庫訪問技術(shù),比ODBC方便,但在訪問壓力增大時速度卻不盡如人意。出于性能優(yōu)化的目的,筆者嘗試采用一種新的方案來訪問數(shù)據(jù)庫,思想是先編程實現(xiàn)數(shù)據(jù)庫文件的共享,然后配置編程配置數(shù)據(jù)源。部分核心代碼如下:
//設(shè)置共享
CString batFile=_T("/c shareit.bat");
ShellExecute(NULL, _T("open"), _T("cmd.exe"), batFile , _T(".\\config\\") , SW_HIDE);
//批處理文件shareit.bat
net share config_share="%~dp0config_share"
exit
//將本地共享的數(shù)據(jù)庫文件配置成數(shù)據(jù)源
SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)\0",
"DSN=MY_ACCESS_DB\0DBQ=\\\\127.0.0.1\\config_share\\DataBase.mdb\0");
通過編程的方式來配置ODBC數(shù)據(jù)源,既省略了手工配置數(shù)據(jù)源的麻煩,讓程序可移植性更強,又明顯提高了訪問速度。筆者從數(shù)據(jù)庫連接、查詢、插入三個方面,通過批量數(shù)據(jù)求平均值的統(tǒng)計方法,得出各種操作平均運行時間如表1所示。從中可以看出這種方案比ADO訪問方式速度有大幅提高。特別是系統(tǒng)使用最頻繁的查詢操作,運行時間縮短到了原來的近1/6。
表1 算法采用ADO和編程配置數(shù)據(jù)源方式實現(xiàn)的運行時間對比
注:運行時間的單位為ms
3 異形窗口與主窗口互動
本文將控制界面置于一個異形窗口上,控制主界面的相關(guān)動作。異形窗口創(chuàng)建之初,是在一個線程中創(chuàng)建異形Dialog的,創(chuàng)建完成后,兩個界面之間的交互通過消息來進行。
異型窗口作為子窗口,它可以直接獲取主窗口的指針,然后進行相應(yīng)的操作,而主對話框則要通過對新的線程發(fā)送消息來操控異形窗口的行為。
4 工程實例
該工程實例是一個面向高校學生的練習—考試一體化系統(tǒng)。經(jīng)過實際考察學生學習和學校網(wǎng)絡(luò)環(huán)境,考慮到如今高校學生大都自備電腦,但網(wǎng)絡(luò)卻不夠方便通暢,且宿舍區(qū)網(wǎng)絡(luò)與教學區(qū)網(wǎng)絡(luò)不在同一局域網(wǎng),造成各高校院系不能靈活機動設(shè)置計算機輔助教學,作業(yè)布置與學生復習都停留在紙質(zhì)書本上,從而與高速發(fā)展的信息時代相脫節(jié),為改善學生學習環(huán)境,豐富學生學習形式,縮短吸收知識的時間間隔,開發(fā)了這個練習—考試一體化系統(tǒng)。
根據(jù)學生平時練習與教學考試的實際需求,將該系統(tǒng)靈活設(shè)計,使之可單獨作為一個桌面程序用于練習,也可配合一個服務(wù)器端程序,實現(xiàn)統(tǒng)一考試。練習版有漂亮的外觀和用戶體驗,功能包括:按章節(jié)和題型進行練習、隨機選題、答案提示、評分等功能;配有服務(wù)器端軟件的考試版則變?yōu)镃/S模式,需要訪問統(tǒng)一的服務(wù)器端數(shù)據(jù)庫。服務(wù)器端程序有試題錄入、試卷導出、考試控制等功能。客戶端界面設(shè)計如圖2所示,其中控制窗口為一個異形窗口,上部是一個擁有“HUD”特效的倒計時窗口,下部是控制面板。
圖2 客戶端
服務(wù)器端程序以簡潔、實用為設(shè)計準則。包含如下功能:
1)考試控制。設(shè)置一個考試狀態(tài),所有客戶端通過查詢此狀態(tài)來決定是否開始考試。
2)手工錄入考題??梢灾苯油ㄟ^手工錄入的方式來添加試題。
3)從word導入試題。可以從word文檔批量錄入試題。
4)導出試題。將試題導出到word文檔,以便打印。
5 結(jié)束語
技術(shù)的優(yōu)劣,取決于巧妙的運用和恰當?shù)臅r機。在B/S程序如日中天的當下,越來越多的軟件開發(fā)者盲目跟從,不分場合的選擇B/S結(jié)構(gòu),會給軟件使用者帶來諸多不便。該文結(jié)合了高校面臨的實際需求和網(wǎng)絡(luò)狀況,獨辟蹊徑設(shè)計并開發(fā)了一種基于Visual C++的便攜式練習與考試系統(tǒng),采用了新穎的異形窗口等增強用戶體驗的技術(shù),提出了一種新穎高效的數(shù)據(jù)庫便攜技術(shù)并進行了性能研究,達到了數(shù)據(jù)庫與軟件便攜的目的,最終實現(xiàn)了一套軟件兼顧練習與考試兩大用途,對于當前軟件開發(fā)盲目跟隨的現(xiàn)狀有一定建設(shè)意義。
參考文獻:
[1] 李桂麗.基于構(gòu)件設(shè)計的思想[J].鞍山鋼鐵學院學報,2001,8(5):350-351.
[2] 梁青,肖向軍,陳德運,等.Visual C++/MFC下自定義控件的開發(fā)[J].哈爾濱理工大學學報,2004,9(4):79-81.
[3] SECO J C,CAIRES L.A Basic Model of Typed Componets[A].Presented at 14th Conference on Object-oriented Programming,Cannes[C].Franca,2000.
[4] 劉濤.用Visual C++設(shè)計“精靈”窗體[EB/OL]. (2006-05-25)[ 2012-12-08].http://dev.yesky.com/232/2413732.shtml.