姚恒傳,張曉慧
(上海船舶運輸科學研究所 航運技術與安全國家重點實驗室,上海 200135;2.蘇州中韓杜可設備工程有限公司,江蘇 昆山 215300)
?
基于VC的船舶監控界面顯示分辨率自適應方法
姚恒傳1,張曉慧2
(上海船舶運輸科學研究所 航運技術與安全國家重點實驗室,上海 200135;2.蘇州中韓杜可設備工程有限公司,江蘇 昆山 215300)
使用Visual C++編程語言開發工具,在某船舶監控界面上實現監控軟件對顯示分辨率的自適應。分析用戶顯示器分辨率與監控軟件開發分辨率不同時產生的不良后果,從而將適應性原理應用于軟件設計中。重點介紹在VC 6.0版本下顯示分辨率自適應系統的開發步驟,對實際應用中遇到的問題進行解決,設計并實現能夠自適應顯示分辨率的監控界面。該研究對于分辨率自適應技術在船舶監控界面設計中的推廣和應用具有一定意義。
監控界面;自適應;分辨率
隨著計算機技術不斷發展,計算機顯示器的更新換代速度逐漸加快、屏幕顯示分辨率不斷提高。監控軟件使用平臺的多樣性使得監控軟件需要在各種顯示分辨率不同的顯示器上顯示。然而,監控界面的開發是在某一特定的分辨率下進行的,若用戶分辨率與開發分辨率不同,則會造成監控界面顯示比例失調,甚至部分監控界面無法顯示。對此,提出在固定分辨率下開發的監控軟件須能適應不同顯示分辨率的要求,以減少系統開發的復雜性、縮短軟件開發周期。下面介紹一種監控軟件能自適應顯示分辨率的方法。
顯示分辨率可用來確定計算機屏幕上所顯示信息的多少,以水平像素和垂直像素來衡量。顯示分辨率低時,屏幕上顯示的像素少,但尺寸較大;顯示分辨率高時,屏幕上顯示的像素多,但尺寸較小。
自適應指的是系統對環境變化的協調行為。當環境條件發生變化時,系統能主動改變自己的策略和行為,從而在新的環境下繼續發揮作用。復雜自適應系統(Complex Adaptive System,CAS)理論就是現代系統科學的1個研究方向。該理論強調從發展和強化的角度看待事物,強調承認、重視各類主體的主動性和適應性。從各種主體的相互作用及其與環境的相互作用的角度去理解、處理、管理和控制相關問題。
顯示分辨率自適應是指可以自動識別顯示分辨率并作出相應調整,使船舶監控界面能夠在各種顯示分辨率下完整、清晰、合理地顯示出來。
實現監控軟件界面顯示分辨率自適應的方法可以有多種,由參考文獻[1]和文獻[3]總結出一種方法,即:首先設定固定的開發分辨率,然后根據顯示分辨率重新計算顯示界面上各個部件的顯示位置和顯示大小,從而實現對顯示分辨率的適應。該方法的優點是可以充分利用已有的各種控件,方便開發;缺點是必須在運行中重新計算所有顯示部件的顯示位置和大小,這在顯示界面復雜、數量繁多的情況下會大大增加程序的復雜度。因此,該方法對于監控界面復雜且數量繁多的船舶監控界面并不適用,現就另一種方法的實現進行詳細介紹。
對監控軟件的顯示系統進行分析后認為,各個顯示界面可歸結為各種顯示圖案,這樣顯示界面對顯示分辨率的適應就可以轉化為顯示圖案對顯示界面的適應,工作的復雜度也就隨之大大降低了。該方法的核心思想是將需要顯示的界面畫在后備顯示緩沖中,然后將其中的內容作為圖片,根據顯示分辨率的大小粘貼到顯示緩沖中,從而實現界面對分辨率的自適應。該方法的優點是可以完全脫離分辨率要求開發軟件,程序的復雜度不會隨顯示界面的數量和復雜度的增加而增大;缺點是所有顯示的內容都必須先畫在后備顯示緩沖中,而相當部分的Windows控件并不提供此功能,需要開發者重新改寫控件和控件的消息處理,這會增加一定的工作量。但該項工作只要進行一次即可成為通用控件,并被所有用此方法的工程采用。
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);//響應鼠標右鍵按下
}
其他所有鼠標事件都要改寫。
利用該種方法可自動根據用戶的顯示分辨率調整用戶界面,適應不同分辨率的要求,可自動識別顯示分辨率,并作出相應調整,使船舶監控界面能在各種顯示分辨率下完整、清晰、合理地顯示出來。按照上述步驟編程,在固定分辨率為1 600 Px×1 200 Px下執行效果見圖1~圖3。

圖1 屏幕分辨率為1 600 Px×1 200 Px下的執行效果
自適應顯示分辨率解決方法設計后的主要工作是對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