#============================================================================= # [RGSS2] エセフルスクリーン - v1.1.1 # --------------------------------------------------------------------------- # Copyright (c) 2021 CACAO # Released under the MIT License. see https://opensource.org/licenses/MIT # --------------------------------------------------------------------------- # [Twitter] https://twitter.com/cacao_soft/ # [GitHub] https://github.com/cacao-soft/ #============================================================================= =begin -- 概 要 ---------------------------------------------------------------- ウィンドウのサイズを変更する機能を追加します。 -- 注意事項 ---------------------------------------------------------------- ※ 設定によっては、「初期化ファイルの操作」スクリプトが必要です。 -- 使用方法 ---------------------------------------------------------------- ★ WLIB::SetGameWindowSize(width, height) ウィンドウを中央に移動し、指定されたサイズに変更します。 引数が負数、もしくはデスクトップより大きい場合はフルサイズで表示されます。 処理が失敗すると false を返します。 =end #============================================================================== # ◆ ユーザー設定 #============================================================================== module WND_SIZE #-------------------------------------------------------------------------- # ◇ サイズ変更キー #-------------------------------------------------------------------------- # 0 .. サイズ変更を行わない #-------------------------------------------------------------------------- INPUT_KEY = Input::F5 #-------------------------------------------------------------------------- # ◇ サイズリスト #-------------------------------------------------------------------------- # [ [横幅, 縦幅], ... ] のような二次元配列で設定します。 # 幅を 0 にするとゲーム解像度サイズになります。 # 幅を -1 にするとデスクトップサイズになります。 #-------------------------------------------------------------------------- SIZE_LIST = [[0, 0], [Graphics.width * 2, Graphics.height * 2], [-1, -1]] #-------------------------------------------------------------------------- # ◇ セーブファイル #-------------------------------------------------------------------------- # ウィンドウサイズの状況を保存するファイル名を設定します。 # nil にすると、サイズを保存しません。 #-------------------------------------------------------------------------- FILE_SAVE = "wndsz" #-------------------------------------------------------------------------- # ◇ 構成設定ファイル #-------------------------------------------------------------------------- # セクション名 [Window] キー WIDTH=横幅 HEIGHT=縦幅 を読み込みます。 # nil にすると、サイズを保存しません。 #-------------------------------------------------------------------------- FILE_INI = nil end #/////////////////////////////////////////////////////////////////////////////# # # # 下記のスクリプトを変更する必要はありません。 # # # #/////////////////////////////////////////////////////////////////////////////# module WLIB #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- # SystemMetrics SM_CYCAPTION = 0x04 # タイトルバーの高さ SM_CXDLGFRAME = 0x07 # 枠の幅 SM_CYDLGFRAME = 0x08 # 枠の高さ # SetWindowPos SWP_NOSIZE = 0x01 # サイズ変更なし SWP_NOMOVE = 0x02 # 位置変更なし SWP_NOZORDER = 0x04 # 並び変更なし #-------------------------------------------------------------------------- # ● Win32API #-------------------------------------------------------------------------- @@FindWindow = Win32API.new('user32', 'FindWindow', 'pp', 'l') @@GetDesktopWindow = Win32API.new('user32', 'GetDesktopWindow', 'v', 'l') @@SetWindowPos = Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i') @@GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i') @@GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i') @@GetWindowLong = Win32API.new('user32', 'GetWindowLong', 'li', 'l') @@GetSystemMetrics = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i') @@SystemParametersInfo = Win32API.new('user32', 'SystemParametersInfo', 'iipi', 'i') #-------------------------------------------------------------------------- # ● ウィンドウの情報 #-------------------------------------------------------------------------- GAME_TITLE = NKF.nkf("-sxm0", load_data("Data/System.rvdata").game_title) GAME_HANDLE = @@FindWindow.call("RGSS Player", GAME_TITLE) GAME_STYLE = @@GetWindowLong.call(GAME_HANDLE, -16) GAME_EXSTYLE = @@GetWindowLong.call(GAME_HANDLE, -20) HDSK = @@GetDesktopWindow.call module_function #-------------------------------------------------------------------------- # ● GetWindowRect #-------------------------------------------------------------------------- def GetWindowRect(hwnd) r = [0,0,0,0].pack('l4') if @@GetWindowRect.call(hwnd, r) != 0 result = Rect.new(*r.unpack('l4')) result.width -= result.x result.height -= result.y else result = nil end return result end #-------------------------------------------------------------------------- # ● GetClientRect #-------------------------------------------------------------------------- def GetClientRect(hwnd) r = [0,0,0,0].pack('l4') if @@GetClientRect.call(hwnd, r) != 0 result = Rect.new(*r.unpack('l4')) else result = nil end return result end #-------------------------------------------------------------------------- # ● GetSystemMetrics #-------------------------------------------------------------------------- def GetSystemMetrics(index) @@GetSystemMetrics.call(index) end #-------------------------------------------------------------------------- # ● SetWindowPos #-------------------------------------------------------------------------- def SetWindowPos(hwnd, x, y, width, height, z, flag) @@SetWindowPos.call(hwnd, z, x, y, width, height, flag) != 0 end #-------------------------------------------------------------------------- # ● ウィンドウのサイズを取得 #-------------------------------------------------------------------------- def GetGameWindowRect GetWindowRect(GAME_HANDLE) end #-------------------------------------------------------------------------- # ● ウィンドウのクライアントサイズを取得 #-------------------------------------------------------------------------- def GetGameClientRect GetClientRect(GAME_HANDLE) end #-------------------------------------------------------------------------- # ● デスクトップのサイズを取得 #-------------------------------------------------------------------------- def GetDesktopRect r = [0,0,0,0].pack('l4') if @@SystemParametersInfo.call(0x30, 0, r, 0) != 0 result = Rect.new(*r.unpack('l4')) result.width -= result.x result.height -= result.y else result = nil end return result end #-------------------------------------------------------------------------- # ● ウィンドウのフレームサイズを取得 #-------------------------------------------------------------------------- def GetFrameSize return [ GetSystemMetrics(SM_CYCAPTION), # タイトルバー GetSystemMetrics(SM_CXDLGFRAME), # 左右フレーム GetSystemMetrics(SM_CYDLGFRAME) # 上下フレーム ] end #-------------------------------------------------------------------------- # ● ウィンドウの位置を変更 #-------------------------------------------------------------------------- def MoveGameWindow(x, y) SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER) end #-------------------------------------------------------------------------- # ● ウィンドウの位置を中央へ #-------------------------------------------------------------------------- def MoveGameWindowCenter dr = GetDesktopRect() wr = GetGameWindowRect() x = (dr.width - wr.width) / 2 y = (dr.height - wr.height) / 2 SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER) end #-------------------------------------------------------------------------- # ● ウィンドウのサイズを変更 #-------------------------------------------------------------------------- def SetGameWindowSize(width, height) width = Graphics.width if width == 0 height = Graphics.height if height == 0 # 各領域の取得 dr = GetDesktopRect() # Rect デスクトップ wr = GetGameWindowRect() # Rect ウィンドウ cr = GetGameClientRect() # Rect クライアント return false unless dr && wr && cr # フレームサイズの取得 frame = GetFrameSize() ft = frame[0] + frame[2] # タイトルバーの縦幅 fl = frame[1] # 左フレームの横幅 fs = frame[1] * 2 # 左右フレームの横幅 fb = frame[2] # 下フレームの縦幅 if width < 0 || height < 0 || width >= dr.width || height >= dr.height w = dr.width + fs h = dr.height + ft + fb SetWindowPos(GAME_HANDLE, -fl, -ft, w, h, 0, SWP_NOZORDER) else w = width + fs h = height + ft + fb SetWindowPos(GAME_HANDLE, 0, 0, w, h, 0, SWP_NOMOVE|SWP_NOZORDER) MoveGameWindowCenter() end end end class Scene_Base #-------------------------------------------------------------------------- # ● クラス変数 #-------------------------------------------------------------------------- @@screen_mode = 0 # スクリーンモード (ユーザー設定のインデックス) #-------------------------------------------------------------------------- # ● ユーザー設定からスクリーンサイズを設定 #-------------------------------------------------------------------------- def self.screen_mode=(index) @@screen_mode = index % WND_SIZE::SIZE_LIST.size end #-------------------------------------------------------------------------- # ● スクリーンサイズのインデックスを取得 #-------------------------------------------------------------------------- def self.screen_mode @@screen_mode end #-------------------------------------------------------------------------- # ● フルスクリーン表示になっているか #-------------------------------------------------------------------------- def fullscreen? WLIB::GetSystemMetrics(0) == 640 && WLIB::GetSystemMetrics(1) == 480 end #-------------------------------------------------------------------------- # ● ウィンドウサイズを変更するか #-------------------------------------------------------------------------- def change_window_size? return false unless Input.trigger?(WND_SIZE::INPUT_KEY) return false if WLIB::GAME_HANDLE == 0 return false if fullscreen? return true end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- alias _cao_update_wndsize update def update _cao_update_wndsize if change_window_size? Scene_Base.screen_mode += 1 if WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[@@screen_mode]) if WND_SIZE::FILE_SAVE save_data(Scene_Base.screen_mode, WND_SIZE::FILE_SAVE) end else Sound.play_buzzer end end end end module WND_SIZE #-------------------------------------------------------------------------- # ● 大きいサイズを除去 #-------------------------------------------------------------------------- def self.remove_large_window dr = WLIB::GetDesktopRect() WND_SIZE::SIZE_LIST.reject! do |wsz| wsz.size != 2 || dr.width < wsz[0] || dr.height < wsz[1] end if WND_SIZE::SIZE_LIST.empty? WND_SIZE::SIZE_LIST << [Graphics.width, Graphics.height] end end #-------------------------------------------------------------------------- # ● 初期サイズの設定 #-------------------------------------------------------------------------- def self.init_window_size if WND_SIZE::FILE_SAVE && File.file?(WND_SIZE::FILE_SAVE) # 前回のサイズを復元 Scene_Base.screen_mode = load_data(WND_SIZE::FILE_SAVE) WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[Scene_Base.screen_mode]) elsif WND_SIZE::FILE_INI # 構成設定からサイズを読み込む (サイズを記録していない場合のみ) width = IniFile.read(WND_SIZE::FILE_INI, "Window", "WIDTH", "") height = IniFile.read(WND_SIZE::FILE_INI, "Window", "HEIGHT", "") if width != "" && height != "" WLIB::SetGameWindowSize(width.to_i, height.to_i) end end end end WND_SIZE.remove_large_window WND_SIZE.init_window_size