Project1

标题: 关于窗口大小问题 [打印本页]

作者: auttbutt    时间: 2014-9-18 13:34
标题: 关于窗口大小问题
我想要加大窗口的大小(不改变分辨率的情况下可能吗?),
顺便想问一下,使用分辨率修改补丁变大之后,是不是素材的分辨率也会变大?如何加强素材的清晰度呢?
作者: tseyik    时间: 2014-9-18 15:03
按F5改画面
也可在事件脚本用
WLIB::SetGameWindowSize(width, height)調用
  1. #******************************************************************************
  2. #
  3. #    * エセフルスクリーン
  4. #
  5. #  --------------------------------------------------------------------------
  6. #    バージョン :  1.0.1
  7. #    対      応 :  RPGツクールVX : RGSS2
  8. #    制  作  者 :  CACAO
  9. #    配  布  元 :  http://cacaosoft.web.fc2.com/
  10. #  --------------------------------------------------------------------------
  11. #   == 概    要 ==
  12. #
  13. #   : ウィンドウのサイズを変更する機能を追加します。
  14. #
  15. #  --------------------------------------------------------------------------
  16. #   == 使用方法 ==
  17. #
  18. #    ★ WLIB::SetGameWindowSize(width, height)
  19. #     ウィンドウを中央に移動し、指定されたサイズに変更します。
  20. #     引数が負数、もしくはデスクトップより大きい場合はフルサイズで表示されます。
  21. #     処理が失敗すると false を返します。
  22. #
  23. #
  24. #******************************************************************************


  25. #==============================================================================
  26. # ◆ ユーザー設定
  27. #==============================================================================
  28. module WND_SIZE
  29.   #--------------------------------------------------------------------------
  30.   # ◇ サイズ変更キー
  31.   #--------------------------------------------------------------------------
  32.   #     nil .. サイズ変更を行わない
  33.   #--------------------------------------------------------------------------
  34.   INPUT_KEY = :F5
  35.   #--------------------------------------------------------------------------
  36.   # ◇ サイズリスト
  37.   #--------------------------------------------------------------------------
  38.   #     [ [横幅, 縦幅], ... ] のような二次元配列で設定します。
  39.   #     幅を 0 にするとデスクトップサイズになります。
  40.   #--------------------------------------------------------------------------
  41.   SIZE_LIST = [ [544,416], [640,480], [800,600], [1088,832], [0,0] ]
  42.   #--------------------------------------------------------------------------
  43.   # ◇ セーブファイル
  44.   #--------------------------------------------------------------------------
  45.   #   ウィンドウサイズの状況を保存するファイル名を設定します。
  46.   #   nil にすると、サイズを保存しません。
  47.   #--------------------------------------------------------------------------
  48.   FILE_SAVE = "System/test"
  49. end


  50. #/////////////////////////////////////////////////////////////////////////////#
  51. #                                                                             #
  52. #                下記のスクリプトを変更する必要はありません。                 #
  53. #                                                                             #
  54. #/////////////////////////////////////////////////////////////////////////////#


  55. module WLIB
  56.   #--------------------------------------------------------------------------
  57.   # ● 定数
  58.   #--------------------------------------------------------------------------
  59.   # SystemMetrics
  60.   SM_CYCAPTION  = 0x04                    # タイトルバーの高さ
  61.   SM_CXDLGFRAME = 0x07                    # 枠の幅
  62.   SM_CYDLGFRAME = 0x08                    # 枠の高さ
  63.   # SetWindowPos
  64.   SWP_NOSIZE     = 0x01                   # サイズ変更なし
  65.   SWP_NOMOVE     = 0x02                   # 位置変更なし
  66.   SWP_NOZORDER   = 0x04                   # 並び変更なし
  67.   #--------------------------------------------------------------------------
  68.   # ● Win32API
  69.   #--------------------------------------------------------------------------
  70.   @@FindWindow =
  71.     Win32API.new('user32', 'FindWindow', 'pp', 'l')
  72.   @@GetDesktopWindow =
  73.     Win32API.new('user32', 'GetDesktopWindow', 'v', 'l')
  74.   @@SetWindowPos =
  75.     Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i')
  76.   @@GetClientRect =
  77.     Win32API.new('user32', 'GetClientRect', 'lp', 'i')
  78.   @@GetWindowRect =
  79.     Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
  80.   @@GetWindowLong =
  81.     Win32API.new('user32', 'GetWindowLong', 'li', 'l')
  82.   @@GetSystemMetrics =
  83.     Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')
  84.   @@SystemParametersInfo =
  85.     Win32API.new('user32', 'SystemParametersInfo', 'iipi', 'i')
  86.   #--------------------------------------------------------------------------
  87.   # ● ウィンドウの情報
  88.   #--------------------------------------------------------------------------
  89.   GAME_TITLE  = load_data("Data/System.rvdata2").game_title.encode('SHIFT_JIS')
  90.   GAME_HANDLE = @@FindWindow.call("RGSS Player", GAME_TITLE)
  91.   # GAME_HANDLE = Win32API.new('user32', 'GetForegroundWindow', 'v', 'l').call
  92.   GAME_STYLE   = @@GetWindowLong.call(GAME_HANDLE, -16)
  93.   GAME_EXSTYLE = @@GetWindowLong.call(GAME_HANDLE, -20)
  94.   HDSK = @@GetDesktopWindow.call

  95. module_function
  96.   #--------------------------------------------------------------------------
  97.   # ● GetWindowRect
  98.   #--------------------------------------------------------------------------
  99.   def GetWindowRect(hwnd)
  100.     r = [0,0,0,0].pack('l4')
  101.     if @@GetWindowRect.call(hwnd, r) != 0
  102.       result = Rect.new(*r.unpack('l4'))
  103.       result.width -= result.x
  104.       result.height -= result.y
  105.     else
  106.       result = nil
  107.     end
  108.     return result
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● GetClientRect
  112.   #--------------------------------------------------------------------------
  113.   def GetClientRect(hwnd)
  114.     r = [0,0,0,0].pack('l4')
  115.     if @@GetClientRect.call(hwnd, r) != 0
  116.       result = Rect.new(*r.unpack('l4'))
  117.     else
  118.       result = nil
  119.     end
  120.     return result
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● GetSystemMetrics
  124.   #--------------------------------------------------------------------------
  125.   def GetSystemMetrics(index)
  126.     @@GetSystemMetrics.call(index)
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● SetWindowPos
  130.   #--------------------------------------------------------------------------
  131.   def SetWindowPos(hwnd, x, y, width, height, z, flag)
  132.     @@SetWindowPos.call(hwnd, z, x, y, width, height, flag) != 0
  133.   end

  134.   #--------------------------------------------------------------------------
  135.   # ● ウィンドウのサイズを取得
  136.   #--------------------------------------------------------------------------
  137.   def GetGameWindowRect
  138.     GetWindowRect(GAME_HANDLE)
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● ウィンドウのクライアントサイズを取得
  142.   #--------------------------------------------------------------------------
  143.   def GetGameClientRect
  144.     GetClientRect(GAME_HANDLE)
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● デスクトップのサイズを取得
  148.   #--------------------------------------------------------------------------
  149.   def GetDesktopRect
  150.     r = [0,0,0,0].pack('l4')
  151.     if @@SystemParametersInfo.call(0x30, 0, r, 0) != 0
  152.       result = Rect.new(*r.unpack('l4'))
  153.       result.width -= result.x
  154.       result.height -= result.y
  155.     else
  156.       result = nil
  157.     end
  158.     return result
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ● ウィンドウのフレームサイズを取得
  162.   #--------------------------------------------------------------------------
  163.   def GetFrameSize
  164.     return [
  165.       GetSystemMetrics(SM_CYCAPTION),   # タイトルバー
  166.       GetSystemMetrics(SM_CXDLGFRAME),  # 左右フレーム
  167.       GetSystemMetrics(SM_CYDLGFRAME)   # 上下フレーム
  168.     ]
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● ウィンドウの位置を変更
  172.   #--------------------------------------------------------------------------
  173.   def MoveGameWindow(x, y)
  174.     SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER)
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● ウィンドウの位置を中央へ
  178.   #--------------------------------------------------------------------------
  179.   def MoveGameWindowCenter
  180.     dr = GetDesktopRect()
  181.     wr = GetGameWindowRect()
  182.     x = (dr.width - wr.width) / 2
  183.     y = (dr.height - wr.height) / 2
  184.     SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER)
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   # ● ウィンドウのサイズを変更
  188.   #--------------------------------------------------------------------------
  189.   def SetGameWindowSize(width, height)
  190.     # 各領域の取得
  191.     dr = GetDesktopRect()         # Rect デスクトップ
  192.     wr = GetGameWindowRect()      # Rect ウィンドウ
  193.     cr = GetGameClientRect()      # Rect クライアント
  194.     return false unless dr && wr && cr
  195.     # フレームサイズの取得
  196.     frame = GetFrameSize()
  197.     ft = frame[0] + frame[2]      # タイトルバーの縦幅
  198.     fl = frame[1]                 # 左フレームの横幅
  199.     fs = frame[1] * 2             # 左右フレームの横幅
  200.     fb = frame[2]                 # 下フレームの縦幅
  201.     if width <= 0 || height <= 0 || width >= dr.width || height >= dr.height
  202.       w = dr.width + fs
  203.       h = dr.height + ft + fb
  204.       SetWindowPos(GAME_HANDLE, -fl, -ft, w, h, 0, SWP_NOZORDER)
  205.     else
  206.       w = width + fs
  207.       h = height + ft + fb
  208.       SetWindowPos(GAME_HANDLE, 0, 0, w, h, 0, SWP_NOMOVE|SWP_NOZORDER)
  209.       MoveGameWindowCenter()
  210.     end
  211.   end
  212. end

  213. class Scene_Base
  214.   #--------------------------------------------------------------------------
  215.   # ●
  216.   #--------------------------------------------------------------------------
  217.   @@screen_mode = 0
  218.   #--------------------------------------------------------------------------
  219.   # ●
  220.   #--------------------------------------------------------------------------
  221.   def self.screen_mode=(index)
  222.     @@screen_mode = index % WND_SIZE::SIZE_LIST.size
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ●
  226.   #--------------------------------------------------------------------------
  227.   def self.screen_mode
  228.     @@screen_mode
  229.   end
  230.   #--------------------------------------------------------------------------
  231.   # ○ フレーム更新
  232.   #--------------------------------------------------------------------------
  233.   alias _cao_update_wndsize update
  234.   def update
  235.     _cao_update_wndsize
  236.     if Input.trigger?(WND_SIZE::INPUT_KEY) && WLIB::GAME_HANDLE != 0
  237.       Scene_Base.screen_mode += 1
  238.       if WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[@@screen_mode])
  239.         if WND_SIZE::FILE_SAVE
  240.           save_data(Scene_Base.screen_mode, WND_SIZE::FILE_SAVE)
  241.         end
  242.       else
  243.         Sound.play_buzzer
  244.       end
  245.     end
  246.   end
  247. end

  248. module WND_SIZE
  249.   #--------------------------------------------------------------------------
  250.   # ● 大きいサイズを除去
  251.   #--------------------------------------------------------------------------
  252.   def self.remove_large_window
  253.     dr = WLIB::GetDesktopRect()
  254.     WND_SIZE::SIZE_LIST.reject! do |wsz|
  255.       wsz.size != 2 || dr.width < wsz[0] || dr.height < wsz[1]
  256.     end
  257.     if WND_SIZE::SIZE_LIST.empty?
  258.       WND_SIZE::SIZE_LIST << [Graphics.width, Graphics.height]
  259.     end
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● 初期サイズの設定
  263.   #--------------------------------------------------------------------------
  264.   def self.init_window_size
  265.     if WND_SIZE::FILE_SAVE && File.file?(WND_SIZE::FILE_SAVE)
  266.       Scene_Base.screen_mode = load_data(WND_SIZE::FILE_SAVE)
  267.       WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[Scene_Base.screen_mode])
  268.     end
  269.   end
  270. end

  271. WND_SIZE.remove_large_window
  272. WND_SIZE.init_window_size
