C++ Builder中应用GDI实现虚拟台屏
当前位置:以往代写 > C/C++ 教程 >C++ Builder中应用GDI实现虚拟台屏
2019-06-13

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

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

副标题#e#

引言

台屏的操纵是节制实现的通例操纵,可是由于台屏自己固有的原因,存在一些问题,如:本钱高,易损坏,维修难等。所以计较机虚拟台屏已经成为符合的替代品。在仿真规模,台屏的计较机虚拟更成为较好的一种要领。在计较机虚拟台屏的软件体例中,由于台屏的非凡性,使软件的体例存在一些相应的难点,如台屏图像的缩放、周游、旋转等。

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

下面给出了一段完整的包括中心点、指针值、量程范畴、角度范畴、零点角度、指针位图的措施源代码,并适当加以注释,以便详细说明如何对一幅指针位图举办旋转的。


#p#副标题#e#

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,人眼无法感受不持续。这样只需选取适当的增减幅度就能实现指针的持续移动。

#p#副标题#e#

台屏显示的周游

在软台屏显示时,台屏在保障显示的清晰度的同时,有时巨细要大于显示器的全屏,而操纵员要求可举办屏幕周游,即画面的拖拉移动。为实现这一成果,可在应用窗口中配置程度及垂直转动条–HorzScrollBar、VertScrollBar,并在相应的动态显示坐标加上程度及垂直偏移量。在举办周游操纵的相应事件处理惩罚里对程度及垂直转动条的位置属性举办批改。例句如下:

#p#分页标题#e#

以这两句取代实现动态操纵时的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技能的独立于硬件的特点使它可以或许在各类系统下已正常运行,在虚拟台屏的软件体例中满意今朝的图像变革需要。

    关键字:

在线提交作业