• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
C++
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
C++ Builder中应用GDI实现虚拟台屏
软件发布 C++ Builder中应用GDI实现虚拟台屏
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> BCB教程 >> C++ Builder中应用GDI实现虚拟台屏

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

添加时间: 2007-7-9 3:14:02  作者: BCB教程  阅读次数:105   来源: http://www.d9soft.com

        引言

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

  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++ Builder2006控件的安装方法 下一篇文章: 用C++ Builder实现电子邮件群发

相关文章:

  • 飞速在线看视频 傲盾加速帮你实现速度感受
  • 用端口碰撞技术实现服务器远程管理
  • 防止垃圾邮件中转的总结-两个虚拟SMTP服务器
  • 城域网光缆线路设计与技术应用
  • servlet实现oracle中读出文件并显示

相关软件:

  • 飞翔虚拟视频 1.4
  • AGIsBuilder V1.0 汉化版
  • WinDiskXP 虚拟加密硬盘 V1.2.4
  • A4 Flash Menu Builder V2.29
  • All AHM Triton Tools 2002 Borland C++Builder V6.0
  • Site Builder V1.2.1

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • 如何在C++ Builder环境中实现在菜...
  • Windows下DLL编程技术及应用
  • 在BCB中使用DirectX
  • 用C++Builder开发动画DLL
  • 用C++Builder建立多线程COM服务器
  • C++Builder定制系统菜单
  • ODBC中的同步与异步执行模式
  • C++ Builder下数据库报表Master/D...
  • BCB环境下CORBA实做之客户端
  • 在C++Builer中多线程的实现

BCB教程阅读排行

  • C++ Builder 初学问与答(一)
  • 在 C++ Builder中利用串行通信控件...
  • C++ Builder 初学问与答(二)
  • 漫谈C++ Builder多线程编程技术
  • C++ Builder 初学问与答(十六)
  • C++ Builder 初学问与答(八)
  • 在C++ Builder中用Ole控制Excel表
  • C++ Builder 初学问与答(六)
  • C++ Builder 初学问与答(四)
  • C++ Builder 初学问与答(七)

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有