幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1848|回复: 5

[原创]窗体万花筒--让RM的表现方式跨入崭新的境界。

[复制链接]

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2007-3-26 21:11:56 | 显示全部楼层 |阅读模式
因图片有数量限制,以下直接给出脚本内容,具体介绍参看此处:

http://hi.baidu.com/lingboaa/blo ... ac17d02e2e215a.html
  1. #==============================================================================
  2. # ■ A_Wds - 百变窗体  BY:美兽
  3. #------------------------------------------------------------------------------
  4. =begin
  5. #------------------------------------------------------------------------------ 
  6. 功能:任意改变窗体的形状。
  7. #------------------------------------------------------------------------------
  8. 注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。
  9. #------------------------------------------------------------------------------
  10. 基础窗体形状(四种):
  11. 1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
  12. 2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
  13.                                           圆角椭圆的高)
  14. 3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
  15. 4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
  16.                非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
  17.    例如建立一个以窗体顶部中点为顶点,底部为底边的三角形窗体。
  18.    方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
  19.    类似于菱形,五角星等形状都可实现。
  20. 5、自定窗体,具体方法见“自定窗体详解”
  21. PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。
  22. #------------------------------------------------------------------------------
  23. 原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域
  24.       进行显示,达成改变窗体的目的。
  25. #------------------------------------------------------------------------------
  26. 矩形区域的获取方法:
  27. 1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
  28. 2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
  29. 3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
  30. 4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
  31. 5、自定矩形,具体方法见“自定窗体详解”
  32. PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
  33.     影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。
  34. #------------------------------------------------------------------------------
  35. 矩形四则运算:
  36. 加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
  37. 减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
  38. 乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
  39. 除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)
  40. PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
  41.     怪的形状。
  42. #------------------------------------------------------------------------------
  43. 四则运算样例:
  44. A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
  45. 例如创建一同心环窗体具体流程:
  46. a1 = A_Wds.circle(0,0,640,480)       #创建外侧大圆形状
  47. b1 = A_Wds.circle(50,50,540,380)     #创建外侧小圆形状
  48. c1 = A_Wds.-(a1,b1,false)            #外侧大圆减外侧小圆,不改变窗体,
  49.                                      #保留新矩形
  50. a2 = A_Wds.circle(100,100,440,280)   #创建内侧大圆形状
  51. b2 = A_Wds.circle(150,150,340,180)   #创建内侧小圆形状
  52. c2 = A_Wds.-(a2,b2,false)            #内侧大圆减内侧小圆,不改变窗体,
  53.                                      #保留新矩形
  54. A_Wds.+(c1,c2,true)                  #合并内外环,生成同心环窗体。
  55. #------------------------------------------------------------------------------
  56. 自定窗体详解:
  57. 最为强大的方法,可实现任何2D形状。
  58. 以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
  59. 需要预备一张图片采集数据。
  60. 默认底色为Color.new(255,255,255)。
  61. 基本流程为:
  62. 1:采集图片数据,方法:A_Wds.makebit("图片名")。
  63. 2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)
  64. PS:
  65. 1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
  66. 2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
  67. 3:清除自定数据A_Wds.clearbit。
  68. 4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
  69.    式建立形状库,改变窗体时直接调用即可。
  70. #------------------------------------------------------------------------------
  71. 外延功能:
  72. 一:利用自定窗体与显示图片创建美观的新显示框。
  73. 二:只要输入窗体标题,非RM程序也可以通过该脚本修改。
  74. #------------------------------------------------------------------------------
  75. =end
  76. #==============================================================================
  77. module A_Wds
  78.   
  79.   @name = '百变窗体'
  80.   
  81.   #自定窗体参照底色
  82.   @color_w = Color.new(255,255,255)
  83.   #位置修正
  84.   LEFT = 3
  85.   TOP = 29
  86.   CP_ACP = 0
  87.   CP_UTF8 = 65001
  88.   WDS_AND = 0x1  
  89.   WDS_OR = 0x2   
  90.   WDS_RUC = 0x3  
  91.   WDS_SUB = 0x4  
  92.   
  93.   #转码
  94.   @m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  95.   @w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  96.   @wsm = Proc.new{|i|
  97.          len = @m2w.call(CP_UTF8, 0, i, -1, nil, 0)
  98.          buf = "\0\0" * len
  99.          @m2w.call(CP_UTF8, 0, i, -1, buf, buf.size/2)
  100.          len = @w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  101.          @s = "\0" * len
  102.          @w2m.call(CP_ACP, 0, buf, -1, @s, @s.size, nil, nil)
  103.          }
  104.   @wsm.call(@name)  
  105.   
  106.   #生成必要API
  107.   #获取目标句柄
  108.   @FindWindowEX = Win32API.new('user32','FindWindowEx','llpp','l')
  109.   @hWnd = @FindWindowEX.call(0,0,nil,@s)
  110.   #设置窗口
  111.   @setwindows = Win32API.new('user32','SetWindowRgn','lll','l')
  112.   #创建矩形(左上xy,右下xy)
  113.   @rect = Win32API.new('gdi32','CreateRectRgn','llll','l')
  114.   #创建圆角矩形(左上xy,右下xy,圆宽,圆高)
  115.   @roundrect = Win32API.new('gdi32','CreateRoundRectRgn','llllll','l')
  116.   #创建圆(左上xy,右下xy)  
  117.   @circlerect = Win32API.new('gdi32','CreateEllipticRgn','llll','l')
  118.   #创建多边形(端点连线)
  119.   @polygonrect = Win32API.new('gdi32','CreatePolygonRgn','pll','l')
  120.   
  121.   #合并矩形
  122.   @joinrect = Win32API.new('gdi32','CombineRgn','llll','l')
  123.   #删除GDI备用
  124.   @deleterect = Win32API.new('gdi32','DeleteObject','l','l')
  125.   #临时图像数据
  126.   @bitmap_date = []
  127.   
  128.   #设置窗体
  129.   def self.setwindow(rect)
  130.       @setwindows.call(@hWnd,rect,1)
  131.   end  
  132.    
  133.   #获取标准矩形
  134.   def self.rect(lx,ly,rx,ry)      
  135.       return @rect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  136.   end
  137.    
  138.   #获取圆角矩形
  139.   def self.round(lx,ly,rx,ry,cw,ch)
  140.       return @roundrect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry,cw,ch)
  141.   end
  142.   #获取圆形矩形
  143.   def self.circle(lx,ly,rx,ry)
  144.       return @circlerect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
  145.   end
  146.   #获取多边矩形
  147.   def self.polygon(*arg)
  148.       n = [*arg]
  149.       s = Array.new
  150.       for i in n
  151.          pointapi = [i[0]+LEFT,i[1]+TOP].pack('ll')
  152.          s.push pointapi
  153.       end
  154.       return @polygonrect.call(s.to_s,n.size,1)
  155.   end
  156.   #采集自定矩形数据
  157.   def self.makebit(name)
  158.       bitmap = RPG::Cache.picture(name)
  159.       for y in 0...bitmap.height
  160.          s = []
  161.          @line = false
  162.          for x in 0...bitmap.width
  163.              #Graphics.update if (x == 0)
  164.              if bitmap.get_pixel(x,y) != @color_w
  165.                 if !@line
  166.                    @line = true
  167.                    s.push(x) ; s.push(y)     
  168.                 end
  169.                 if x == bitmap.width-1
  170.                    s.push(x) ; s.push(y+1)
  171.                    @bitmap_date.push s
  172.                    s = []
  173.                    @line = false
  174.                    next
  175.                 end                 
  176.              elsif @line  
  177.                 s.push(x) ; s.push(y+1)
  178.                 @bitmap_date.push s
  179.                 s = []
  180.                 @line = false                  
  181.              end
  182.          end
  183.       end
  184.   end
  185.    
  186.   #获取自定矩形
  187.   def self.makerect(lx=0,ly=0)
  188.       return (p '无矩形数据!')if @bitmap_date.empty?
  189.       s = @rect.call(0,0,0,0)
  190.       for i in @bitmap_date
  191.          temprect = @rect.call(LEFT+i[0]+lx,TOP+i[1]+ly,LEFT+i[2]+lx,TOP+i[3]+ly)
  192.          @joinrect.call(s,s,temprect,WDS_OR)         
  193.       end
  194.       self.delete(temprect)
  195.       return s      
  196.   end
  197.    
  198.   #普通矩形窗体
  199.   def self.rectwds(lx,ly,rx,ry)
  200.       @setwindows.call(@hWnd,self.rect(lx,ly,rx,ry),1)
  201.   end
  202.    
  203.   #圆角矩形窗体
  204.   def self.roundwds(lx,ly,rx,ry,cw,ch)
  205.       @setwindows.call(@hWnd,self.round(lx,ly,rx,ry,cw,ch),1)
  206.   end
  207.   #圆形窗体
  208.   def self.circlewds(lx,ly,rx,ry)
  209.       @setwindows.call(@hWnd,self.circle(lx,ly,rx,ry),1)
  210.   end
  211.    
  212.   #多边窗体
  213.   def self.polygonwds(*arg)
  214.       @setwindows.call(@hWnd,self.polygon(*arg),1)
  215.   end
  216.    
  217.   #自定窗体
  218.   def self.makewds(lx=0,ly=0)
  219.       @setwindows.call(@hWnd,self.makerect(lx,ly),1)
  220.       @bitmap_date.clear
  221.   end
  222.    
  223.   #rect1加rect2  
  224.   def self.+(rect1,rect2,set=true)
  225.       s = @rect.call(0,0,0,0)
  226.       @joinrect.call(s,rect1,rect2,WDS_OR)
  227.       @setwindows.call(@hWnd,s,1) if set
  228.       return s   
  229.   end
  230.    
  231.   #rect1减rect2  
  232.   def self.-(rect1,rect2,set=true)
  233.       s = @rect.call(0,0,0,0)
  234.       @joinrect.call(s,rect1,rect2,WDS_SUB)
  235.       @setwindows.call(@hWnd,s,1) if set     
  236.       return s      
  237.   end
  238.    
  239.   #rect1与rect2交集  
  240.   def self./(rect1,rect2,set=true)
  241.       s = @rect.call(0,0,0,0)
  242.       @joinrect.call(s,rect1,rect2,WDS_AND)
  243.       @setwindows.call(@hWnd,s,1) if set     
  244.       return s      
  245.   end
  246.   #rect1与rect2非交集  
  247.   def self.*(rect1,rect2,set=true)
  248.       s = @rect.call(0,0,0,0)
  249.       @joinrect.call(s,rect1,rect2,WDS_RUC)
  250.       @setwindows.call(@hWnd,s,1) if set
  251.       return s     
  252.   end
  253.   
  254.   #删除GDI
  255.   def self.delete(rect)
  256.       @deleterect.call(rect)
  257.   end  
  258.   
  259. end
