分享
 
 
 

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

王朝c/c++·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

引言

台屏的操作是控制实现的常规操作,但是由于台屏本身固有的原因,存在一些问题,如:成本高,易损坏,维修难等。所以计算机虚拟台屏已经成为合适的替代品。在仿真领域,台屏的计算机虚拟更成为较好的一种方法。

在计算机虚拟台屏的软件编制中,由于台屏的非凡性,使软件的编制存在一些相应的难点,如台屏图像的缩放、漫游、旋转等。

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技术的独立于硬件的特点使它能够在各种系统下已正常运行,在虚拟台屏的软件编制中满足目前的图像变化需要。

更多内容请看C/C++技术专题 C/C++应用实例专题,或

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有