aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 13652|回复: 4

gdip图形库,画布如何进行按照指定的角度进行旋转

[复制链接]

7

主题

15

回帖

143

积分

一级会员

积分
143
发表于 2012-8-5 19:09:45 | 显示全部楼层 |阅读模式
目前我使用graphics.rotate(1,0/*_GdipMatrixOrderPrepend*/),我看出来它的旋转角度好像是以运行窗口的左上角为圆心的并且角度我不能控制。我想如何按照窗口的中间点旋转,然后按照30度,或者45度角进行旋转呢?

10

主题

61

回帖

493

积分

新手入门

积分
493
发表于 2012-8-31 13:51:41 | 显示全部楼层
呵呵,跟我想要了解的信息一样!

0

主题

2

回帖

16

积分

新手入门

积分
16
发表于 2016-8-27 19:46:52 | 显示全部楼层
旋转之后再平移画布...

0

主题

2

回帖

16

积分

新手入门

积分
16
发表于 2016-8-27 22:18:32 | 显示全部楼层
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=600)
  4. winform.add(
  5. button={cls="button";text="旋转图片";left=597;top=276;right=714;bottom=370;z=2};
  6. button6={cls="button";text="改变图片大小";left=602;top=126;right=713;bottom=207;z=3};
  7. custom={cls="custom";text="custom";left=0;top=0;right=300;bottom=300;bgcolor=12632256;z=1}
  8. )
  9. /*}}*/

  10. import mouse.hook


  11. //import console;
  12. /*
  13. import console;
  14. */

  15. var show = false;

  16. var rotateOn = false;
  17. var resizeOn = false;

  18. var cusRect = null;         //custom控件的Rect
  19. var angle = 0;                        //鼠标绕图片中心旋转的角度
  20. var mouseSpeed = 10;
  21. var distance = 0;                //鼠标位置与图片左上角的距离


  22. var brush = gdip.solidBrush( 0xFFFFFFFF );
  23. var bmp = gdip.bitmap("d:\Project\aardio\backup\asuka.bmp")
  24. var img = gdip.bitmap(bmp.width,bmp.height)
  25. var graphics = gdip.graphics(img);

  26. //为了模拟绕中心旋转,取得画布平移的XY
  27. //思路:知道两点坐标,可获取中点坐标
  28. var getOffsetXY = function( w,h,angle ){
  29.        
  30.         var sinA = math.sin(math.rad(angle));
  31.         var cosA = math.cos(math.rad(angle));
  32.        
  33.         var x =  (w*cosA-h*sinA)/2 ;
  34.         var y =  (w*sinA+h*cosA)/2 ;
  35.        
  36.         x = w/2 - x;
  37.         y = h/2 - y;
  38.        
  39.         return x,y;
  40. }

  41. //一定程度避免重复计算
  42. //顺时针旋转1°画布平移的x,y值
  43. var tsltX,tsltY = getOffsetXY( bmp.width,bmp.height,1 );
  44. //逆时针旋转1°画布平移的x,y值
  45. var negTsltX,negTsltY = getOffsetXY( bmp.width,bmp.height,-1 );


  46. //鼠标绕图片中心旋转时相比上一次移动的角度
  47. //很大程度是旋转1°
  48. var offsetAngle = function(cusRect,mx,my){

  49.         var x = mx - (cusRect.right+cusRect.left)/2;
  50.         var y = my - (cusRect.bottom+cusRect.top)/2;
  51.         var newAngle = ..math.round( ..math.deg(..math.atan2(y,x)))
  52.         var offsetAngle = newAngle - angle;       
  53.         angle = newAngle;
  54.                
  55.         return offsetAngle;
  56. }

  57. //绘制图片
  58. var draw = function( msg,p ){
  59.         show = true;
  60.         gdi.windowBuffer( winform.custom.hwnd,
  61.             function( hdc,hMemDc,hMemBitmap,width,height ){
  62.                    
  63.                     var g = gdip.graphics(hMemDc)
  64.                     g.compositingQuality = 2/*_GdipCompositingQualityHighQuality*/ ;
  65.                 g.smoothingMode = 2/*_GdipSmoothingModeHighQuality*/ ;
  66.                     select( msg ) {
  67.                             case "rotate" {
  68.                                    
  69.                                     graphics.fillRectangle(brush,0,0,bmp.width,bmp.height)
  70.                                         graphics.rotate( p.angle, 1/*_MatrixOrderAppend*/ )
  71.                                         graphics.translate( p.tsltX,p.tsltY, 1/*_MatrixOrderAppend*/)
  72.                                        
  73.                                         graphics.drawImageRect(bmp,0,0,bmp.width,bmp.height)
  74.                                        
  75.                                         g.setClipRect(0,0,width,height);
  76.                                         g.drawImageRect(img,0,0,width,height)
  77.                                    
  78.                             }
  79.                             case "room" {
  80.                                     graphics.drawImageRect(bmp,0,0,bmp.width,bmp.height)
  81.                                     //graphics.drawImageRectRect(bmp,0,0,width,height,0,0,bmp.width,bmp.height)
  82.                                         g.drawImageRect(img,0,0,width,height)
  83.                                         //g.drawImageScale(img,winform.custom.getRect())
  84.                                         //console.log(bmp.width,bmp.height,img.width,img.height)
  85.                             }
  86.                             case "redraw" {
  87.                                            
  88.                                         g.drawImageRect(img,0,0,width,height)
  89.                             }
  90.                     }
  91.                         g.delete();
  92.                 ::BitBlt(hdc, 0, 0, width, height, hMemDc, 0, 0, 0xCC0020/*_SRCCOPY*/);
  93.             }
  94.         )
  95. }

  96. //定义获取鼠标的移动速度
  97. SystemParametersInfo = ::User32.api("SystemParametersInfoA","int(int uAction,int uParam,int &lpvParam,int fuWinIni)" )

  98. winform.button.oncommand = function(id,event){

  99.         cusRect = winform.custom.getRect(true);
  100.        
  101.         rotateOn = true;
  102.        
  103.         //获得当前鼠标速度以便恢复
  104.         var rs,lpvParam = SystemParametersInfo(0x70/*_SPI_GETMOUSESPEED*/,0,0,0)
  105.         mouseSpeed = lpvParam;
  106.        
  107.         var lowMouseSpeed = 5;
  108.         //降低鼠标速度
  109.         ::User32.SystemParametersInfo(0x71/*_SPI_SETMOUSESPEED*/,0,lowMouseSpeed,0)
  110.        
  111.         var mx,my = win.getMessagePos();

  112.         var x = mx - (cusRect.right+cusRect.left)/2;
  113.         var y = my - (cusRect.bottom+cusRect.top)/2;
  114.         angle = ..math.round( ..math.deg(..math.atan2(y,x)))
  115.        
  116.         var hk = mouse.hook();
  117.         hk.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){
  118.                 if( injected ) return;         
  119.             select(msg) {
  120.                     case 0x201/*_WM_LBUTTONDOWN*/{
  121.                         rotateOn = false;
  122.                         hk.close();
  123.                         ::User32.SystemParametersInfo(0x71/*_SPI_SETMOUSESPEED*/,0,mouseSpeed,0);
  124.                        
  125.                         return true;
  126.                     }
  127.                     case 0x200/*_WM_MOUSEMOVE*/{
  128.                             if(rotateOn){
  129.                                         var offsetAngle = offsetAngle(cusRect,x,y);
  130.                                        
  131.                                         var prama = {
  132.                                                 ["angle"] = offsetAngle;
  133.                                         };
  134.                                         select( offsetAngle ) {
  135.                                                 case 1 {
  136.                                                         prama = {
  137.                                                                 ["angle"] = 1;
  138.                                                                 ["tsltX"] = tsltX;
  139.                                                                 ["tsltY"] = tsltY;
  140.                                                         }       
  141.                                                         draw( "rotate",prama );
  142.                                                 }
  143.                                                 case -1 {
  144.                                                         prama = {
  145.                                                                 ["angle"] = -1;
  146.                                                                 ["tsltX"] = negTsltX;
  147.                                                                 ["tsltY"] = negTsltY;
  148.                                                         }
  149.                                                         draw( "rotate",prama );
  150.                                                 }
  151.                                                 case !0 {
  152.                                                         prama.tsltX,prama.tsltY = getOffsetXY( bmp.width,bmp.height,offsetAngle );
  153.                                                         draw( "rotate",prama );
  154.                                                 }
  155.                                         }
  156.                                        
  157.                                 }
  158.                     }  
  159.             }   
  160.         }
  161. }



  162. winform.button6.oncommand = function(id,event){

  163.         var mx,my = win.getMessagePos();

  164.         cusRect = winform.custom.getRect(true);
  165.         distance = math.round( math.sqrt( (cusRect.left-mx)**2+(cusRect.top-my)**2 ) );

  166.         resizeOn = true;
  167.         var hk = mouse.hook();
  168.         hk.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){
  169.                 if( injected ) return;         
  170.             select(msg) {
  171.                     case 0x201/*_WM_LBUTTONDOWN*/{
  172.                         resizeOn = false;
  173.                         hk.close();

  174.                         return true;
  175.                     }
  176.                     case 0x200/*_WM_MOUSEMOVE*/{
  177.                             if(resizeOn){
  178.                                         var d = math.round( math.sqrt( (x-cusRect.left)**2+(y-cusRect.top)**2 ) );
  179.                                        
  180.                                         var ratio = math.round( d/distance,2 );
  181.                                        
  182.                                         var        w = (cusRect.right - cusRect.left)*ratio;
  183.                                         var        h = (cusRect.bottom - cusRect.top)*ratio;
  184.                                        
  185.                                         winform.custom.setPos(,,w,h);  //这里窗口会闪烁
  186.                                         draw( "room" );
  187.                                 }
  188.                     }  
  189.             }   
  190.         }
  191.        
  192. }




  193. winform.custom.onEraseBkgnd  = function(hwnd,message,wParam,lParam){
  194.         if(show){
  195.                 draw( "redraw" );
  196.             return false;
  197.         }
  198.         //show = true;
  199. }




  200. winform.onClose = function(hwnd,message,wParam,lParam){
  201.     bmp.dispose();
  202.         img.dispose();
  203.         graphics.delete();
  204. }

  205. winform.custom.image = "d:\Project\aardio\backup\asuka.bmp";


  206. winform.show();
  207. win.loopMessage();
复制代码

2

主题

24

回帖

135

积分

一级会员

积分
135
QQ
发表于 2016-10-23 02:57:04 | 显示全部楼层
看不懂
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-2-13 08:54 , Processed in 0.077577 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表