快速业务通道

C++ Builder中应用GDI实现虚拟台屏

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

引言

台屏的操作是控制实现的常规操作,但是由于台屏本身固有的原因,存在一些问题,如:成本高,易损坏,维修难等。所以计算机虚拟台屏已经成为合适的替代品。在仿真领域,台屏的计算机虚拟更成为较好的一种方法。在计算机虚拟台屏的软件编制中,由于台屏的特殊性,使软件的编制存在一些相应的难点,如台屏图像的缩放、漫游、旋转等。

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);
}

这段代码中,还涉及到图像的透明问题,由于位图是矩形的,为了不覆盖背景图像,可将其它部分设置成单一色调,并

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号