设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2044|回复: 4
打印 上一主题 下一主题

[讨论] [抛砖引玉]关于鼠标绘制UI的一些看法和两个简单情况

[复制链接]
头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

跳转到指定楼层
1
发表于 2014-5-15 02:10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

Lv2.观梦者


  • 更新完成啦

梦石
0
星屑
799
在线时间
6267 小时
注册时间
2006-6-7
帖子
8462
2
发表于 2014-5-15 02:15:48 | 只看该作者
→_→。。范例请抛出来!

点评

错了是RMVA限定 ↓  发表于 2014-5-15 02:54
http://codepad.org/TXC2zkHK RMVX限定,放在Main前  发表于 2014-5-15 02:49
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

3
发表于 2014-5-15 11:04:20 | 只看该作者
本帖最后由 Sion 于 2014-5-15 11:07 编辑

稍微添加了限制窗口最小大小,以及激活窗口置于最前面的功能
RUBY 代码复制
  1. module Seiran20
  2.   module_function
  3.   class ::Integer; def to_ptr; self; end; def to_param; 'i'; end; def ord; self; end; end
  4.   class ::String;def to_ptr; [self].pack('p').unpack('L').first; end; def to_param; 'p'; end; end
  5.  
  6.  
  7.   def api(dll,func)
  8.     lambda{|*args|
  9.        Win32API.new(dll,func,args.map{|x|x.to_param}, 'i').call *args
  10.     }
  11.   end
  12.  
  13.   def callproc(addr, type = :cdecl)
  14.     stdcall = type == :stdcall
  15.     raise "addr == 0 " if addr.to_ptr == 0
  16.     apicall = api('user32', 'CallWindowProcW')
  17.     lambda{|*args|apicall.call((code=[0x55,0xe589].pack('CS')+args.map{|x| [0x68, x.to_ptr].pack('CL')}.reverse.join+[0xb8, addr.to_ptr, 0xD0FF, 0xc481, (stdcall ? 0 : args.length*4) , 0x10c2c9].pack('CLSSLL')),0,0,0,0)}
  18.   end
  19.  
  20.   LL  = api("kernel32", "LoadLibrary")
  21.   GPA = api("kernel32", "GetProcAddress")
  22.   def funcaddr(dll, func)
  23.      x = GPA.call(LL.call(dll), func)
  24.      x == 0 ? nil : x
  25.   end
  26.   def capi(dll, func)
  27.      callproc(GPA.call(LL.call(dll), func))
  28.   end     
  29.  
  30.   def hwnd
  31.           msg , r, pm, ac = "\0"*24, 0, api('user32', 'PeekMessage'), api('user32', 'GetAncestor')
  32.           loop do
  33.             return r if pm.call(msg, 0, 0, 0, 0) != 0 and ((r = ac.call(msg.unpack('L').first, 3))!=0)
  34.             ::Graphics.update if defined?(::Graphics)
  35.          end
  36.   end
  37. end
  38.  
  39.  
  40.  
  41. module Mouse
  42.   extend Seiran20
  43.   WINDOW = hwnd
  44.   EVENT = []
  45.  
  46.   GS = api 'user32', 'GetCursorPos'
  47.   SC = api 'user32', 'ScreenToClient'
  48.   KEY = api 'user32', 'GetKeyState'
  49.  
  50.  
  51.   def self.x
  52.     @x  
  53.   end
  54.  
  55.   def self.y
  56.     @y
  57.   end
  58.  
  59.   def self.mousepos
  60.     GS.call buf = "\0"*8
  61.     SC.call WINDOW, buf
  62.     buf.unpack "ll"
  63.   end
  64.  
  65.   def self.update
  66.     lastx, lasty = @x, @y
  67.  
  68.     @x, @y = mousepos
  69.     if lastx != @x || lasty != @y
  70.       EVENT.push :mouse_move
  71.     end
  72.     lastkey = (@key|| 0) & 0x8000
  73.     @key= KEY.call(1) & 0x8000
  74.     if lastkey != @key
  75.       EVENT.push @key== 0x8000 ? :mouse_down : :mouse_up
  76.     end
  77.   end
  78.  
  79.   def self.has_event?
  80.     !EVENT.empty?
  81.   end
  82. end
  83.  
  84. def mouse_event
  85.   Mouse::EVENT.shift
  86. end
  87.  
  88.  
  89.  
  90. def get_window_under_mouse
  91.   $window_list.reverse.find{|w| #找一个包含了鼠标位置的窗体
  92.     w.x <= Mouse.x && Mouse.x < w.x + w.width &&
  93.     w.y <= Mouse.y && Mouse.y < w.y + w.height
  94.   }
  95. end
  96.  
  97. $data_system = load_data 'Data/system.rvdata2'
  98. def new_window(x, y)
  99.   w = Window.new x, y, 1, 1
  100.   w.windowskin = Cache.system('window')
  101.   w.tone = $data_system.window_tone
  102.   w.z = $window_list.size #######add
  103.   w
  104. end
  105.  
  106. def active_window #######add
  107.   mz = $window_list.size - 1
  108.   $window_list.each {|w|
  109.     w.z -= 1 if w.z >= $window.z
  110.   }
  111.   $window.z = mz
  112. end
  113.  
  114. def resize_window #######add
  115.   $window.width  = Mouse.x - $window.x
  116.   $window.width  = 30 if $window.width < 30
  117.   $window.height = Mouse.y - $window.y
  118.   $window.height = 22 if $window.height < 22
  119. end
  120.  
  121. def main_logic
  122.    case [mouse_event, $status]
  123.        when [:mouse_down, :normal]
  124.             if $window = get_window_under_mouse # 鼠标下能取到窗体,就当是拖动
  125.                $status = :window_selected
  126.                $cx, $cy = Mouse.x - $window.x, Mouse.y - $window.y
  127.                active_window #######add
  128.              else
  129.                $status = :create_window         # 否则就是创建
  130.                $window = new_window(Mouse.x, Mouse.y)
  131.             end
  132.        when [:mouse_up, :window_selected]
  133.                $status = :normal
  134.        when [:mouse_up, :create_window]
  135.                $window_list.push $window #加入到某个窗口列表
  136.                $status = :normal
  137.                $window = nil
  138.        when [:mouse_move, :window_selected]
  139.                $window.x, $window.y = Mouse.x - $cx, Mouse.y - $cy
  140.        when [:mouse_move, :create_window]
  141.                resize_window #######add
  142.    end while Mouse::has_event?
  143. end
  144.  
  145. def ui_update
  146.   main_logic
  147.   $window_list.each{|x| x.update}
  148.   $window.update if $window
  149. end
  150.  
  151. $status = :normal
  152. $window_list = []
  153.  
  154. loop do
  155.   Graphics.update
  156.   Input.update
  157.   Mouse.update
  158.   ui_update
  159. end
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

4
发表于 2014-5-17 15:56:52 | 只看该作者
想法:
仿VB仿得再完全一点吧!加一个工具箱和“浏览...”按钮 绘制精灵 导入位图…… 右键菜单设置空间属性 双击窗口输入文字…………

但最重要的 是绘制出来的UI能够导出 不然实际意义都不大…………
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

5
发表于 2014-5-17 19:58:27 | 只看该作者
其实可不可以考虑这样:
用eval实现所见所得
用反射来制造工具箱
通过少量控制来添加Property List
引入事件泵
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-19 21:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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