复制代码
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复

使用道具 举报

845

主题

1万

帖子

214748万

积分

版主

脑残中……

Rank: 7Rank: 7Rank: 7

积分
2147483647

声命组金赏

发表于 2007-3-26 21:53:26 | 显示全部楼层
Orz………… 这脚本可以搞出好多有趣的东西啊 [s:4]
http://icv.cc声动音缘配音社
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-3-26 21:59:46 | 显示全部楼层
那是相当的有趣啊! [s:7]
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

89

主题

2333

帖子

3273万

积分

⑧专业

Xavier on Rails

积分
32739794
QQ
发表于 2007-3-27 18:48:19 | 显示全部楼层
没什么说的了,赞
回复 支持 反对

使用道具 举报

0

主题

3

帖子

35

积分

②入门

积分
35
发表于 2007-5-6 03:20:51 | 显示全部楼层
[s:2]  [s:2]
呵呵
回复 支持 反对

使用道具 举报

50

主题

1235

帖子

1万

积分

⑧专业

C语言最高

积分
12447
发表于 2007-5-9 13:25:06 | 显示全部楼层
除了膜拜还能说什么呢?让我五体投地吧。。。
我的blog~:http://hi.baidu.com/soaryou/blog
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-23 08:55 , Processed in 0.016351 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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