下面图老师小编跟大家分享C++ Builder中应用GDI实现虚拟台屏,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~
【 tulaoshi.com - 编程语言 】
引言typedef struct _XFORM { 
  FLOAT eM11; 水平缩放因子,旋转角度的余弦 
  FLOAT eM12; 水平比例因子,旋转角度的正弦
  FLOAT eM21; 垂直比例因子,旋转角度的正弦负值
  FLOAT eM22; 垂直缩放因子,旋转角度的余弦
  FLOAT eDx; 水平转换偏差
  FLOAT eDy; 垂直转换偏差
} XFORM;X’ = x * eM11 + y * eM21 + eDx
Y’ = x * eM12 + y * eM22 + eDyvoid __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);
}X-HorzScrollBar-Position
Y-VertScrollBar-Position
在实现漫游操作时,执行
HorzScrollBar-Position= HorzScrollBar-Position +movx/*偏移量x*/
VertScrollBar-Position=VertScrollBar-Position+movy; /*偏移量y*/xform.eM11 =X坐标比例因子;
Xform.eM12 =0;
Xform.eM21 = 0;
xform.eM22 =Y坐标比例因子;;
xform.eDx =偏移量x;
xform.eDy =偏移量y;来源:http://www.tulaoshi.com/n/20160219/1600542.html
看过《C++ Builder中应用GDI实现虚拟台屏》的人还看了以下文章 更多>>