赞 | 0 |
VIP | 17 |
好人卡 | 0 |
积分 | 1 |
经验 | 1022914 |
最后登录 | 2017-2-4 |
在线时间 | 10 小时 |
Lv1.梦旅人 月下可怜人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 10 小时
- 注册时间
- 2005-11-23
- 帖子
- 4085

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
脚本内容详解:
功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。
注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。
基础窗体形状(四种):
1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
圆角椭圆的高)
3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
类似于菱形,五角星等形状都可实现。
5、自定窗体,具体方法见“自定窗体详解”
PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。
![]()
![]()
原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域进行显示,达成改变窗体的目的。
矩形区域的获取方法:
1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
5、自定矩形,具体方法见“自定窗体详解”
PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。
矩形四则运算:
加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)
PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
怪的形状。
四则运算样例:
A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
例如创建一同心环窗体具体流程:
a1 = A_Wds.circle(0,0,640,480) #创建外侧大圆形状
b1 = A_Wds.circle(50,50,540,380) #创建外侧小圆形状
c1 = A_Wds.-(a1,b1,false) #外侧大圆减外侧小圆,不改变窗体,
#保留新矩形
a2 = A_Wds.circle(100,100,440,280) #创建内侧大圆形状
b2 = A_Wds.circle(150,150,340,180) #创建内侧小圆形状
c2 = A_Wds.-(a2,b2,false) #内侧大圆减内侧小圆,不改变窗体,
#保留新矩形
A_Wds.+(c1,c2,true) #合并内外环,生成同心环窗体。
![]()
自定窗体详解:
最为强大的方法,可实现任何2D形状。
以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
需要预备一张图片采集数据。
默认底色为Color.new(255,255,255)。
基本流程为:
1:采集图片数据,方法:A_Wds.makebit("图片名")。
2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)
PS:
1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
3:清除自定数据A_Wds.clearbit。
4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
式建立形状库,改变窗体时直接调用即可。
![]()
![]()
![]()
外延功能:
一:利用自定窗体与显示图片创建美观的新显示框。
![]()
二:只要输入窗体标题,非RM程序也可以通过该脚本修改。
![]()
展示范例之形体变化
ftp://[email protected]/个� ... 窗体之变化.rar
展示范例之事件表达
让RM的事件制作更上一层楼。
ftp://[email protected]/个� ... 窗体之事件.rar
![]()
源程序:
- #==============================================================================
- # ■ A_Wds - 百变窗体 BY:美兽
- #------------------------------------------------------------------------------
- =begin
- #------------------------------------------------------------------------------
- 功能:任意改变窗体的形状,@name = '百变窗体'处换成自己的工程名。
- #------------------------------------------------------------------------------
- 注意:1、全屏模式下会恢复正常,可配合夏娜的禁止ALT+ENTER使用。
- #------------------------------------------------------------------------------
- 基础窗体形状(四种):
- 1、矩形窗体,调用方式:A_Wds.rectwds(X坐标,Y坐标,宽,高)
- 2、圆角矩形窗体,调用方式:A_Wds.roundwds(X坐标,Y坐标,宽,高,圆角椭圆的宽,
- 圆角椭圆的高)
- 3、圆形窗体,调用方式:A_Wds.circlewds(X坐标,Y坐标,宽,高)
- 4、多边形窗体,调用方式:A_Wds.polygonwds([端点1],[端点2],[端点3]……)
- 非常强大的方法,端点数不限,程序会根据端点顺序自动连接成形状。
- 例如修改窗体成一个以窗口顶部中点为顶点,底部为底边创立一三角形窗体。
- 方法为:A_Wds.polygonwds([320,0],[0,480],[640,480])
- 类似于菱形,五角星等形状都可实现。
- 5、自定窗体,具体方法见“自定窗体详解”
- PS:坐标的基准为窗体内部的显示区域左上角为基准,即与RM内建对象标准相同。
- #------------------------------------------------------------------------------
- 原理:创建一矩形(矩形非数学意义的方形,代表区域)区域,将窗体移入该区域
- 进行显示,达成改变窗体的目的。
- #------------------------------------------------------------------------------
- 矩形区域的获取方法:
- 1、标准矩形:A_Wds.rect(X坐标,Y坐标,宽,高)
- 2、圆角矩形,A_Wds.round(X坐标,Y坐标,宽,高,圆角椭圆的宽,圆角椭圆的高)
- 3、圆形矩形,A_Wds.circle(X坐标,Y坐标,宽,高)
- 4、多边形矩形,A_Wds.polygon([端点1],[端点2],[端点3]……)
- 5、自定矩形,具体方法见“自定窗体详解”
- PS:这几个方法是利用返回值获取矩形,因还未将窗体移动其内,不会对窗体形状造成
- 影响,可利用内定的四则运算对矩形合并拆解,以得到新的形状。
- #------------------------------------------------------------------------------
- 矩形四则运算:
- 加法:取两矩形并集,调用方法,A_Wds.+(矩形1,矩形2,是否立即改变窗体)
- 减法:矩形1减矩形2,调用方法,A_Wds.-(矩形1,矩形2,是否立即改变窗体)
- 乘法:取两矩形非交集部分,调用方法,A_Wds.*(矩形1,矩形2,是否立即改变窗体)
- 除法:取两矩形交集,调用方法,A_Wds./(矩形1,矩形2,是否立即改变窗体)
- PS:方法返回值的是合并后的新矩形,所以可不立即改变窗体,多次运算,创建希奇古
- 怪的形状。
- #------------------------------------------------------------------------------
- 四则运算样例:
- A_Wds.setwindow(矩形)可直接设置窗体,主要配合四则运算得出的矩形。
- 例如创建一同心环窗体具体流程:
- a1 = A_Wds.circle(0,0,640,480) #创建外侧大圆形状
- b1 = A_Wds.circle(50,50,540,380) #创建外侧小圆形状
- c1 = A_Wds.-(a1,b1,false) #外侧大圆减外侧小圆,不改变窗体,
- #保留新矩形
- a2 = A_Wds.circle(100,100,440,280) #创建内侧大圆形状
- b2 = A_Wds.circle(150,150,340,180) #创建内侧小圆形状
- c2 = A_Wds.-(a2,b2,false) #内侧大圆减内侧小圆,不改变窗体,
- #保留新矩形
- A_Wds.+(c1,c2,true) #合并内外环,生成同心环窗体。
- #------------------------------------------------------------------------------
- 自定窗体详解:
- 最为强大的方法,可实现任何2D形状。
- 以一张图片的底色@color_w为参照背景,将窗体变化为非底色部分的形状,所以事先
- 需要预备一张图片采集数据。
- 默认底色为Color.new(255,255,255)。
- 基本流程为:
- 1:采集图片数据,方法:A_Wds.makebit("图片名")。
- 2:根据图片数据生成矩形并改变窗体,方法:A_Wds.makewds(x坐标偏移,y坐标偏移)
- PS:
- 1:获取自定义矩形的方法:A_Wds.makerect,可正常四则运算。
- 2:A_Wds.makerect与A_Wds.makewds必须保证已用A_Wds.makebit采集完数据,否则无效。
- 3:清除自定数据A_Wds.clearbit。
- 4:因采集过程比较慢,640*480约2秒,所以可预先采集存储在变量中,利用存档的方
- 式建立形状库,改变窗体时直接调用即可。
- #------------------------------------------------------------------------------
- 外延功能:
- 一:利用自定窗体与显示图片创建美观的新显示框。
- 二:只要输入窗体标题,非RM程序也可以通过该脚本修改。
- #------------------------------------------------------------------------------
- =end
- #==============================================================================
- module A_Wds
-
- @name = '百变窗体'
-
- #自定窗体参照底色
- @color_w = Color.new(255,255,255)
- #位置修正
- LEFT = 3
- TOP = 29
- CP_ACP = 0
- CP_UTF8 = 65001
- WDS_AND = 0x1
- WDS_OR = 0x2
- WDS_RUC = 0x3
- WDS_SUB = 0x4
-
- #转码
- @m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
- @w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
- @wsm = Proc.new{|i|
- len = @m2w.call(CP_UTF8, 0, i, -1, nil, 0)
- buf = "\0\0" * len
- @m2w.call(CP_UTF8, 0, i, -1, buf, buf.size/2)
- len = @w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
- @s = "\0" * len
- @w2m.call(CP_ACP, 0, buf, -1, @s, @s.size, nil, nil)
- }
- @wsm.call(@name)
-
- #生成必要API
- #获取目标句柄
- @FindWindowEX = Win32API.new('user32','FindWindowEx','llpp','l')
- @hWnd = @FindWindowEX.call(0,0,nil,@s)
- #设置窗口
- @setwindows = Win32API.new('user32','SetWindowRgn','lll','l')
- #创建矩形(左上xy,右下xy)
- @rect = Win32API.new('gdi32','CreateRectRgn','llll','l')
- #创建圆角矩形(左上xy,右下xy,圆宽,圆高)
- @roundrect = Win32API.new('gdi32','CreateRoundRectRgn','llllll','l')
- #创建圆(左上xy,右下xy)
- @circlerect = Win32API.new('gdi32','CreateEllipticRgn','llll','l')
- #创建多边形(端点连线)
- @polygonrect = Win32API.new('gdi32','CreatePolygonRgn','pll','l')
-
- #合并矩形
- @joinrect = Win32API.new('gdi32','CombineRgn','llll','l')
- #删除GDI备用
- @deleterect = Win32API.new('gdi32','DeleteObject','l','l')
- #临时图像数据
- @bitmap_date = []
-
- #设置窗体
- def self.setwindow(rect)
- @setwindows.call(@hWnd,rect,1)
- end
-
- #获取标准矩形
- def self.rect(lx,ly,rx,ry)
- return @rect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
- end
-
- #获取圆角矩形
- def self.round(lx,ly,rx,ry,cw,ch)
- return @roundrect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry,cw,ch)
- end
- #获取圆形矩形
- def self.circle(lx,ly,rx,ry)
- return @circlerect.call(LEFT+lx,TOP+ly,LEFT+lx+rx,TOP+ly+ry)
- end
- #获取多边矩形
- def self.polygon(*arg)
- n = [*arg]
- s = Array.new
- for i in n
- pointapi = [i[0]+LEFT,i[1]+TOP].pack('ll')
- s.push pointapi
- end
- return @polygonrect.call(s.to_s,n.size,1)
- end
- #采集自定矩形数据
- def self.makebit(name)
- bitmap = RPG::Cache.picture(name)
- for y in 0...bitmap.height
- s = []
- @line = false
- for x in 0...bitmap.width
- #Graphics.update if (x == 0)
- if bitmap.get_pixel(x,y) != @color_w
- if !@line
- @line = true
- s.push(x) ; s.push(y)
- end
- if x == bitmap.width-1
- s.push(x) ; s.push(y+1)
- @bitmap_date.push s
- s = []
- @line = false
- next
- end
- elsif @line
- s.push(x) ; s.push(y+1)
- @bitmap_date.push s
- s = []
- @line = false
- end
- end
- end
- end
-
- #获取自定矩形
- def self.makerect(lx=0,ly=0)
- return (p '无矩形数据!')if @bitmap_date.empty?
- s = @rect.call(0,0,0,0)
- for i in @bitmap_date
- temprect = @rect.call(LEFT+i[0]+lx,TOP+i[1]+ly,LEFT+i[2]+lx,TOP+i[3]+ly)
- @joinrect.call(s,s,temprect,WDS_OR)
- end
- self.delete(temprect)
- return s
- end
-
- #普通矩形窗体
- def self.rectwds(lx,ly,rx,ry)
- @setwindows.call(@hWnd,self.rect(lx,ly,rx,ry),1)
- end
-
- #圆角矩形窗体
- def self.roundwds(lx,ly,rx,ry,cw,ch)
- @setwindows.call(@hWnd,self.round(lx,ly,rx,ry,cw,ch),1)
- end
- #圆形窗体
- def self.circlewds(lx,ly,rx,ry)
- @setwindows.call(@hWnd,self.circle(lx,ly,rx,ry),1)
- end
-
- #多边窗体
- def self.polygonwds(*arg)
- @setwindows.call(@hWnd,self.polygon(*arg),1)
- end
-
- #自定窗体
- def self.makewds(lx=0,ly=0)
- @setwindows.call(@hWnd,self.makerect(lx,ly),1)
- @bitmap_date.clear
- end
-
- #rect1加rect2
- def self.+(rect1,rect2,set=true)
- s = @rect.call(0,0,0,0)
- @joinrect.call(s,rect1,rect2,WDS_OR)
- @setwindows.call(@hWnd,s,1) if set
- return s
- end
-
- #rect1减rect2
- def self.-(rect1,rect2,set=true)
- s = @rect.call(0,0,0,0)
- @joinrect.call(s,rect1,rect2,WDS_SUB)
- @setwindows.call(@hWnd,s,1) if set
- return s
- end
-
- #rect1与rect2交集
- def self./(rect1,rect2,set=true)
- s = @rect.call(0,0,0,0)
- @joinrect.call(s,rect1,rect2,WDS_AND)
- @setwindows.call(@hWnd,s,1) if set
- return s
- end
- #rect1与rect2非交集
- def self.*(rect1,rect2,set=true)
- s = @rect.call(0,0,0,0)
- @joinrect.call(s,rect1,rect2,WDS_RUC)
- @setwindows.call(@hWnd,s,1) if set
- return s
- end
-
- #删除GDI
- def self.delete(rect)
- @deleterect.call(rect)
- end
-
- end
复制代码
[本贴由 叶舞枫 于 2007-4-1 19:37:48 进行了编辑] |
|