主题:[讨论]请教如果让图片旋转
Gleam
[专家分:3100] 发布于 2009-08-12 11:17:00
请教高手一个问题:
我有张BMP的图片,我想让他在程序的窗口中以 5度角进行旋转,旋转一周。请问如何实现?
回复列表 (共4个回复)
沙发
Ilikefox [专家分:5770] 发布于 2009-08-14 01:28:00
让图片旋转,嗯!这是个有趣的问题,老狐狸行吗?自从升级到9版本,老狐狸还真能旋转旋转图片。简单的旋转90度、180度、270度甚至镜像显示,都是小意思了。你要它转个5度,这、这,不行!我是说仅靠老狐狸自己是不行的。我们常听说,用老狐狸干些超出它自身提供的能力的事,比如浏览网页、发送邮件、做个有窟窿的表单、播放电影等等等等,这些其实都是老狐狸找帮手(比如其它语言开发的控件、系统提供的用户接口函数)干的,并且老狐狸和这些帮手还真是合作愉快,你在运行时完全不会留意这些帮手,给你的感觉是:哈哈!这老狐狸还真行。
要让图片旋转,角度还能任意指定,老狐狸又要请帮手了,这回请的是GDI Plus(GDI+ 图形设备接口)。最浅显地讲,就是一个叫做gdiplus.dll的动态链接库文件,这家伙提供各种对象,使应用程序能操作图形。如果你用过Win32API函数,那么这个家伙用法类似,你要先DECLARE各种必要的函数,然后有目的的执行这些函数,最终达到你的目的。事实上,直接去用,相当麻烦。这里要感谢老狐狸的创作人员,他们为我们编写了一个可视化类库_gdiplus.vcx(这个文件在FFC文件夹中),尽可能的简化了我们的工作量。我们所要做的,就是生成这个类库中的合适的对象,可能需要设置设置属性,然后执行执行方法,OK了。
接下来解决实际问题,我们只需要用到_gdiplus.vcx中的2个类,一个叫gpGraphics,一个叫gpImage,由它们生成对象,然后就能完成任务。
一步一步跟我做:
1. 新建一个表单(form1),在表单上放置一个形状控件(Shape1),设置Shape1的BackStyle属性为0(透明)。《说明一下:这个透明的Shape纯粹是为了将来好定位图片的,请设置合适的大小和位置。另外,要转动的图片尺寸尽量和这个Shape1差不多》
2. 呵呵,重要的来了。在form1的Init事件中写入代码:
PUBLIC nAngle,X0,Y0,nTop,nLeft,nWidth,nHeight
SET CLASSLIB TO HOME(1)+"Ffc\_gdiplus.vcx"
nAngle=0 &&该变量表示旋转角度,初始为0
WITH thisform.shape1
X0=INT(.Left+.width/2) &&(X0,Y0)是旋转中心坐标
Y0=INT(.Top+.Height/2)
nLeft=.Left &&这4个变量表示图片位置
nTop=.Top
nWidth=.Width
nHeight=.Height
ENDWITH
this.AddObject("gpGraphics1","gpGraphics") &&生成gpGraphics对象
this.AddObject("gpImage1","gpImage") &&生成gpImage对象
this.gpGraphics1.CreateFromHWND(Thisform.HWnd)
this.gpGraphics1.SmoothingMode=4
this.gpImage1.CreateFromFile("D:\Studying\03.bmp") &&此处请改为你图片文件的路径
3. 放一个计时器控件(Timer1),设置合适的Interval属性,然后在Timer事件中写入代码:
THISFORM.CLS &&清屏幕
nAngle = IIF(nAngle=360,0,nAngle+5) &&转角加5度,360到头重新为0
WITH THISFORM.gpGraphics1
.TranslateTransform(X0,Y0,0) &&设置旋转中心
.RotateTransform(nAngle,0) &&按角度旋转
.TranslateTransform(0-X0,0-Y0,0) &&恢复
.DrawImageScaled(THISFORM.gpImage1,nLeft,nTop,nWidth,nHeight) &&画图,呵呵
.ResetTransform() &&恢复绘图矩阵
ENDWITH
4。大功告成,运行表单看看。
小结:这个纯粹就事论事,未作过多解释,其实_gdiplus.vcx类库的好东东还多着呢。请到MSDN查看。另外说一句,楼主像是要做个指针式钟表,呵呵,每秒转5度。
板凳
Ilikefox [专家分:5770] 发布于 2009-08-14 01:47:00
再加一点,两处忘解释了。
this.gpGraphics1.CreateFromHWND(Thisform.HWnd)
gpGraphics是老狐狸的类,仅仅生成它还不行,需要“启动”一下,这里用CreateFromHWND方法使它从form1的句柄得到gdiplus的Graphics对象,再简单的讲,就是把表单表面送给它画画。
this.gpGraphics1.SmoothingMode=4
这个是抗锯齿设置
另外,也可以直接在设计时从组件管理器或者从控件工具栏把这两个类gpGraphics和gpImage直接放置在表单上,就不用SET CLASSLIB和AddObject了。
再有,那个Shape可以把它的边框也去掉,以免影响美观,或者干脆Visible为.F.
3 楼
Gleam [专家分:3100] 发布于 2009-08-14 11:34:00
谢谢。
没有使用过GDI+,在帮助里看到了,但是没有试验出来。
再次感谢。
4 楼
llk39 [专家分:0] 发布于 2011-11-09 06:59:00
如果要旋转的图片较大或旋转的速度快的话,CPU使用率会大大提高,请问能否优化一下,以降低CPU使用率?谢谢!
我来回复