基于VC的船舶监控界面显示分辨率自适应方法
2016-09-07姚恒传张晓慧
姚恒传,张晓慧
(上海船舶运输科学研究所 航运技术与安全国家重点实验室,上海 200135;2.苏州中韩杜可设备工程有限公司,江苏 昆山 215300)
基于VC的船舶监控界面显示分辨率自适应方法
姚恒传1,张晓慧2
(上海船舶运输科学研究所 航运技术与安全国家重点实验室,上海 200135;2.苏州中韩杜可设备工程有限公司,江苏 昆山 215300)
使用Visual C++编程语言开发工具,在某船舶监控界面上实现监控软件对显示分辨率的自适应。分析用户显示器分辨率与监控软件开发分辨率不同时产生的不良后果,从而将适应性原理应用于软件设计中。重点介绍在VC 6.0版本下显示分辨率自适应系统的开发步骤,对实际应用中遇到的问题进行解决,设计并实现能够自适应显示分辨率的监控界面。该研究对于分辨率自适应技术在船舶监控界面设计中的推广和应用具有一定意义。
监控界面;自适应;分辨率
0 引 言
随着计算机技术不断发展,计算机显示器的更新换代速度逐渐加快、屏幕显示分辨率不断提高。监控软件使用平台的多样性使得监控软件需要在各种显示分辨率不同的显示器上显示。然而,监控界面的开发是在某一特定的分辨率下进行的,若用户分辨率与开发分辨率不同,则会造成监控界面显示比例失调,甚至部分监控界面无法显示。对此,提出在固定分辨率下开发的监控软件须能适应不同显示分辨率的要求,以减少系统开发的复杂性、缩短软件开发周期。下面介绍一种监控软件能自适应显示分辨率的方法。
1 显示分辨率自适应概念
显示分辨率可用来确定计算机屏幕上所显示信息的多少,以水平像素和垂直像素来衡量。显示分辨率低时,屏幕上显示的像素少,但尺寸较大;显示分辨率高时,屏幕上显示的像素多,但尺寸较小。
自适应指的是系统对环境变化的协调行为。当环境条件发生变化时,系统能主动改变自己的策略和行为,从而在新的环境下继续发挥作用。复杂自适应系统(Complex Adaptive System,CAS)理论就是现代系统科学的1个研究方向。该理论强调从发展和强化的角度看待事物,强调承认、重视各类主体的主动性和适应性。从各种主体的相互作用及其与环境的相互作用的角度去理解、处理、管理和控制相关问题。
显示分辨率自适应是指可以自动识别显示分辨率并作出相应调整,使船舶监控界面能够在各种显示分辨率下完整、清晰、合理地显示出来。
2 实现方法的研究比较
实现监控软件界面显示分辨率自适应的方法可以有多种,由参考文献[1]和文献[3]总结出一种方法,即:首先设定固定的开发分辨率,然后根据显示分辨率重新计算显示界面上各个部件的显示位置和显示大小,从而实现对显示分辨率的适应。该方法的优点是可以充分利用已有的各种控件,方便开发;缺点是必须在运行中重新计算所有显示部件的显示位置和大小,这在显示界面复杂、数量繁多的情况下会大大增加程序的复杂度。因此,该方法对于监控界面复杂且数量繁多的船舶监控界面并不适用,现就另一种方法的实现进行详细介绍。
对监控软件的显示系统进行分析后认为,各个显示界面可归结为各种显示图案,这样显示界面对显示分辨率的适应就可以转化为显示图案对显示界面的适应,工作的复杂度也就随之大大降低了。该方法的核心思想是将需要显示的界面画在后备显示缓冲中,然后将其中的内容作为图片,根据显示分辨率的大小粘贴到显示缓冲中,从而实现界面对分辨率的自适应。该方法的优点是可以完全脱离分辨率要求开发软件,程序的复杂度不会随显示界面的数量和复杂度的增加而增大;缺点是所有显示的内容都必须先画在后备显示缓冲中,而相当部分的Windows控件并不提供此功能,需要开发者重新改写控件和控件的消息处理,这会增加一定的工作量。但该项工作只要进行一次即可成为通用控件,并被所有用此方法的工程采用。
3 实现步骤及代码
3.1实现方法
要实现监控界面对显示分辨率的自适应,必须首先解决以下4个问题:
1) 获取当前显示分辨率。
在VC中,系统提供了应用程序编程接口(Application Program Interface,API)函数GetSystemMetrics,可获得当前显示的分辨率大小。具体用法为:
(1) 当前显示的宽(点素)=GetSystemMetrics(SM_CXSCREEN);
(2) 当前显示的高 (点素)=GetSystemMetrics(SM_CYSCREEN)。
通过调用此函数即可在运行中获得当前的显示分辨率。
2) 如何实现显示双缓冲。
实现双缓冲显示技术需要以下步骤:
(1) 定义一个显示设备指针CDC *m_pDC_memory.
(2) 创建内存兼容设备上下文:
m_pDC_memory=new CDC();
m_pDC_memory->CreateCompatibleDC(pDC);
(3) 创建内存兼容画布:
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,xRange,yRange);
(4) 将画布选入内存设备上下文:
CBitmap *m_pOld_pDC;
m_pOld_pDC =m_pDC_memory->SelectObject(&bitmap);
(5) 在析构函数中:
m_pDC_memory->SelectObject(m_pOld_pDC);
delete m_pDC_memory;
3) 将后备显示缓冲中的内容根据显示分辨率的大小粘贴到显示缓冲中。
要将后备显示缓冲中的内容根据显示分辨率的大小粘贴到显示缓冲中可使用函数strechblt:
pDC->StrechBlt(显示位置X,显示位置Y,显示宽,显示高,m_pDC_memory, 后备显示缓冲显示位置X,后备显示缓冲显示位置Y,固定显示宽,固定显示高, 后备显示缓冲,SRCCOPY);
使用该函数会产生图像失真现象,可通过SetStretchBitMode(pDC->hDC,STRETCH_HALFTONE)改变图像伸展模式来消除。
4) 根据新的分辨率响应鼠标消息。
由于界面自适应显示分辨率后显示内容会产生一定的拉伸,而鼠标是通过系统中断在屏幕上显示的,因此会产生鼠标位置与软件中控件位置不符的现象,必须通过修正鼠标位置来重新定位。通过改写鼠标事件的方法来实现:
POINT UsePoint;//修正后的鼠标位置
UsePoint.x=(鼠标位置.x/固定显示宽)*显示分辨率宽
UsePoint.y=(鼠标位置.y/固定显示高)*显示分辨率高
重新响应鼠标事件。
3.2开发步骤
1) 定义固定显示分辨率:
int m_nConstWidth=1 600;
int m_nConstHigh=1 200;
2) 获取屏幕分辨率:
int m_nSreenWidth= GetSystemMetrics(SM_CXSCREEN);
int m_nSreenHigh= GetSystemMetrics(SM_CYSCREEN);
3) 建立后备显示缓冲CDC *m_pDC_memory.
m_pDC_memory=new CDC();
m_pDC_memory->CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,xRange,yRange);
CBitmap *m_pOld_pDC;
m_pOld_pDC =m_pDC_memory->SelectObject(&bitmap);
4) 定义将界面画在后备显示缓冲函数:DrawScreen(CDC *pDC);
函数调用时使用后备显示缓冲:DrawScreen(m_pDC_memory);
5) 定义屏幕显示函数:
void CopyMemoryScreen()
{
CDC *pDC;
SetStretchBitMode(pDC->hDC,STRETCH_HALFTONE);
pDC->StrechBlt(0,0,m_nScreenWidth,m_nScreenHigh,
m_pDC_memory,0,0,m_nConstWidth,m_nConstHigh,SRCOPY);
}
6) 改写鼠标事件:
OnLButtonDown(UNIT nFlag,CPoint point)
{
POINT UsePoint;
UsePoint.x=(point.x*m_nConstWidth)/m_nScreenWidth;
UsePoint.y=(point.y*m_nConstHigh)/m_nScreenHigh;
DoLButtonDown(UsePoint);//响应鼠标右键按下
}
其他所有鼠标事件都要改写。
4 效果检验
利用该种方法可自动根据用户的显示分辨率调整用户界面,适应不同分辨率的要求,可自动识别显示分辨率,并作出相应调整,使船舶监控界面能在各种显示分辨率下完整、清晰、合理地显示出来。按照上述步骤编程,在固定分辨率为1 600 Px×1 200 Px下执行效果见图1~图3。
图1 屏幕分辨率为1 600 Px×1 200 Px下的执行效果
5 结 语
自适应显示分辨率解决方法设计后的主要工作是对Windows控件和控件的消息处理进行重新改写,虽然工作量会有所增加,但是该项工作只要进行一次即可成为通用控件而被所有用此方法的工程采用,因此认为这是值得的。运用该方法,即可实现监控软件对显示分辨率的自适应,同时能在各种显示分辨率下做到完整、清晰显示,使所开发的船舶监控系统用户界面友好、操作方便更具竞争力。
此外,在该方法的基础上配合TCP网络通信技术,即可开发远程桌面、远程操控技术;同时,由于该方法对WINDOWS控件和鼠标响应进行了改写,因此也为系统向非Windows扩展打下了一定基础。
图2 屏幕分辨率为800 Px×600 Px下的执行效果
图3 屏幕分辨率为2 560 Px×1 400 Px下的执行效果
[1]畅畅.VC++实现自适应型对话框[J].电脑编程技巧与维护,2005(10):42-44.
[2]樊东燕. 基于Web页面的浏览器分辨率自适应策略的探讨[J].电脑开发与应用,2009,22(5):75.
[3]董靓瑜. PB环境中自适应分辨率窗口的设计与实现[J]. 浙江海洋学院学报:自然科学版,2007,26(2):230-233.
Design of Resolution-adaptive Ship Monitoring Interface with VC
ZHANG Xiaohui,YAO Hengchuan
(1.StateKeyLaboratoryofNavigationandSafetyTechnology,ShanghaiShip&ShippingResearchInstitute,Shanghai200135,China; 2.SuzhouChina-KoreaDOOCHEquipmentEngineeringCo.,Ltd,Suzhou215300,China)
The problem of mismatch between the monitor resolution and that software designed for display is investigated and the C++ method to develop monitoring software which automatically adjusts the display resolution according to that of a monitor is introduced. The process of developing such software with VC6.0 is given, and some problems experienced during the development are described particularly.
Monitoring interface; self-adaptation; screen resolution
2015-10-28
姚恒传(1985—),男,山东潍坊人,助理工程师,主要从事工程管理工作。
1674-5949(2016)01-044-05
U665.2
A