搜索
aardio官方社区 门户 查看主题

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

发布者: 锦州思华年 | 发布时间: 2012-8-5 19:09| 查看数: 2973| 评论数: 5|帖子模式

目前我使用graphics.rotate(1,0/*_GdipMatrixOrderPrepend*/),我看出来它的旋转角度好像是以运行窗口的左上角为圆心的并且角度我不能控制。我想如何按照窗口的中间点旋转,然后按照30度,或者45度角进行旋转呢?

最新评论

fanishare 发表于 2012-8-31 13:51:41

呵呵,跟我想要了解的信息一样!

呵呵,跟我想要了解的信息一样!
comic 发表于 2016-8-27 19:46:52

旋转之后再平移画布...

旋转之后再平移画布...
comic 发表于 2016-8-27 22:18:32

[code][lang=aardio,false]import win.ui; /*DSG{{*/ var winform = win.form(text=

  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. //io.open();
  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.                                         //io.print(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();
复制代码
taochunsong 发表于 2016-10-23 02:57:04
看不懂

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

GMT+8, 2017-11-23 21:09 , Processed in 0.062500 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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