回 帖 发 新 帖 刷新版面

主题:[讨论]请教如果让图片旋转

请教高手一个问题:
    我有张BMP的图片,我想让他在程序的窗口中以 5度角进行旋转,旋转一周。请问如何实现?

回复列表 (共4个回复)

沙发


让图片旋转,嗯!这是个有趣的问题,老狐狸行吗?自从升级到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度。

板凳

再加一点,两处忘解释了。
this.gpGraphics1.CreateFromHWND(Thisform.HWnd)
gpGraphics是老狐狸的类,仅仅生成它还不行,需要“启动”一下,这里用CreateFromHWND方法使它从form1的句柄得到gdiplus的Graphics对象,再简单的讲,就是把表单表面送给它画画。

this.gpGraphics1.SmoothingMode=4 
这个是抗锯齿设置

另外,也可以直接在设计时从组件管理器或者从控件工具栏把这两个类gpGraphics和gpImage直接放置在表单上,就不用SET CLASSLIB和AddObject了。

再有,那个Shape可以把它的边框也去掉,以免影响美观,或者干脆Visible为.F.

3 楼

谢谢。
没有使用过GDI+,在帮助里看到了,但是没有试验出来。
再次感谢。

4 楼

如果要旋转的图片较大或旋转的速度快的话,CPU使用率会大大提高,请问能否优化一下,以降低CPU使用率?谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册