复制代码

作者: auttbutt    时间: 2014-9-18 16:39
tseyik 发表于 2014-9-18 15:03
按F5改画面
也可在事件脚本用
WLIB::SetGameWindowSize(width, height)調用

非常感谢~~~~~
作者: amida    时间: 2015-4-28 12:24
tseyik 发表于 2014-9-18 15:03
按F5改画面
也可在事件脚本用
WLIB::SetGameWindowSize(width, height)調用

代码95行 GAME_TITLE  = load_data("Data/System.rvdata2").game_title.encode('SHIFT_JIS')
最后的'SHIFT_JIS'是日文编码,会导致【数据库】-【系统】-【游戏标题】无法使用简体字。
换成'UTF-8'或'GB_2312'后又无法改变窗口大小……
求解答……
作者: tseyik    时间: 2015-4-28 13:25
amida 发表于 2015-4-28 12:24
代码95行 GAME_TITLE  = load_data("Data/System.rvdata2").game_title.encode('SHIFT_JIS')
最后的'SHIF ...

('SHIFT_JIS')改成('UTF-8')
97行取消#
即可

作者: 星月★Starmoon    时间: 2015-8-21 15:42
很實用的腳本~
但是為什麼我沒辦法改變窗口大小QwQ
明明照樣把('SHIFT_JIS')改成('UTF-8'),97行刪掉了
作者: sexypunk    时间: 2018-10-11 18:39
guan mo xue xi ,ke yi yuo chu kuan yin mu de xiao guo




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