程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Builder中應用GDI實現虛擬台屏

C++ Builder中應用GDI實現虛擬台屏

編輯:C++入門知識
 引言

   台屏的操作是控制實現的常規操作,但是由於台屏本身固有的原因,存在一些問題,如:成本高,易損壞,維修難等。所以計算機虛擬台屏已經成為合適的替代品。在仿真領域,台屏的計算機虛擬更成為較好的一種方法。在計算機虛擬台屏的軟件編制中,由於台屏的特殊性,使軟件的編制存在一些相應的難點,如台屏圖像的縮放、漫游、旋轉等。

   C++ Builder是基於Windows進行可視化C語言開發的最好的技術平台之一。利用C++ Builder提供的基本組件,結合Windows SDK(Software Development Kit)的功能函數,通過使用Windows圖形設備接口(GDI),標准應用窗口T form及其屬性和方法,編制了一套虛擬台屏軟件。軟件中針對操作台屏的一些特點,提供了有效的解決方法。

  台屏顯示的指針旋轉及透明

   軟台屏的指針表的實現是台屏中最常遇到的問題,通常的軟件是簡化指針外表,即畫一條線段來表示指針。在實際台屏的指針表不可簡化時,軟件的編制就需要實現指針圖像的旋轉。

   Windows圖形設備接口(GDI)在圖形繪制時,是獨立於圖形設備的。它在軟件和硬件之間提供了一個抽象層。為了將圖形繪制坐標向圖形設備坐標進行轉換, GDI設計了一個數據結構XFORM。結構如下:

typedef struct _XFORM {
  FLOAT eM11; 水平縮放因子,旋轉角度的余弦
  FLOAT eM12; 水平比例因子,旋轉角度的正弦
  FLOAT eM21; 垂直比例因子,旋轉角度的正弦負值
  FLOAT eM22; 垂直縮放因子,旋轉角度的余弦
  FLOAT eDx; 水平轉換偏差
  FLOAT eDy; 垂直轉換偏差
} XFORM;

   圖形設備坐標(x’,y’)依據如下公式進行轉換:

X’ = x * eM11 + y * eM21 + eDx
Y’ = x * eM12 + y * eM22 + eDy

   下面給出了一段完整的包含中心點、指針值、量程范圍、角度范圍、零點角度、指針位圖的程序源代碼,並適當加以注釋,以便具體說明如何對一幅指針位圖進行旋轉的。

void __fast call TForm1::rotatedraw(int x, int y,/* 中心點是指圍繞旋轉的點*/float ff, /*指針值是指針指向的數值*/float hr,float lr, /*量程范圍是指針表的顯示數值區間*/ float scale0,float scale1, /*角度范圍是指針表的顯示角度區間*/float rscale, /*零點角度是指針表的最小顯示數值角度*/  Graphics::TBitmap *p/*指針位圖是指針的標准橫向由左向右的位圖指針*/){ 
  XFORM xform;
  Float tf, f;
  /*防止除零導致浮點溢出*/
  If (x==0) x=0.0001;
   /*旋轉角度換算*/
   To=(ff-lr)*(scale0-scale1)/(hr-lr)-rscale;
   F=3.14159265*tf/180;
   /*轉換坐標系定義*/
   Xform.eM11 = cos (f);
   Xform.eM12 = sin (f);
   Xform.eM21 = -sin (f);
   Xform.eM22 = cos (f);
   Xform.eDx =x- (sqrt (x*x+y*y))*(cos (f+atan (y/x)));//-sin (f)*p->Height/2;
   Xform.eDy =y- (sqrt (x*x+y*y))*(sin (f+atan (y/x)));//-cos (f)*p->Height/2;
   /*轉換坐標系設置*/
   SetGraphicsMode (Form1->Canvas->Handle, GM_ADVANCED);
   SetWorldTransform (Form1->Canvas->Handle, &xform);
   /*透明方式*/
   P->Transparent = true;
   /*透明顏色定義*/
   P->Transparent Color = p->Canvas->Pixels [0][0];
   /*指針繪制*/
   Form1->Canvas->Draw (x, y, p);
   /*透明方式取消*/
   P->Transparent = false;
   /*轉換坐標系恢復設置*/
   Xform.eM11 = 1;
   Xform.eM12 = 0;
   Xform.eM21 = 0;
   Xform.eM22 = 1;
   Xform.eDx = 0;
   Xform.eDy = 0;
   SetWorldTransform (Form1->Canvas->Handle, &xform);
}

   這段代碼中,還涉及到圖像的透明問題,由於位圖是矩形的,為了不覆蓋背景圖像,可將其它部分設置成單一色調,並定義為透明顏色,這樣就可實現圖像式指針的旋轉了。但在畫面實現時,存在圖像不連續的問題,為解決這一問題,可設置專用定時器Point Timer,它的間隔時間可設置為30毫秒,這樣一來刷新頻率高於24Hz,人眼無法感覺不連續。這樣只需選取適當的增減幅度就能實現指針的連續移動。

  台屏顯示的漫游

   在軟台屏顯示時,台屏在保障顯示的清晰度的同時,有時大小要大於顯示器的全屏,而操作員要求可進行屏幕漫游,即畫面的拖拉移動。為實現這一功能,可在應用窗口中設置水平及垂直滾動條--HorzScrollBar、VertScrollBar,並在相應的動態顯示坐標加上水平及垂直偏移量。在進行漫游操作的相應事件處理裡對水平及垂直滾動條的位置屬性進行修正。例句如下:

   以這兩句代替實現動態操作時的x,y坐標

X-HorzScrollBar->Position
Y-VertScrollBar->Position
在實現漫游操作時,執行
HorzScrollBar->Position= HorzScrollBar->Position +movx/*偏移量x*/
VertScrollBar->Position=VertScrollBar->Position+movy; /*偏移量y*/

  台屏顯示的縮放及光字處理

   台屏軟件的制作可以采用全貌圖為調用總菜單,但即使是這樣,仍然需要實現畫面的縮放。畫面縮放的實現可有多種方法,比如采用圖像旋轉相同的方法修改轉換坐標系XFORM,設置如下:

xform.eM11 =X坐標比例因子;
Xform.eM12 =0;
Xform.eM21 = 0;
xform.eM22 =Y坐標比例因子;;
xform.eDx =偏移量x;
xform.eDy =偏移量y;

   此外,也可以采用在標准應用窗口Tform上添加一層影像Timage,並設置它的伸展屬性Stretch 為 TRUE。這樣在加載任意大小的圖像後,圖像都會對應調整為影像Timage的大小,這種方法主要應用於窗口大小的變化。

   針對局部圖像的縮放,可采用第三種方法,創建一個Tbitmap,對它實現繪制,完成後利用StretchBlt函數將指定矩形內的圖像縮放後拷貝到標准應用窗口上,這種應用於局部圖像的大小變化,效果較好。

   在台屏軟件的制作中,光字出現的很多,為避免大量圖元的繪制,可將背景圖復制後,進行顏色修改。動態實現時,利用透明技術,調用標准應用窗口的CopyRect函數,在指定矩形內實現光字變化。這種技術也可用於實現一些特殊圖形的動態變化。

  結束語

   C++ Builder已經獲得了廣泛應用。Windows SDK(Software Development Kit)又提供了強大的功能函數,通過Windows圖形設備接口(GDI),解決了虛擬台屏的一些問題。這些方法已經在諸多的軟件編制中得到了應用,並取得了良好的效果。GDI技術的獨立於硬件的特點使它能夠在各種系統下已正常運行,在虛擬台屏的軟件編制中滿足目前的圖像變化需要。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved