姚恒傳,張曉慧
(上海船舶運輸科學研究所 航運技術與安全國家重點實驗室,上海 200135;2.蘇州中韓杜可設備工程有限公司,江蘇 昆山 215300)
?
基于VC的船舶監(jiān)控界面顯示分辨率自適應方法
姚恒傳1,張曉慧2
(上海船舶運輸科學研究所 航運技術與安全國家重點實驗室,上海 200135;2.蘇州中韓杜可設備工程有限公司,江蘇 昆山 215300)
使用Visual C++編程語言開發(fā)工具,在某船舶監(jiān)控界面上實現(xiàn)監(jiān)控軟件對顯示分辨率的自適應。分析用戶顯示器分辨率與監(jiān)控軟件開發(fā)分辨率不同時產(chǎn)生的不良后果,從而將適應性原理應用于軟件設計中。重點介紹在VC 6.0版本下顯示分辨率自適應系統(tǒng)的開發(fā)步驟,對實際應用中遇到的問題進行解決,設計并實現(xiàn)能夠自適應顯示分辨率的監(jiān)控界面。該研究對于分辨率自適應技術在船舶監(jiān)控界面設計中的推廣和應用具有一定意義。
監(jiān)控界面;自適應;分辨率
隨著計算機技術不斷發(fā)展,計算機顯示器的更新?lián)Q代速度逐漸加快、屏幕顯示分辨率不斷提高。監(jiān)控軟件使用平臺的多樣性使得監(jiān)控軟件需要在各種顯示分辨率不同的顯示器上顯示。然而,監(jiān)控界面的開發(fā)是在某一特定的分辨率下進行的,若用戶分辨率與開發(fā)分辨率不同,則會造成監(jiān)控界面顯示比例失調(diào),甚至部分監(jiān)控界面無法顯示。對此,提出在固定分辨率下開發(fā)的監(jiān)控軟件須能適應不同顯示分辨率的要求,以減少系統(tǒng)開發(fā)的復雜性、縮短軟件開發(fā)周期。下面介紹一種監(jiān)控軟件能自適應顯示分辨率的方法。
顯示分辨率可用來確定計算機屏幕上所顯示信息的多少,以水平像素和垂直像素來衡量。顯示分辨率低時,屏幕上顯示的像素少,但尺寸較大;顯示分辨率高時,屏幕上顯示的像素多,但尺寸較小。
自適應指的是系統(tǒng)對環(huán)境變化的協(xié)調(diào)行為。當環(huán)境條件發(fā)生變化時,系統(tǒng)能主動改變自己的策略和行為,從而在新的環(huán)境下繼續(xù)發(fā)揮作用。復雜自適應系統(tǒng)(Complex Adaptive System,CAS)理論就是現(xiàn)代系統(tǒng)科學的1個研究方向。該理論強調(diào)從發(fā)展和強化的角度看待事物,強調(diào)承認、重視各類主體的主動性和適應性。從各種主體的相互作用及其與環(huán)境的相互作用的角度去理解、處理、管理和控制相關問題。
顯示分辨率自適應是指可以自動識別顯示分辨率并作出相應調(diào)整,使船舶監(jiān)控界面能夠在各種顯示分辨率下完整、清晰、合理地顯示出來。
實現(xiàn)監(jiān)控軟件界面顯示分辨率自適應的方法可以有多種,由參考文獻[1]和文獻[3]總結出一種方法,即:首先設定固定的開發(fā)分辨率,然后根據(jù)顯示分辨率重新計算顯示界面上各個部件的顯示位置和顯示大小,從而實現(xiàn)對顯示分辨率的適應。該方法的優(yōu)點是可以充分利用已有的各種控件,方便開發(fā);缺點是必須在運行中重新計算所有顯示部件的顯示位置和大小,這在顯示界面復雜、數(shù)量繁多的情況下會大大增加程序的復雜度。因此,該方法對于監(jiān)控界面復雜且數(shù)量繁多的船舶監(jiān)控界面并不適用,現(xiàn)就另一種方法的實現(xiàn)進行詳細介紹。
對監(jiān)控軟件的顯示系統(tǒng)進行分析后認為,各個顯示界面可歸結為各種顯示圖案,這樣顯示界面對顯示分辨率的適應就可以轉(zhuǎn)化為顯示圖案對顯示界面的適應,工作的復雜度也就隨之大大降低了。該方法的核心思想是將需要顯示的界面畫在后備顯示緩沖中,然后將其中的內(nèi)容作為圖片,根據(jù)顯示分辨率的大小粘貼到顯示緩沖中,從而實現(xiàn)界面對分辨率的自適應。該方法的優(yōu)點是可以完全脫離分辨率要求開發(fā)軟件,程序的復雜度不會隨顯示界面的數(shù)量和復雜度的增加而增大;缺點是所有顯示的內(nèi)容都必須先畫在后備顯示緩沖中,而相當部分的Windows控件并不提供此功能,需要開發(fā)者重新改寫控件和控件的消息處理,這會增加一定的工作量。但該項工作只要進行一次即可成為通用控件,并被所有用此方法的工程采用。
3.1實現(xiàn)方法
要實現(xiàn)監(jiān)控界面對顯示分辨率的自適應,必須首先解決以下4個問題:
1) 獲取當前顯示分辨率。
在VC中,系統(tǒng)提供了應用程序編程接口(Application Program Interface,API)函數(shù)GetSystemMetrics,可獲得當前顯示的分辨率大小。具體用法為:
(1) 當前顯示的寬(點素)=GetSystemMetrics(SM_CXSCREEN);
(2) 當前顯示的高 (點素)=GetSystemMetrics(SM_CYSCREEN)。
通過調(diào)用此函數(shù)即可在運行中獲得當前的顯示分辨率。
2) 如何實現(xiàn)顯示雙緩沖。
實現(xiàn)雙緩沖顯示技術需要以下步驟:
(1) 定義一個顯示設備指針CDC *m_pDC_memory.
(2) 創(chuàng)建內(nèi)存兼容設備上下文:
m_pDC_memory=new CDC();
m_pDC_memory->CreateCompatibleDC(pDC);
(3) 創(chuàng)建內(nèi)存兼容畫布:
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,xRange,yRange);
(4) 將畫布選入內(nèi)存設備上下文:
CBitmap *m_pOld_pDC;
m_pOld_pDC =m_pDC_memory->SelectObject(&bitmap);
(5) 在析構函數(shù)中:
m_pDC_memory->SelectObject(m_pOld_pDC);
delete m_pDC_memory;
3) 將后備顯示緩沖中的內(nèi)容根據(jù)顯示分辨率的大小粘貼到顯示緩沖中。
要將后備顯示緩沖中的內(nèi)容根據(jù)顯示分辨率的大小粘貼到顯示緩沖中可使用函數(shù)strechblt:
pDC->StrechBlt(顯示位置X,顯示位置Y,顯示寬,顯示高,m_pDC_memory, 后備顯示緩沖顯示位置X,后備顯示緩沖顯示位置Y,固定顯示寬,固定顯示高, 后備顯示緩沖,SRCCOPY);
使用該函數(shù)會產(chǎn)生圖像失真現(xiàn)象,可通過SetStretchBitMode(pDC->hDC,STRETCH_HALFTONE)改變圖像伸展模式來消除。
4) 根據(jù)新的分辨率響應鼠標消息。
由于界面自適應顯示分辨率后顯示內(nèi)容會產(chǎn)生一定的拉伸,而鼠標是通過系統(tǒng)中斷在屏幕上顯示的,因此會產(chǎn)生鼠標位置與軟件中控件位置不符的現(xiàn)象,必須通過修正鼠標位置來重新定位。通過改寫鼠標事件的方法來實現(xiàn):
POINT UsePoint;//修正后的鼠標位置
UsePoint.x=(鼠標位置.x/固定顯示寬)*顯示分辨率寬
UsePoint.y=(鼠標位置.y/固定顯示高)*顯示分辨率高
重新響應鼠標事件。
3.2開發(fā)步驟
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) 定義將界面畫在后備顯示緩沖函數(shù):DrawScreen(CDC *pDC);
函數(shù)調(diào)用時使用后備顯示緩沖:DrawScreen(m_pDC_memory);
5) 定義屏幕顯示函數(shù):
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);//響應鼠標右鍵按下
}
其他所有鼠標事件都要改寫。
利用該種方法可自動根據(jù)用戶的顯示分辨率調(diào)整用戶界面,適應不同分辨率的要求,可自動識別顯示分辨率,并作出相應調(diào)整,使船舶監(jiān)控界面能在各種顯示分辨率下完整、清晰、合理地顯示出來。按照上述步驟編程,在固定分辨率為1 600 Px×1 200 Px下執(zhí)行效果見圖1~圖3。
圖1 屏幕分辨率為1 600 Px×1 200 Px下的執(zhí)行效果
自適應顯示分辨率解決方法設計后的主要工作是對Windows控件和控件的消息處理進行重新改寫,雖然工作量會有所增加,但是該項工作只要進行一次即可成為通用控件而被所有用此方法的工程采用,因此認為這是值得的。運用該方法,即可實現(xiàn)監(jiān)控軟件對顯示分辨率的自適應,同時能在各種顯示分辨率下做到完整、清晰顯示,使所開發(fā)的船舶監(jiān)控系統(tǒng)用戶界面友好、操作方便更具競爭力。
此外,在該方法的基礎上配合TCP網(wǎng)絡通信技術,即可開發(fā)遠程桌面、遠程操控技術;同時,由于該方法對WINDOWS控件和鼠標響應進行了改寫,因此也為系統(tǒng)向非Windows擴展打下了一定基礎。
圖2 屏幕分辨率為800 Px×600 Px下的執(zhí)行效果
圖3 屏幕分辨率為2 560 Px×1 400 Px下的執(zhí)行效果
[1]暢暢.VC++實現(xiàn)自適應型對話框[J].電腦編程技巧與維護,2005(10):42-44.
[2]樊東燕. 基于Web頁面的瀏覽器分辨率自適應策略的探討[J].電腦開發(fā)與應用,2009,22(5):75.
[3]董靚瑜. PB環(huán)境中自適應分辨率窗口的設計與實現(xiàn)[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