APP下载

基于Visual C++的异形窗口及数据库便携技术的研究及应用

2013-12-29孙晓飞王霞刘梦琳

电脑知识与技术 2013年12期

摘要:提出了一种数据库便携技术,介绍了一种异形窗口技术,并综合利用了Visual C++多线程等技术实现了一个工程实例。还提出了一种新的思路:利用桌面程序和便携式数据库来开发CAI软件,不仅能让学生脱机练习,解决学生宿舍无法访问高校局域网服务器的问题,而且稍加变化即可用于上机考试,灵活机动。通过编程设置数据源的方式配合其他技术手段来达到数据库便携的目的,并对两种数据库便携技术进行了性能上的分析研究。

关键词:异形窗口;数据库便携;数据库性能

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)12-2764-04

如今基于Web浏览器的B/S程序得以流行,究其原因,不仅是因为B/S程序本身具有使用便捷、易于维护等优点,还与社会及开发人员对B/S应用的盲目跟风有一定关系。针对基于Visual C++技术开发的C/S程序,存在着应用程序的界面美化不够、没有合适的数据库便携技术等问题。

本文介绍了一种异形窗口技术和一种数据库便携解决方案,并利用这种方案开发出一个工程实例。本实例的目的在于解决日常教学中遇到的如下问题:状况较好的校园有线网络往往需要一笔费用,而WLAN也价值不菲且经常不畅通,且高校中普遍存在学生宿舍区无法访问教学区服务器的情况。若采用B/S结构来开发CAI软件,反而要受校园网络状况的限制。相比之下,一款便携的桌面练习系统对于学生学习相关课程具有非常大的优势,很受欢迎。

1 一种异形窗口技术

随着Microsoft凭借Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准。统一的界面给广大用户对应用软件的学习与使用带来了很大方便。但每天都面对同一副面孔,日久天长难免会产生一些厌倦,开发一些“离经叛道”,一改Windows应用程序千篇一律的“标准”界面,一定会给你带来一种清新的感觉。 标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。

本文利用位图创建异形对话框原理是根据象素的颜色来进行“扣像”处理,对所有非指定颜色象素区域进行区域组合,并将异形窗口功能封装成类,便于使用。这一技术,实际上就是实现对话框/窗口的位图背景,并且对指定的颜色区域进行透明处理。具体是利用SetTransparentColor来设置某种颜色是透明色。部分关键代码如下:

BOOL CDialogSS::SetTransparentColor (COLORREF col, BOOL bTrans)

{

if (g_pSetLayeredWindowAttributes == NULL) return FALSE;

if (bTrans)

{

// 把此对话框设置为layered样式

SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

// 调用pSetLayeredWindowAttributes函数,参数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;

}

其中是通过如下关键代码来获取到函数指针:

HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));

g_pSetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)

GetProcAddress(hUser32, "SetLayeredWindowAttributes");

在创建异形窗口时,先创建一副bitmap,将透明的部分设置成某种单色,比如green,然后在代码中作如下初始化:

SetBitmap(IDB_BITMAP_R); // 设置背景bitmap

SetTransparentColor(RGB(0, 255, 0)); // 设置透明颜色为绿色

本文还实现了一种HUD (平视显示器)效果,即在镂空的钟表界面中间来显示倒计时,这种炫酷的技术是采用异形窗口配合CPaintDC来实现的。本异形窗口为一个Dialog,采用单独的线程来创建此对话框,以便与主界面互不影响。效果如图1所示。

2 让数据库更“便携”

2.1 合理选择数据库并使之便携

如今数据库功能越来越强大,并发能力越来越强,但往往需要在用户电脑上安装相关数据库软件,而程序开发者往往也不够重视数据库的可移植性,造成程序更换电脑后,不能运行。而本文提供一种方案,使数据库与软件更加便携,具体思路为:

1)选用功能足够而小巧的数据库。数据库软件的选择方面,在权衡了性能与便利两方面的因素后,弃用SQL Server等配置复杂的大型数据库,而选用对Visual C++支持良好的Access数据库,对于一般的应用都能满足。

2)弃用手工配置数据源的方式,用编程代替。笔者考虑到的第一种方法是采用ADO的方式来访问数据库。ADO是一种面向对象的编程接口,是对当前微软所支持的数据库进行操作的最简单直接的方法。采用ADO创建连接,无需手工配置数据源,核心代码如下:

//实例化连接

HRESULT hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));

//用于DataGrid控件动态添加数据源

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 一种性能优化方案的提出及性能研究实验

程序在运行时需要经常访问数据库,随着题量逐渐增大,以及考试状态下访问人数的增加,对数据库访问速度的要求愈来愈高。ADO是建立在OLE DB之上的高层数据库访问技术,比ODBC方便,但在访问压力增大时速度却不尽如人意。出于性能优化的目的,笔者尝试采用一种新的方案来访问数据库,思想是先编程实现数据库文件的共享,然后配置编程配置数据源。部分核心代码如下:

//设置共享

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

//将本地共享的数据库文件配置成数据源

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数据源,既省略了手工配置数据源的麻烦,让程序可移植性更强,又明显提高了访问速度。笔者从数据库连接、查询、插入三个方面,通过批量数据求平均值的统计方法,得出各种操作平均运行时间如表1所示。从中可以看出这种方案比ADO访问方式速度有大幅提高。特别是系统使用最频繁的查询操作,运行时间缩短到了原来的近1/6。

表1 算法采用ADO和编程配置数据源方式实现的运行时间对比

注:运行时间的单位为ms

3 异形窗口与主窗口互动

本文将控制界面置于一个异形窗口上,控制主界面的相关动作。异形窗口创建之初,是在一个线程中创建异形Dialog的,创建完成后,两个界面之间的交互通过消息来进行。

异型窗口作为子窗口,它可以直接获取主窗口的指针,然后进行相应的操作,而主对话框则要通过对新的线程发送消息来操控异形窗口的行为。

4 工程实例

该工程实例是一个面向高校学生的练习—考试一体化系统。经过实际考察学生学习和学校网络环境,考虑到如今高校学生大都自备电脑,但网络却不够方便通畅,且宿舍区网络与教学区网络不在同一局域网,造成各高校院系不能灵活机动设置计算机辅助教学,作业布置与学生复习都停留在纸质书本上,从而与高速发展的信息时代相脱节,为改善学生学习环境,丰富学生学习形式,缩短吸收知识的时间间隔,开发了这个练习—考试一体化系统。

根据学生平时练习与教学考试的实际需求,将该系统灵活设计,使之可单独作为一个桌面程序用于练习,也可配合一个服务器端程序,实现统一考试。练习版有漂亮的外观和用户体验,功能包括:按章节和题型进行练习、随机选题、答案提示、评分等功能;配有服务器端软件的考试版则变为C/S模式,需要访问统一的服务器端数据库。服务器端程序有试题录入、试卷导出、考试控制等功能。客户端界面设计如图2所示,其中控制窗口为一个异形窗口,上部是一个拥有“HUD”特效的倒计时窗口,下部是控制面板。

图2 客户端

服务器端程序以简洁、实用为设计准则。包含如下功能:

1)考试控制。设置一个考试状态,所有客户端通过查询此状态来决定是否开始考试。

2)手工录入考题。可以直接通过手工录入的方式来添加试题。

3)从word导入试题。可以从word文档批量录入试题。

4)导出试题。将试题导出到word文档,以便打印。

5 结束语

技术的优劣,取决于巧妙的运用和恰当的时机。在B/S程序如日中天的当下,越来越多的软件开发者盲目跟从,不分场合的选择B/S结构,会给软件使用者带来诸多不便。该文结合了高校面临的实际需求和网络状况,独辟蹊径设计并开发了一种基于Visual C++的便携式练习与考试系统,采用了新颖的异形窗口等增强用户体验的技术,提出了一种新颖高效的数据库便携技术并进行了性能研究,达到了数据库与软件便携的目的,最终实现了一套软件兼顾练习与考试两大用途,对于当前软件开发盲目跟随的现状有一定建设意义。

参考文献:

[1] 李桂丽.基于构件设计的思想[J].鞍山钢铁学院学报,2001,8(5):350-351.

[2] 梁青,肖向军,陈德运,等.Visual C++/MFC下自定义控件的开发[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++设计“精灵”窗体[EB/OL]. (2006-05-25)[ 2012-12-08].http://dev.yesky.com/232/2413732.shtml.