Project1

标题: 给我们的游戏加点料--图片窗体 [打印本页]

作者: shoed    时间: 2011-8-30 16:23
标题: 给我们的游戏加点料--图片窗体
本帖最后由 shoed 于 2011-8-30 22:25 编辑

我们见过的窗体一般是一个四四方方的,很有规矩的。
现在网游以及很多软件的窗口外观都不是规规矩矩的,让人感觉很有个性,
如果我们也能将RMXP中的窗口做成富有个性的外观,那不是一件很有趣的事吗,
其实这个窗体就是--图片窗体,可能大家还不太明白我说的是什么,那先上张图吧:

这是一款网游的登陆界面


这种窗体看上去多有趣啊,因此本人也仿造这个窗口,给我们的RMXP的窗口也加点料吧
这是我做好的效果图:

注意到上面的3个数字吗
你可以用鼠标试着点点,本人改变的是scene_title

主要的核心脚本:

  1. #--------------------------------------------------------------------------

  2. # ● 特效窗体
  3. # 制作者  小飞侠_shoed

  4. #---------------------------------------------------------------------------
  5. module Screen
  6.   #背景图,与窗口的大小相同
  7.   MASK_WIDTH = 459
  8.   MASK_HEIGHT = 329
  9.   
  10.   IMAGE_BITMAP = 0
  11.   LR_LOADFROMFILE = 0x0010
  12.   LR_CREATEDIBSECTION = 0x2000
  13.   VBBLACK = 0x0
  14.   VBWHITE = 0xffffff
  15.   RGN_AND = 1
  16.   RGN_OR = 2
  17.   RGN_XOR = 3
  18.   
  19.   GWL_STYLE      = (-16)             #窗口样式
  20.   GWL_WNDPROC    = (-4)
  21.   WS_POPUP       = 0x80000000   #弹出式窗口
  22.   WS_MAXIMIZEBOX = 0x00010000
  23.   WS_MINIMIZEBOX = 0x00020000
  24.   WS_CAPTION     = 0x00C00000
  25.   WS_BORDER      = 0x00800000
  26.   WS_DLGFRAME    = 0x00400000
  27.   
  28.   WM_SYSCOMMAND = 0x0112
  29.   SC_MINIMIZE = 0xF020
  30.   WM_CLOSE = 0x0010
  31.   
  32.   @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  33.   @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l'
  34.   @getWindowRect=Win32API.new 'user32', 'GetWindowRect', %w(l p), 'l'
  35.   @loadImage=Win32API.new 'user32', 'LoadImageA', %w(l p l l l l), 'l'
  36.   
  37.   
  38.   @createCompatibleDC=Win32API.new 'gdi32', 'CreateCompatibleDC', %w(l), 'l'
  39.   
  40.   #@createCompatibleBitmap=Win32API.new 'gdi32', 'CreateCompatibleBitmap', %w(l l l), 'l'
  41.   #@stretchBlt=Win32API.new 'gdi32', 'StretchBlt', %w(l l l l l l l l l l l), 'l'

  42.   @selectObject=Win32API.new 'gdi32', 'SelectObject', %w(l l), 'l'
  43.   @getPixel=Win32API.new 'gdi32', 'GetPixel', %w(l l l), 'l'
  44.   
  45.   @createRectRgn=Win32API.new 'gdi32', 'CreateRectRgn', %w(l l l l), 'l'
  46.   @setWindowRgn=Win32API.new 'user32', 'SetWindowRgn', %w(l l i), 'l'
  47.   @combineRgn=Win32API.new 'gdi32', 'CombineRgn', %w(l l l l), 'l'
  48.   
  49.   @deleteDC=Win32API.new 'gdi32', 'DeleteDC', %w(l), 'l'
  50.   @deleteObject=Win32API.new 'gdi32', 'DeleteObject', %w(l), 'l'

  51.   @getWindowLong=Win32API.new 'user32', 'GetWindowLongA', %w(l l), 'l'
  52.   @setWindowLong=Win32API.new 'user32', 'SetWindowLongA', %w(l l l), 'l'
  53.   @moveWindow=Win32API.new 'user32', 'MoveWindow', %w(l l l l l l), 'l'

  54.   #@defWindowProc=Win32API.new 'user32', 'DefWindowProcA', %w(l l l l), 'l'
  55.   #@callWindowProc=Win32API.new 'user32', 'CallWindowProcA', %w(l l l l l), 'l'
  56.   
  57.   @getCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  58.   @screenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  59.   @getKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  60.   
  61.   @sendMessage = Win32API.new("user32", "SendMessageA", 'l l l l', 'l')
  62.   
  63.   module_function
  64.   
  65.   def shape_window
  66.     @hwnd=handel
  67.    
  68.     #原始窗口
  69.     rect=" "*16
  70.     @getWindowRect.call(@hwnd,rect)
  71.     left,top,right,bottom=rect.unpack("llll")
  72.     @x=left
  73.     @y=top
  74.     @width=right-left
  75.     @height=bottom-top
  76.    
  77.    
  78.     lStyle = @getWindowLong.call(@hwnd, GWL_STYLE)
  79.     lStyle = lStyle & ~WS_CAPTION
  80.    
  81.     #@setWindowLong.call(@hwnd, GWL_WNDPROC, WindowProc)
  82.     @setWindowLong.call(@hwnd, GWL_STYLE, lStyle)
  83.    
  84.    
  85.     @moveWindow.call(@hwnd, @x,@y,MASK_WIDTH,MASK_HEIGHT,1);
  86.    
  87.    
  88.     hBitmap = @loadImage.call(0, ".\\Graphics\\Pictures\\window.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
  89.     backDC = @createCompatibleDC.call(0)
  90.     @selectObject.call(backDC, hBitmap)
  91.    
  92.     hRgn  = @createRectRgn.call(0, 0, MASK_WIDTH, MASK_HEIGHT)
  93.    
  94.     for j in 0...MASK_HEIGHT
  95.       for i in 0...MASK_WIDTH
  96.         #主要是加快程序的速度,图片不是白色的大概区域
  97.         if j>=80 and j<=300 and i>=15 and i<=400
  98.           next
  99.         end
  100.         tcolor = @getPixel.call(backDC, i, j)
  101.         if tcolor==VBWHITE then
  102.           hTempRgn = @createRectRgn.call(i, j, i + 1, j + 1)
  103.           @combineRgn.call(hRgn,hRgn,hTempRgn,RGN_XOR)
  104.           @deleteObject.call(hTempRgn)
  105.         end
  106.       end
  107.     end
  108.    
  109.     @setWindowRgn.call(@hwnd, hRgn, 1)
  110.    
  111.     @deleteObject.call(hBitmap)
  112.     @deleteDC.call(backDC)
  113.     #@deleteObject.call(hRgn)
  114.    
  115.   end

  116.   def recovery_window
  117.     lStyle = @getWindowLong.call(@hwnd, GWL_STYLE)
  118.     lStyle = lStyle | WS_CAPTION
  119.     @setWindowLong.call(@hwnd, GWL_STYLE, lStyle)
  120.     @moveWindow.call(@hwnd, @x,@y,@width,@height,1);
  121.   end

  122.   def get_mouse_pos
  123.    point_var = [0, 0].pack('ll')
  124.    if @getCursorPos.call(point_var) != 0
  125.      if @screenToClient.call(@hwnd, point_var) != 0
  126.        x, y = point_var.unpack('ll')
  127.        if (x < 0) or (x > 10000) then x = 0 end
  128.        if (y < 0) or (y > 10000) then y = 0 end
  129.        if x > 640 then x = 640 end
  130.        if y > 480 then y = 480 end
  131.        return x, y
  132.      else
  133.        return 0, 0
  134.      end
  135.    else
  136.      return 0, 0
  137.    end
  138. end

  139.   def mouse_press?
  140.     left_down = @getKeyState.call(0x01)
  141.     return left_down[7]
  142.   end
  143.   
  144.   def min_window
  145.     @sendMessage.call(@hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0)
  146.   end
  147.   
  148.   def close_window
  149.     @sendMessage.call(@hwnd,WM_CLOSE,0,0)
  150.   end
  151.   
  152.    # find the game window...
  153.   def handel
  154.     game_name = "\0" * 256
  155.     @readini.call('Game','Title','',game_name,255,".\\Game.ini")
  156.     game_name.delete!("\0")
  157.     return @findwindow.call('RGSS Player',game_name)
  158.   end
  159.   
  160.   #def WindowProc
  161.   #
  162.   #end

  163. end

复制代码


我的图片都存在pictures中

工程:
特效窗体外观.rar (545.85 KB, 下载次数: 1129)

作者: orzfly    时间: 2011-8-30 17:00
why not use Transparent Key of Layered Windows?
作者: 忧雪の伤    时间: 2011-8-30 17:07
本帖最后由 忧雪の伤 于 2011-8-30 17:07 编辑

Dll 请用常量。
作者: 李梦遥    时间: 2011-8-30 17:40
最坑爹的东西……
作者: plummy    时间: 2011-8-30 17:58
感觉不咋地
作者: 失·忆    时间: 2011-8-30 18:09
比较适合华丽的那种游戏吧…
作者: 天使喝可乐    时间: 2011-8-30 18:12
我被震惊了= = 好猎奇的东西
作者: 耶和华    时间: 2011-8-30 19:11
LZ你不会去游戏skin文件夹里拿么 = =
这图不论抠的怎么样,大小不合适。
作者: 素材发布    时间: 2011-8-30 21:22
誒 只有XP沒VX 可惜啊
作者: px.凤翔九天    时间: 2011-8-30 22:25
恩?貌似有点意思的东西啊~路过收藏~
作者: yangff    时间: 2011-8-30 22:43
LZ因该弄成DIRECTUI会比较好= =
作者: 轩辕叶    时间: 2011-8-30 23:27
感觉是很好玩,但是不太实用……
而且那个改的和原来的有区别么……
作者: rainfly    时间: 2011-8-30 23:53
厉害啊,收藏了
作者: arnie510    时间: 2011-8-31 00:58
謝謝你的作品! 我收下研究了 :loveliness:
作者: 各种压力的猫君    时间: 2011-8-31 01:07
这玩意可以动态更改?!
作者: gghg1989    时间: 2011-8-31 06:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 藏书妹    时间: 2011-8-31 11:37
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1