/* --------------------------------------------------------- file --------------------------------------------------------- */ // 開発環境 : HSP3.6 #packopt name "InternetExplosion" #packopt hide 1 #packopt icon "ie_icon.ico" #packopt version "version_ie.txt" #pack "hidari.png" #pack "migi.png" #pack "settings.png" #pack "settings2.png" #pack "reload.png" #pack "reload2.png" #pack "bomb01.png" #pack "se_bom.wav" #define _APP_TITLE_ "Internet Explosion" #define _VERSION_NUM_ (1.3) #define _VERSION_STR_ "1.3" /* --------------------------------------------------------- debug only --------------------------------------------------------- */ #ifdef _debug #undef dir_exe _dir_exe_ = dir_cur #define global dir_exe _dir_exe_@ #endif /* --------------------------------------------------------- include --------------------------------------------------------- */ // Windowsバージョン識別 #include "mod_GetWinVer.hsp" #include "mod_WebView2_10115038_InternetExplosion02.hsp" #include "user32.as" #include "kernel32.as" #include "gdi32.as" #include "mhook.as" ;#include "hspogg.as" #include "hgimg3_only_dmm.hsp" ; 環境によってはhspoggのdmm系命令でエラーが出たのでhgimg3に変更。dmm系命令のみを登録する。 #include "hspinet.as" #include "mod_HighDpi.hsp" #include "mod_PerMonitorDPI.hsp" #include "a2d_kai.hsp" #include "a2d+AlphaLayer.hsp" #include "mod_TimerRepeat.hsp" #include "MyFaviconMod.hsp" #include "MyModules.hsp" #include "mod_consexec.hsp" #include "mod_WebView2_FixedVersionRuntime_download.hsp" /* --------------------------------------------------------- WebView2 define --------------------------------------------------------- */ #define global WM_SETFONT 0x0030 #define global TCM_GETITEMCOUNT 0x1304 #define global TCM_GETITEMA 0x1305 #define global TCM_SETITEMA 0x1306 #define global TCM_INSERTITEMA 0x1307 #define global TCM_DELETEITEM 0x1308 #define global TCM_GETCURSEL 0x130b #define global TCM_SETCURSEL 0x130c #define global TCM_HITTEST 0x130d #define global TCM_SETITEMW 0x133d #define global TCM_INSERTITEMW 0x133e #define global WV2Env_CreateWV2Ctrl 3 #define global WV2Ctrl_put_IsVisible 4 #define global WV2Ctrl_put_Bounds 6 #define global WV2Ctrl_GetParent 21 #define global WV2Ctrl_Close 24 #define global WV2Ctrl_get_CoreWebView2 25 #define global WV2_get_Source 4 #define global WV2_Navigate 5 #define global WV2_add_NavigationCompleted 15 #define global WV2_del_NavigationCompleted 16 #define global WV2_ExecuteScript 29 #define global WV2_CapturePreview 30 #define global WV2_Reload 31 #define global WV2_get_CanGoBack 38 #define global WV2_get_CanGoForward 39 #define global WV2_get_GoBack 40 #define global WV2_get_GoForward 41 #define global WV2_add_NewWindowRequested 44 #define global WV2_del_NewWindowRequested 45 #define global WV2_add_DocumentTitleChanged 46 #define global WV2_del_DocumentTitleChanged 47 #define global WV2_get_DocumentTitle 48 #define global WV2_add_FullScrChanged 52 #define global WV2_del_FullScrChanged 53 #define global WV2_GetFullScreen 54 #define global WV2_OpenTaskManagerWindow 79 #define global WV2_PrintToPdf 80 #define global WV2_IsDownloadDialogOpen 90 #define global WV2_OpenDownloadDialog 91 #define global WV2_CloseDownloadDialog 92 #define global WV2NewWnd_get_Uri 3 #define global WV2NewWnd_put_NewWindow 4 #define global WV2NewWnd_put_Handled 6 #define global WV2NewWnd_GetDeferral 9 #define global WV2Deferral_Complete 3 /* --------------------------------------------------------- 割り込み内処理回避用 自身PostMessageID --------------------------------------------------------- */ #enum MP_Bomb = 1 #enum MP_TabDelMclick #enum MP_TabMoveStartCheck #enum MP_TabMoveFollowing #enum MP_TabMoveEnd #enum MP_NewTab #enum MP_Menu #enum MP_TabMenu #enum MP_Navigate #enum MP_Search // 自身PostMessage関数(0x0111=WM_COMMAND) #define MyPost(%1,%2=0) PostMessage hWnd0, 0x0111, %1, %2 /* --------------------------------------------------------- Window ID --------------------------------------------------------- */ #enum WID_Main = 0 #enum WID_Blank #enum WID_hFontTab // Artlet2Dの仮想イメージID #enum IID_Temp = 0 #enum IID_LoadBombBuf = 1 #enum IID_Bomb1LayerTo3 #enum IID_Bomb1LayerTo3__2 #enum IID_Bomb1LayerTo3__3 #enum IID_BackButton #enum IID_BackButton_white #enum IID_ForwardButton #enum IID_ForwardButton_white #enum IID_SettingsButton #enum IID_SettingsButton_blue #enum IID_NewtabButton #enum IID_NewtabButton_black #enum IID_ReloadButton #enum IID_ReloadButton_blue #enum IID_LevelMeter #enum IID_TabBarTranslucentCover // 動作の軽量化とロード不安定解消のため大量に作ってしまう #enum IID_BombImageStartTo16_1 #enum IID_BombImageStartTo16_2 = IID_BombImageStartTo16_1 + 16 #enum IID_BombImageStartTo16_3 = IID_BombImageStartTo16_2 + 16 #enum IID_BombImageStartTo16_0 = IID_BombImageStartTo16_3 + 16 /* --------------------------------------------------------- ポップアップメニューID --------------------------------------------------------- */ #enum ITEM_Print = 1 #enum ITEM_WebCapture #enum ITEM_WebSelect #enum ITEM_DownLoad #enum ITEM_OpenEdge #enum ITEM_DevTool #enum ITEM_VerInfo #enum ITAB_NewTabRight #enum ITAB_Reload #enum ITAB_Duplicate #enum ITAB_Close #enum ITAB_CloseOther #enum ITAB_CloseLeft #enum ITAB_CloseRight /* --------------------------------------------------------- ホットキーID(RegisterHotKeyだしアトムも使わないしの横着) --------------------------------------------------------- */ #enum MYHOTKEY_NewWindow = 1 #enum MYHOTKEY_NewTab #enum MYHOTKEY_NextTab1 #enum MYHOTKEY_NextTab2 #enum MYHOTKEY_PreviousTab1 #enum MYHOTKEY_PreviousTab2 #enum MYHOTKEY_OpenTab1 #enum MYHOTKEY_OpenTab2 #enum MYHOTKEY_OpenTab3 #enum MYHOTKEY_OpenTab4 #enum MYHOTKEY_OpenTab5 #enum MYHOTKEY_OpenTab6 #enum MYHOTKEY_OpenTab7 #enum MYHOTKEY_OpenTab8 #enum MYHOTKEY_OpenLastTab #enum MYHOTKEY_OpenHomepage #enum MYHOTKEY_GoBack #enum MYHOTKEY_GoForward #enum MYHOTKEY_CloseTab1 #enum MYHOTKEY_CloseTab2 #enum MYHOTKEY_CloseApp #enum MYHOTKEY_MoveTabLeft #enum MYHOTKEY_MoveTabRight #enum MYHOTKEY_MAX_ID #const global MOD_ALT 0x0001 #const global MOD_CONTROL 0x0002 #const global MOD_SHIFT 0x0004 #const global MOD_NOREPEAT 0x4000 /* --------------------------------------------------------- 高DPI化 --------------------------------------------------------- */ if _Windows_10_v1607over_ { // 高DPI対応 ; Windows10_v1607以上(高機能) DpiHighSetWindow }else : if _Windows_8_1over_ { // 高DPI対応 ; Windows8.1以上(下位互換) PerMonitorDpiAwareness } GetPerMonitorDPI _Windows_8_1over_ ; モニタ毎のDPIやサイズなどを取得(モジュール内記憶)。PerMonitorDpiAwarenessで高DPI対応したときのスケーリングにも必要。 // スケーリング関数(どちらの高DPI化対応でもOKなように) #module #defcfunc dpi_ int p if _Windows_10_v1607over_ :return int(DPI(p)) ; DpiHighSetWindow return PMDpi(p) ; PerMonitorDpiAwareness #global logmes "PMDpi="+PMDpi(640) ; Windows8.1からの対応用 logmes "DPI="+DPI(640) ; Windows10 Ver1607からの対応用 logmes "dpi_="+dpi_(640) ; 良い方を使う /* --------------------------------------------------------- 定数データ - SearchEngineデータ読み込み --------------------------------------------------------- */ exist "engine.txt" if strsize != -1 { notesel data noteload "engine.txt" repeat notemax noteget temp,cnt split temp, "|", searchEngineUrl(cnt),searchEngineQuery(cnt),searchEngineName(cnt) loop noteunsel }else { searchEngineUrl(0) = "https://www.bing.com" searchEngineQuery(0) = "https://www.bing.com/search?q=" searchEngineName(0) = "Bing" } /* --------------------------------------------------------- 定数データ - Bombレベル定数 と 取得関数 --------------------------------------------------------- */ numsRequiredLevelUp = 10, 20, 30, 40, 50, 70,90,110,130,150,200,250,300,350,400,500,600,700,1000 bomPowerUp = 1.5,1.2,1.05 bomVolumeUp = -2500,-2000,-1750,-1500,-1000,-500,-250,-125,-100,-90,-80,-70,-60,-50,-40,-30,-20,-10,0 #module // 爆発レベル #defcfunc GetMyBombLevel int c level = 0 : numRequire = 0 foreach numsRequiredLevelUp@ numRequire += numsRequiredLevelUp@(cnt) if c < numRequire : level = cnt+1 : break loop if level != 0 : return level return length.numsRequiredLevelUp@ + 1 + ( c - numRequire ) / numsRequiredLevelUp@(length.numsRequiredLevelUp@ - 1) // 次のレベルまでの進捗(0.0〜1.0) #defcfunc GetMyProgressNextLevel int c level = GetMyBombLevel(c) return 1.0 * ( c - GetStackNumRequiredPreviousLevel(level) ) / GetNumRequiredNextLevel(level) // 次のレベルに必要なBomb回数 #defcfunc GetNumRequiredNextLevel int lv level = lv if level <= length.numsRequiredLevelUp@ : return numsRequiredLevelUp@(level-1) return numsRequiredLevelUp@(length.numsRequiredLevelUp@ - 1) // 今のレベルになるのに必要だった回数(レベル1から通算) #defcfunc GetStackNumRequiredPreviousLevel int lv level = lv numRequire = 0 repeat limit(level-1,0,length.numsRequiredLevelUp@) numRequire += numsRequiredLevelUp@(cnt) loop if level <= length.numsRequiredLevelUp@ + 1 : return numRequire return numRequire + (level - (length.numsRequiredLevelUp@ +1)) * numsRequiredLevelUp@(length.numsRequiredLevelUp@ - 1) // 爆発力の倍率 #defcfunc GetBombBairitsu int lv bairitsu = 1.0 repeat lv - 1 bairitsu *= bomPowerUp@(limit(cnt,0,length.bomPowerUp@-1)) ; 配列数以上になったら最大定数で倍々していく loop if bairitsu > 5.0 : bairitsu = 5.0 ; 最大5倍まで return bairitsu #global /* --------------------------------------------------------- ユーザーデータ - iniLoad --------------------------------------------------------- */ DEF_URL = "" colorrefActiveWindow = 0 colorrefInactiveWindow = 0 userBombCountThisBrows = 0 userBombCountAtStart = 0 userSearchEngineUrl = "https://www.bing.com" userSearchEngineQuery = "https://www.bing.com/search?q=" userSearchEngineName = "Bing" userRuntimeFolder = "" #define ctype getUserBombCountAll (userBombCountThisBrows + userBombCountAtStart) // データロード #include "ini.hsp" gosub *iniLoad /* --------------------------------------------------------- WebView2ランタイム確認 --------------------------------------------------------- */ // ランタイムがWindowsにインストールされているか確認 GetAvailableCoreWebView2BrowserVersionString@mod_WebView2 0, lpws // ランタイムがインストールされている if lpws != 0 { CoTaskMemFree lpws } // iniでForceFixedVersionRuntimeが設定されていたら強制的にランタイムフォルダから起動する if userRuntimeFolder == "*" : lpws = 0 : userRuntimeFolder = "" if userRuntimeFolder != "" { // 設定されているランタイムフォルダの存在確認 dirlist folderList, userRuntimeFolder, 5 : if stat == 0 : lpws = 0 : userRuntimeFolder = "" } // ランタイムがインストールされていない & ランタイムフォルダも(まだ)存在を確認できていない if lpws == 0 { screen WID_Main, dpi_(640), dpi_(240), 2 : title ""+_APP_TITLE_ : font "メイリオ", dpi_(12) ; 処理進捗表示用ウィンドウ(WebView2_GetFixedVersionRuntime内でのmes) // ランタイムフォルダをチェックして返す。 カレントフォルダにランタイムフォルダが無ければWebView2_GetFixedVersionRuntimeの中でダウンロード&展開される。 //  ・2023年6月時点でランタイム書庫のURLが取れるようにしていますが、月日が経てばMicroSoftが書庫の置き場所やランタイム取得ページの内容を変更するかもしれません。 //   もし上手くダウンロード出来なくなっていたら関数の処理を見直してください。 userRuntimeFolder = WebView2_GetFixedVersionRuntime(1) ; オプション = 1 : 処理の進捗をウィンドウに描画 if userRuntimeFolder == "no" { end } ; ダウンロード拒否 if userRuntimeFolder == "" { stop } ; 失敗 } /* --------------------------------------------------------- favicon用イメージリスト初期化(デフォルト設定) --------------------------------------------------------- */ init_FaviconList dpi_.16, dpi_.16 addFile_FaviconList dir_exe+"\\favicons\\default.ico" sdim faviconDownloader, 256, 0 faviconDownloader_index = 1 /* --------------------------------------------------------- タブ用フォントハンドル簡易取得 --------------------------------------------------------- */ screen WID_hFontTab, 1, 1, 2 font "メイリオ", dpi_(14) : mref bmscr, 67 : hFont2 = bmscr(38) /* --------------------------------------------------------- Main Window --------------------------------------------------------- */ WebView2_InitWnd WID_Main, dpi_(100), dpi_(85), ginfo_dispx - dpi_(200), ginfo_dispy - dpi_(200) hWnd0 = hwnd : title ""+_APP_TITLE_ font "メイリオ", dpi_(12) : mref bmscr, 67 : hFont = bmscr(38) dim wndInfo, 7 // 初回起動時 - タイトルバーのアクティブ色と非アクティブ色を取得 if colorrefActiveWindow == 0 || colorrefInactiveWindow == 0 { wait 50 pt = ginfo_sx/2 , -2 ClientToScreen hWnd0, varptr.pt hdcDesktop = CreateDC("DISPLAY",0,0,0) colorrefActiveWindow = GetPixel(hdcDesktop,pt(0),pt(1)) ; アクティブ色 取得 DeleteDC hdcDesktop if colorrefActiveWindow = 16777215 : colorrefActiveWindow = $E0E0E0 color colorrefActiveWindow&0xFF,(colorrefActiveWindow>>8)&0xFF,(colorrefActiveWindow>>16)&0xFF boxf bgscr WID_Blank,1,1 ; 新たにウィンドウを作って、メインウィンドウを非アクティブにする wait 50 gsel WID_Blank pt = ginfo_sx/2 , -2 ClientToScreen hWnd0, varptr.pt hdcDesktop = CreateDC("DISPLAY",0,0,0) colorrefInactiveWindow = GetPixel(hdcDesktop,pt(0),pt(1)) ; 非アクティブ色 取得 DeleteDC hdcDesktop gsel WID_Blank,-1 gsel 0,1 gosub *iniSave }else { color colorrefActiveWindow&0xFF,(colorrefActiveWindow>>8)&0xFF,(colorrefActiveWindow>>16)&0xFF boxf } // ブラウザのポップアップメニュー作成 CreatePopupMenu hPopMenu = stat AppendMenu hPopMenu, 0, ITEM_Print, "印刷(&P)\tCtrl+P" AppendMenu hPopMenu, 0, ITEM_WebCapture, "Web キャプチャ(&C)\tCtrl+Shift+S" AppendMenu hPopMenu, 0, ITEM_WebSelect, "Web 選択(&S)\tCtrl+Shift+X" AppendMenu hPopMenu, $800, 0, "" AppendMenu hPopMenu, 0, ITEM_OpenEdge, "Microsoft Edgeで開く(&E)" AppendMenu hPopMenu, $800, 0, "" AppendMenu hPopMenu, 0, ITEM_DownLoad, "ダウンロードの表示(&N)" AppendMenu hPopMenu, 0, ITEM_DevTool, "F12開発者ツール(&L)" AppendMenu hPopMenu, $800, 0, "" AppendMenu hPopMenu, 0, ITEM_VerInfo, "バージョン情報(&A)" // タブのポップアップメニュー作成 CreatePopupMenu hPopTabMenu = stat AppendMenu hPopTabMenu, 0, ITAB_NewTabRight, "右側に新しいタブを開く" AppendMenu hPopTabMenu, $800, 0, "" AppendMenu hPopTabMenu, 0, ITAB_Reload, "再読み込み\tCtrl+R" AppendMenu hPopTabMenu, 0, ITAB_Duplicate, "タブを複製" AppendMenu hPopTabMenu, $800, 0, "" AppendMenu hPopTabMenu, 0, ITAB_Close, "閉じる\tCtrl+W" AppendMenu hPopTabMenu, 0, ITAB_CloseOther, "他のタブをすべて閉じる" AppendMenu hPopTabMenu, 0, ITAB_CloseLeft, "左側のタブを閉じる" AppendMenu hPopTabMenu, 0, ITAB_CloseRight, "右側のタブを閉じる" // URL Edit CreateWindowExA 0, "edit", 0, 0x56000080, 0, 0, 0, 0, hWnd0, 0, hinstance, 0 hEditUrl = stat : sendmsg hEditUrl, WM_SETFONT, hFont, 1 bufTmp = DEF_URL : if bufTmp == "" : bufTmp = userSearchEngineUrl SetWindowTextA hEditUrl, varptr(bufTmp) cbl = *EditUrlKeyProc ; サブクラス化してコールバックを挟む newclbk3 clbkptr, 4, cbl defEditUrlProc = GetWindowLong(hEditUrl,-4) SetWindowLong hEditUrl,-4/*GWL_WNDPROC*/,clbkptr dim rc, 4 : dim tci, 7 : bAdd = 0 : bDel = 0 // 検索用のEditを追加 CreateWindowExA 0, "edit", 0, 0x56000080, 0, 0, 0, 0, hWnd0, 0, hinstance, 0 hEditSearch = stat : sendmsg hEditSearch, WM_SETFONT, hFont, 1 sdim bufTmpUni,256 : cnvstow bufTmpUni, userSearchEngineName sendmsg hEditSearch, 0x1501/*EM_SETCUEBANNER*/, 0, varptr(bufTmpUni) cbl = *EditSearchKeyProc ; サブクラス化してコールバックを挟む newclbk3 clbkptr, 4, cbl defEditSearchProc = GetWindowLong(hEditSearch,-4) SetWindowLong hEditSearch,-4/*GWL_WNDPROC*/,clbkptr sdim bufTmpUni,256 : cnvstow bufTmpUni, userSearchEngineName ; プレースホルダを登録 sendmsg hEditSearch, 0x1501/*EM_SETCUEBANNER*/, 0, varptr(bufTmpUni) // タブ移動中の掴みダミータブを作っておく CreateWindowExA 0, "SysTabControl32", 0, 0x56008468, 0, 0, 0, 0, hWnd0, 0, hinstance, 0 hTabDummy = stat : sendmsg hTabDummy, WM_SETFONT, hFont2, 1 p1 = 0 << 16 : p1 |= dpi_.160 : sendmsg hTabDummy, 0x1329/*TCM_SETITEMSIZE*/, 0, p1 sendmsg hTabDummy, 0x1303/*TCM_SETIMAGELIST*/, 0, gethImageList_FaviconList() tci(0) = 11 : tci(6) = 0 : tci(5) = 0 bufTmp = "Loading..." : tci(3) = varptr(bufTmp) sendmsg hTabDummy, TCM_INSERTITEMA, 0, varptr(tci) SetWindowLong hTabDummy, -20, GetWindowLong(hTabDummy, -20) | $80000/*WS_EX_LAYERED*/ | $20/*WS_EX_TRANSPARENT*/ ; マウスに追従させて表示するだけ(半透明+クリック無効) SetLayeredWindowAttributes hTabDummy, 0, 160, 2/*LWA_ALPHA */ // タブコントロール CreateWindowExA 0, "SysTabControl32", 0, 0x56008468, 0, 0, 0, 0, hWnd0, 0, hinstance, 0 hTab = stat : sendmsg hTab, WM_SETFONT, hFont2, 1 p1 = 0 << 16 : p1 |= dpi_.160 : sendmsg hTab, 0x1329/*TCM_SETITEMSIZE*/, 0, p1 : BrowserTabWidth = dpi_.160 sendmsg hTab, 0x1303/*TCM_SETIMAGELIST*/, 0, gethImageList_FaviconList() ;sendmsg hTab, (0x1300+53)/*TCM_GETEXTENDEDSTYLE */, 0, 0 ; (TabCtrl_GetExtendedStyleマクロから) ;logmes "TCM_GETEXTENDEDSTYLE="+stat ;sendmsg hTab, (0x1300+52)/*TCM_SETEXTENDEDSTYLE */, 1/*TCS_EX_FLATSEPARATORS*/, 0 ;sendmsg hTab, (0x1300+53)/*TCM_GETEXTENDEDSTYLE */, 0, 0 ;logmes "TCM_GETEXTENDEDSTYLE="+stat // WebView2作成 if userRuntimeFolder == "" { pEnv = WebView2_CreateEnv( "", "" ) ; ・クライアントコンピュータ上にランタイムがインストールされていて、そちらを使いたい場合は引数すべて省略してOK。 ; ・引数に同梱ランタイムのフォルダ(とユーザーデータフォルダ)を指定すると、まずはインストール版の起動を試みて、ダメだったら同梱版を起動します。 }else { pEnv = WebView2_CreateEnvOpt( userRuntimeFolder, "" ) ; ・最初から同梱版を使うのが決まっている場合は WebView2_CreateEnvOpt を使用してください。 } if ( pEnv == 0 ){ dialog "err WebView2_CreateEnv" : end } curCtrl = 0 : curView = 0 oncmd gosub *EVENT_TITLE, 0x9000 ; プログラマが独自に定めたウィンドウメッセージ。重複の無いよう注意(0x8000〜0xBFFF) oncmd gosub *EVENT_COMPLETE, 0x9001 oncmd gosub *EVENT_FULLSCR, 0x9002 oncmd gosub *EVENT_NEWWND, 0x9003 oncmd gosub *EVENT_NEWWND2, 0x9004 oncmd gosub *EVENT_PRINT, 0x9005 oncmd gosub *WM_SIZE, 0x0005 ;oncmd gosub *WM_CLOSE, 0x0010 oncmd gosub *WM_NOTIFY, 0x004E oncmd gosub *WM_COMMAND, 0x0111 gosub *TAB_ADD oncmd gosub *onHOTKEY, 0x0312 ; WM_HOTKEY(簡易的にRegisterHotKeyでキーボードショートカット。アクティブ、非アクティブでUnregistしたり切り替える) oncmd gosub *onACTIVE, 0x0006 ; WM_ACTIVATE oncmd gosub *onDISPLAYCHANGE, 0x2E0 ; WM_DISPLAYCHANGE (ディスプレイの解像度/色数が変化した時) oncmd gosub *onTimer, $00000113 ; WM_TIMER(ブラウザメニューを開くと爆発が止まるのでTimerで強制的に回す) onexit gosub *quit dmmini netinit : if stat : badInet = 1 // マウスフックをセット mhHook *onMouseHook // ホットキーをセット gosub *RegistHotkey /* --------------------------------------------------------- 戻るボタン登録 (a2d+AlphaLayerとmod_TimerRepeatを利用した子ウィンドウコントロール。以下同) --------------------------------------------------------- */ alCreateImageByFile IID_Temp, "hidari.png" alCreateImage IID_BackButton, dpi_.35, dpi_.28 alColor 255,255,255,1 alFillEllip dpi_.1,dpi_.1, dpi_(35-2),dpi_(35-2) alStretchImageToImage IID_Temp, IID_BackButton, 0,0,50,50, 0+dpi_.6,0+dpi_.10,alGetWidth()-dpi_.12,alGetHeight()-dpi_.12 alColor 20,20,20,200 : alPenWidth 1 alDrawEllip dpi_.1,dpi_.1, dpi_(35-2),dpi_(35-2) alalSetParent IID_BackButton,,0, dpi_.5,0, *CLBK_BackButton alCreateImage IID_BackButton_white, dpi_.35, dpi_.28 alColor 255,255,255,255 alFillEllip dpi_.1,dpi_.1, dpi_(35-2),dpi_(35-2) alalSetParent IID_BackButton_white,,0, dpi_.5,0 alalAlpha IID_BackButton_white,50 /* --------------------------------------------------------- 進むボタン登録 --------------------------------------------------------- */ alCreateImageByFile IID_Temp, "migi.png" alCreateImage IID_ForwardButton, dpi_.25, dpi_.25 alColor 255,255,255,1 alFillEllip dpi_.1,dpi_.1, dpi_(25-2),dpi_(25-2) alStretchImageToImage IID_Temp, IID_ForwardButton, 0,0,50,50, 0+dpi_.7,0+dpi_.7,alGetWidth()-dpi_.13,alGetHeight()-dpi_.13 alColor 20,20,20,200 : alPenWidth 1 alDrawEllip dpi_.1,dpi_.1, dpi_(25-2),dpi_(25-2) alalSetParent IID_ForwardButton,,0, dpi_.42,dpi_.5, *CLBK_ForwardButton alCreateImage IID_ForwardButton_white, dpi_.25, dpi_.25 alColor 255,255,255,255 alFillEllip dpi_.1,dpi_.1, dpi_(25-2),dpi_(25-2) alalSetParent IID_ForwardButton_white,,0, dpi_.42,dpi_.5 alalAlpha IID_ForwardButton_white,50 /* --------------------------------------------------------- 設定ボタン登録 --------------------------------------------------------- */ alCreateImageByFile IID_Temp, "settings.png" alCreateImage IID_SettingsButton, dpi_.35, dpi_.28 alColor 255,255,255,1 : alFillRect alStretchImageToImage IID_Temp, IID_SettingsButton, 0,0,70,70, 0+dpi_.6,0+dpi_.2,dpi_.25-dpi_.4,dpi_.25-dpi_.4 alalSetParent IID_SettingsButton,,0, rc(2)-dpi_.40,dpi_.2, *CLBK_SettingsButton GetClientRect hWnd0, varptr(rc) alCreateImageByFile IID_Temp, "settings2.png" alCreateImage IID_SettingsButton_blue, dpi_.35, dpi_.28 alStretchImageToImage IID_Temp, IID_SettingsButton_blue, 0,0,70,70, 0+dpi_.6,0+dpi_.2,dpi_.25-dpi_.4,dpi_.25-dpi_.4 alalSetParent IID_SettingsButton_blue,IID_SettingsButton,0, 0,0 alalAlpha IID_SettingsButton_blue,1 /* --------------------------------------------------------- タブコントロール半透明隠し(これがないとどのタブを選択しているのか分かりづらい) --------------------------------------------------------- */ rect = 0,0,0,0 GetClientRect hTab, varptr(rect) alCreateImage IID_TabBarTranslucentCover, ginfo_sx, rect(3) - rect(1) alColor colorrefActiveWindow&0xFF,(colorrefActiveWindow>>8)&0xFF,(colorrefActiveWindow>>16)&0xFF,125 alalSetParent IID_TabBarTranslucentCover,,0, 1,dpi_.30 alalWidth IID_TabBarTranslucentCover, 0 if 0 { // どのタブを強調表示する(半透明隠ししない)かを選択 (-1で全隠し) #deffunc SetSlitTabCover int _p1 alSelectImage IID_TabBarTranslucentCover alErase if isActive == 0 { alColor colorrefActiveWindow&0xFF,(colorrefActiveWindow>>8)&0xFF,(colorrefActiveWindow>>16)&0xFF,125 }else { alColor colorrefInactiveWindow&0xFF,(colorrefInactiveWindow>>8)&0xFF,(colorrefInactiveWindow>>16)&0xFF,125 } RECT = 0,0,0,0 if _p1 >= 0 : sendmsg hTab,0x130A/*TCM_GETITEMRECT*/, _p1, varptr(RECT) if _p1 == 0 : RECT(0)=0 sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 if _p1 == stat-1 : RECT(2)=alGetWidth() alFillRect 0,0,RECT(0),alGetHeight() : alFillRect RECT(2),0,alGetWidth(),alGetHeight() alalRedraw IID_TabBarTranslucentCover return } /* --------------------------------------------------------- +ボタン登録 --------------------------------------------------------- */ alCreateImage IID_NewtabButton, dpi_.25, dpi_.25 alColor 0,0,0,255 : alFont "メイリオ",dpi_.20 alDrawText "+",dpi_.1,dpi_.1,alGetWidth(),alGetHeight(),1,1 alColor 0,0,0,1 : alFillEllip rect = 0,0,0,0 GetClientRect hTab, varptr(rect) alalSetParent IID_NewtabButton,,0, rect(2) + dpi_.5,dpi_.29, *CLBK_Dummy alCreateImage IID_NewtabButton_black, dpi_.25, dpi_.25 alColor 0,0,0,255 : alFillEllip alalSetParent IID_NewtabButton_black,IID_NewtabButton,0, 0,0, *CLBK_NewtabButton alalAlpha IID_NewtabButton_black,1 /* --------------------------------------------------------- 更新ボタン登録 --------------------------------------------------------- */ alCreateImageByFile IID_Temp, "reload.png" alCreateImage IID_ReloadButton, dpi_.28, dpi_.24 alColor 255,255,255,1 : alFillRect alStretchImageToImage IID_Temp, IID_ReloadButton, 0,0,64,64, 0+dpi_.7,0+dpi_.5,dpi_.24-dpi_.10,dpi_.24-dpi_.10 kensakuBarWidth = rc(2) / 5 : if kensakuBaX < dpi_.175 : kensakuBaX = dpi_.175 alalSetParent IID_ReloadButton,,0, dpi_.75 + rc(2) - (dpi_(200)+kensakuBarWidth) - dpi_.28,dpi_.2, *CLBK_ReloadButton hwnds_AlphaLayerMod_IID_ReloadButton = stat LoadCursor 0, 32512 ; Editの上でもカーソルの形を通常の矢印にする SetClassLong hwnds_AlphaLayerMod_IID_ReloadButton, -12, stat alCreateImageByFile IID_Temp, "reload2.png" alCreateImage IID_ReloadButton_blue, dpi_.28, dpi_.24 alStretchImageToImage IID_Temp, IID_ReloadButton_blue, 0,0,64,64, 0+dpi_.7,0+dpi_.5,dpi_.24-dpi_.10,dpi_.24-dpi_.10 alalSetParent IID_ReloadButton_blue,IID_ReloadButton,0, 0,0 alalAlpha IID_ReloadButton_blue,1 /* --------------------------------------------------------- 爆発レベルメーター --------------------------------------------------------- */ alCreateImage IID_LevelMeter, dpi_.70, dpi_.35 alalSetParent IID_LevelMeter,,0, rc(2) - (dpi_(123)+kensakuBarWidth),0, *CLBK_Dummy hwnds_AlphaLayerMod_IID_LevelMeter = stat // ツールチップ通知の登録 winobj "tooltips_class32", "",0,$1/*TTS_ALWAYSTIP*/ hTooltips = objinfo (stat, 2) dim RECT, 4 GetClientRect hwnds_AlphaLayerMod_IID_LevelMeter, varptr (RECT) TOOLINFO = 40, $10/*TTF_SUBCLASS*/|$2/*TTF_CENTERTIP */|$1/*TTF_IDISHWND*/ , hWnd0, hwnds_AlphaLayerMod_IID_LevelMeter, 0, 0,rect.2,rect.3, 0,$FFFFFFFF/*LPSTR_TEXTCALLBACK*/ sendmsg hTooltips, $404/*TTM_ADDTOOL*/ ,0, varptr(toolinfo) ;RECT=dpi_.5,dpi_.5,dpi_.5,dpi_.5 ;SendMsg hTooltips,$00D3/*TTM_SETMARGIN*/,0,varptr(RECT) ; マージン SendMsg hTooltips,$0418/*TTM_SETMAXTIPWIDTH*/,0,640 ; tipwidth(これが付いてないと\nが効かない) //爆発エフェクト用 SE dmmload "se_bom.wav",0 dmmvol 0, -10000 : dmmplay 0,0 : dmmstop 0 ; 1回だけ無音で読み込んでおく dmmvol 0, -3000 : setedVolume = -3000 gosub *Redraw_BombLevelMeter if 0 { *Redraw_BombLevelMeter nowMyBombLevel = limit(GetMyBombLevel(getUserBombCountAll()),1,999) alSelectImage IID_LevelMeter alErase alFont "メイリオ", dpi_.20, 1 alColor 255,255,255,1 : alFillRect alColor 255,255,255,200 : alPenWidth dpi_.6 digPer = GetMyProgressNextLevel(getUserBombCountAll()) : if digPer == 0.0 : digPer = 1.0 alDrawArc dpi_.3+dpi_.18,dpi_.3, dpi_.35-dpi_(6),dpi_.35-dpi_(6), -90, int( 360.0 * digPer ) alColor 255,255,0,255 alDrawText ""+nowMyBombLevel, dpi_.1,dpi_.1,alGetWidth()+dpi_.1,alGetHeight()+dpi_.1,1,1 alColor 255,0,0,255 alDrawText ""+nowMyBombLevel, 0,0,alGetWidth(),alGetHeight(),1,1 alFont "メイリオ", dpi_.8,1 : alColor 0,0,0,255 alDrawText ""+getUserBombCountAll(), 0,alGetHeight()-dpi_.10,alGetWidth(),dpi_.10,1,1 alalRedraw IID_LevelMeter //ついでに音も setvol = bomVolumeUp( limit(nowMyBombLevel-1,0,length(bomVolumeUp)-1) ) if setedVolume != setvol { dmmvol 0, setvol } return } initedAlphaLayer = 1 ; アルファレイヤーのGUIを作り終わったよのフラグ。作る前にWM_SIZE呼ばれるため。 /* --------------------------------------------------------- Bomb登録 --------------------------------------------------------- */ // 爆発エフェクト用バッファ alCreateImageByFile IID_LoadBombBuf, "bomb01.png" OwariBombSize = int(dpi_(180.0*5.5)) dim flgLoadedBomb0,16 ReSetBomb GetMyBombLevel(getUserBombCountAll()) if 0 { #deffunc ReSetBomb int RequestLoadBombLevel ;logmes "loadedBombLevel ="+loadedBombLevel+" RequestLoadBombLevel ="+RequestLoadBombLevel if loadedBombLevel == RequestLoadBombLevel : return loadedBombLevel = RequestLoadBombLevel isBombReSetting = 1 bairitsu = GetBombBairitsu( loadedBombLevel ) Bomb1Size = int(dpi_(180.0*bairitsu)) ;logmes "Bomb1Size="+Bomb1Size+" bairitsu="+bairitsu timer_kill tid_bomb1 timer_kill tid_bomb2 timer_kill tid_bomb3 dim flgLoadedBomb1,16 dim flgLoadedBomb2,16 dim flgLoadedBomb3,16 //最初の1発目だけ景気よく行くため、ある程度読み込んでおく repeat 8 c = cnt*2 switch (userBombCountThisBrows\3) case 0 : SetBomb IID_BombImageStartTo16_1, c : flgLoadedBomb1(c)=1 : swbreak case 1 : SetBomb IID_BombImageStartTo16_2, c : flgLoadedBomb2(c)=1 : swbreak default: SetBomb IID_BombImageStartTo16_3, c : flgLoadedBomb3(c)=1 : swbreak swend loop isBombReSetting = 0 return // ボムのローディング(レベルアップごとに作り直す) #deffunc SetBomb int idSetBomb, int cntSetBomb alCreateImage idSetBomb+cntSetBomb, Bomb1Size,Bomb1Size alStretchImageToImage IID_LoadBombBuf, idSetBomb+cntSetBomb, cntSetBomb*192,0,192,192, 0,0,Bomb1Size,Bomb1Size gsel WID_Main alalSetParent idSetBomb+cntSetBomb,,1,ginfo_dispx,ginfo_dispy //owariBombもセットしとく if cntSetBomb == 0 : SetOwariBombOnce return // 終わりボムのローディング。指令ごとに1コマ分読み込む(なるべくなら終了時までに16コマ読み込んでおきたい。通常ボムローディング時にもついでに1コマ読み込んでいる) #deffunc SetOwariBombOnce indexSetBomb = -1 repeat 16 if flgLoadedBomb0(cnt) == 0 : indexSetBomb = cnt : break loop if indexSetBomb == -1 : return flgLoadedBomb0(indexSetBomb) = 1 alCreateImage IID_BombImageStartTo16_0+indexSetBomb, OwariBombSize,OwariBombSize alStretchImageToImage IID_LoadBombBuf, IID_BombImageStartTo16_0+indexSetBomb, indexSetBomb*192,0,192,192, 0,0,OwariBombSize,OwariBombSize gsel WID_Main alalSetParent IID_BombImageStartTo16_0+indexSetBomb,,1,ginfo_dispx,ginfo_dispy return } // 連発ラベル(連打できるようにするため1発ずつ表示するBombをずらす) labels_BOMB = *BOMB1, *BOMB2, *BOMB3 /* --------------------------------------------------------- Main Loop - stop --------------------------------------------------------- */ gsel WID_Main stop /* --------------------------------------------------------- 戻るボタン、進むボタンが使えるかの表示設定 --------------------------------------------------------- */ #deffunc SetEnableBackButton int _p isEnableBackButton = (_p!=0) if isEnableBackButton { alalAlpha IID_BackButton, 255 alalAlpha IID_BackButton_white, 50 }else { alalAlpha IID_BackButton, 100 alalAlpha IID_BackButton_white, 1 } return #deffunc SetEnableForwardButton int _p isEnableForwardButton = (_p!=0) if isEnableForwardButton { alalAlpha IID_ForwardButton, 255 alalAlpha IID_ForwardButton_white, 50 }else { alalAlpha IID_ForwardButton, 100 alalAlpha IID_ForwardButton_white, 1 } return /* --------------------------------------------------------- a2d+AlphaLayer アルファレイヤー子ウィンドウのコールバック(子ウィンドウ表面上をマウスが移動したりクリックしたりするのを捕まえる) --------------------------------------------------------- */ *CLBK_Dummy return *CLBK_BackButton if isEnableBackButton == 0 :return switch iparam case 0x0201 ;WM_LBUTTONDOWN gosub *CMD_BACK swbreak case 0x0200 ;WM_MOUSEMOVE timer_repeat 16, -1 if alalIsOnLayer(IID_BackButton) { if uniq(josyo) == -1 { uniq(josyo) = 0 timer_continue 0,1 } timer_ease uniq(a), 50,100, ease_quartic_out, 800 uniq(refd) = 0 }else { if uniq(josyo) == 0 { uniq(z) = uniq(a) uniq(josyo) = -1 timer_continue 0,1 } timer_ease uniq(a), uniq(z),50, ease_quartic_out, 800 uniq(refd) = refdval } alalAlpha IID_BackButton_white, uniq(a) if uniq(refd) >= 1.0 : timer_break timer_loop swbreak swend return *CLBK_ForwardButton if isEnableForwardButton == 0 :return switch iparam case 0x0201 ;WM_LBUTTONDOWN gosub *CMD_FORWARD swbreak case 0x0200 ;WM_MOUSEMOVE timer_repeat 16, -1 if alalIsOnLayer(IID_ForwardButton) { if uniq(josyo) == -1 { uniq(josyo) = 0 timer_continue 0,1 } timer_ease uniq(a), 50,100, ease_quartic_out, 800 uniq(refd) = 0 }else { if uniq(josyo) == 0 { uniq(z) = uniq(a) uniq(josyo) = -1 timer_continue 0,1 } timer_ease uniq(a), uniq(z),50, ease_quartic_out, 800 uniq(refd) = refdval } alalAlpha IID_ForwardButton_white, uniq(a) if uniq(refd) >= 1.0 : timer_break timer_loop swbreak swend return return *CLBK_SettingsButton switch iparam case 0x0201 ;WM_LBUTTONDOWN MyPost MP_Menu swbreak case 0x0200 ;WM_MOUSEMOVE timer_repeat 16, -1 if alalIsOnLayer(IID_SettingsButton) { if uniq(josyo) == -1 { uniq(josyo) = 0 timer_continue 0,1 } timer_ease uniq(a), 1,200, ease_quartic_out, 500 uniq(refd) = 0 }else { if uniq(josyo) == 0 { uniq(z) = uniq(a) uniq(josyo) = -1 timer_continue 0,1 } timer_ease uniq(a), uniq(z),1, ease_quartic_out, 500 uniq(refd) = refdval } alalAlpha IID_SettingsButton_blue, uniq(a) if uniq(refd) >= 1.0 : timer_break timer_loop swbreak swend return *CLBK_NewtabButton switch iparam case 0x0202 ;WM_LBUTTONUP MyPost MP_NewTab swbreak case 0x0200 ;WM_MOUSEMOVE timer_repeat 16, -1 if alalIsOnLayer(IID_NewtabButton_black) { if uniq(josyo) == -1 { uniq(josyo) = 0 timer_continue 0,1 } timer_ease uniq(a), 1,35, ease_quartic_out, 500 uniq(refd) = 0 }else { if uniq(josyo) == 0 { uniq(z) = uniq(a) uniq(josyo) = -1 timer_continue 0,1 } timer_ease uniq(a), uniq(z),1, ease_quartic_out, 500 uniq(refd) = refdval } alalAlpha IID_NewtabButton_black, uniq(a) if uniq(refd) >= 1.0 : timer_break timer_loop swbreak swend return *CLBK_ReloadButton switch iparam case 0x0202 ;WM_LBUTTONUP gosub *CMD_RELOAD swbreak case 0x0200 ;WM_MOUSEMOVE timer_repeat 16, -1 if alalIsOnLayer(IID_ReloadButton) { if uniq(josyo) == -1 { uniq(josyo) = 0 timer_continue 0,1 } timer_ease uniq(a), 1,255, ease_quartic_out, 500 uniq(refd) = 0 }else { if uniq(josyo) == 0 { uniq(z) = uniq(a) uniq(josyo) = -1 timer_continue 0,1 } timer_ease uniq(a), uniq(z),1, ease_quartic_out, 500 uniq(refd) = refdval } alalAlpha IID_ReloadButton_blue, uniq(a) if uniq(refd) >= 1.0 : timer_break timer_loop swbreak swend return /* --------------------------------------------------------- Bombアニメーション --------------------------------------------------------- */ // 爆発指令(3つあるボムを順番に使う) *BOMB // ウィンド内のクリックか確認 WindowFromPoint ginfo_mx, ginfo_my hWnd_ = stat repeat if hWnd_ == hWnd0 : break hWnd_ = GetParent( hWnd_ ) if hWnd_ == 0 : break loop if hWnd_ == 0 : return // Bomb! userBombCountThisBrows++ gosub *Redraw_BombLevelMeter ; ボムレベルメーター描画 // レベルアップしてたら新ボムをロード(Bombアニメの終わりにも余裕があれば確認している) if GetMyBombLevel(getUserBombCountAll()) != GetMyBombLevel(getUserBombCountAll()-1) { ReSetBomb GetMyBombLevel(getUserBombCountAll()) } gosub labels_BOMB((userBombCountThisBrows+3-1)\3) ; 3ボムを順番に return *BOMB1 timer_repeat 32, 16, 0, 2 ; p4=2 : timer_deinitを発生させて次のtimer_repeatをセット timer_init: dmmpan 0, int( (GetDPerMxOnMoni()-50)*(8+GetDPerMyOnMoni()/25) ) dmmplay 0,0 ; 爆発音 uniq(pt) = ginfo_mx, ginfo_my ScreenToClient hwnd, varptr(uniq(pt)) _init_end if isBombReSetting : timer_break if timer_cnt<0 || timer_cnt>15 : timer_continue ; TimerRepeatのバグかも... if flgLoadedBomb1(timer_cnt)==0 : SetBomb IID_BombImageStartTo16_1, timer_cnt : flgLoadedBomb1(timer_cnt)=1 ; Bombの読み込みをバラけさせる alalWidth IID_BombImageStartTo16_1+timer_cnt,,,uniq(pt)(0), uniq(pt)(1), 4 alalShow IID_BombImageStartTo16_1+timer_cnt if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 uniq(showFlame) = IID_BombImageStartTo16_1+timer_cnt + 1 //終了処理 timer_deinit: if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 : uniq(showFlame) = 0 if isBombReSetting == 0 { // 次のカウントでレベルアップなら新ボムをロード(既にReSet中でなければ) if GetMyBombLevel(getUserBombCountAll()) != GetMyBombLevel(getUserBombCountAll()+1) { ReSetBomb GetMyBombLevel(getUserBombCountAll()+1) } } timer_loop tid_bomb1 = stat return *BOMB2 timer_repeat 32, 16, 0, 2 ; p4=2 : timer_deinitを発生させて次のtimer_repeatをセット timer_init: dmmpan 0, int( (GetDPerMxOnMoni()-50)*(8+GetDPerMyOnMoni()/25) ) dmmplay 0,0 ; 爆発音 uniq(pt) = ginfo_mx, ginfo_my ScreenToClient hwnd, varptr(uniq(pt)) _init_end if isBombReSetting : timer_break if timer_cnt<0 || timer_cnt>15 : timer_continue ; TimerRepeatのバグかも... if flgLoadedBomb2(timer_cnt)==0 : SetBomb IID_BombImageStartTo16_2, timer_cnt : flgLoadedBomb2(timer_cnt)=1 ; Bombの読み込みをバラけさせる alalWidth IID_BombImageStartTo16_2+timer_cnt,,,uniq(pt)(0), uniq(pt)(1), 4 alalShow IID_BombImageStartTo16_2+timer_cnt if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 uniq(showFlame) = IID_BombImageStartTo16_2+timer_cnt + 1 //終了処理 timer_deinit: if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 : uniq(showFlame) = 0 if isBombReSetting == 0 { if GetMyBombLevel(getUserBombCountAll()) != GetMyBombLevel(getUserBombCountAll()+1) { ReSetBomb GetMyBombLevel(getUserBombCountAll()+1) } } timer_loop tid_bomb2 = stat return *BOMB3 timer_repeat 32, 16, 0, 2 ; p4=2 : timer_deinitを発生させて次のtimer_repeatをセット timer_init: dmmpan 0, int( (GetDPerMxOnMoni()-50)*(8+GetDPerMyOnMoni()/25) ) dmmplay 0,0 ; 爆発音 uniq(pt) = ginfo_mx, ginfo_my ScreenToClient hwnd, varptr(uniq(pt)) _init_end if isBombReSetting : timer_break if timer_cnt<0 || timer_cnt>15 : timer_continue ; TimerRepeatのバグかも... if flgLoadedBomb3(timer_cnt)==0 : SetBomb IID_BombImageStartTo16_3, timer_cnt : flgLoadedBomb3(timer_cnt)=1 ; Bombの読み込みをバラけさせる alalWidth IID_BombImageStartTo16_3+timer_cnt,,,uniq(pt)(0), uniq(pt)(1), 4 alalShow IID_BombImageStartTo16_3+timer_cnt if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 uniq(showFlame) = IID_BombImageStartTo16_3+timer_cnt + 1 //終了処理 timer_deinit: if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 : uniq(showFlame) = 0 if isBombReSetting == 0 { if GetMyBombLevel(getUserBombCountAll()) != GetMyBombLevel(getUserBombCountAll()+1) { ReSetBomb GetMyBombLevel(getUserBombCountAll()+1) } } timer_loop tid_bomb3 = stat return *BOMB0 timer_repeat 32, 16, 0, 2 timer_init: dmmpan 0, 0 dmmvol 0, 0 dmmplay 0,0 ; 爆発音 uniq(pt) = (ginfo(4)+ginfo(6))/2, (ginfo(5)+ginfo(7))/2 ScreenToClient hwnd, varptr(uniq(pt)) _init_end if isBombReSetting : timer_break if timer_cnt<0 || timer_cnt>15 : timer_continue ; TimerRepeatのバグかも... if flgLoadedBomb0(timer_cnt)==0 : SetOwariBombOnce ; Bombの読み込みをバラけさせる alalWidth IID_BombImageStartTo16_0+timer_cnt,,,uniq(pt)(0), uniq(pt)(1), 4 alalShow IID_BombImageStartTo16_0+timer_cnt if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 uniq(showFlame) = IID_BombImageStartTo16_0+timer_cnt + 1 //終了処理 timer_deinit: if uniq(showFlame) != 0 : alalHide uniq(showFlame) - 1 : uniq(showFlame) = 0 gsel WID_Main, -1 wait 400 ; 爆発音余韻 gosub *WM_CLOSE ; WebView2破棄 oncmd 0 ; なんか oncmd WM_ACTIVE が引っ掛かって砂時計ぐるぐるするので停止させる end timer_loop tid_bomb0 = stat return /* --------------------------------------------------------- Label Tab --------------------------------------------------------- */ *MENU_UPDATE mi(1) = 1 if ( CCall2(dpCtrl(1), WV2_get_CanGoBack, 1, varptr(p1)) == 0 ){ if ( p1 ){ mi(3) = 0 } else { mi(3) = 3 } } else { mi(3) = 3 } ; SetMenuItemInfo hMenu, 0, 1, varptr(mi) SetEnableBackButton (mi(3)==0) ; Backボタンが使えるか if ( CCall2(dpCtrl(1), WV2_get_CanGoForward, 1, varptr(p1)) == 0 ){ if ( p1 ){ mi(3) = 0 } else { mi(3) = 3 } } else { mi(3) = 3 } ; SetMenuItemInfo hMenu, 1, 1, varptr(mi) ; DrawMenuBar hWnd0 SetEnableForwardButton (mi(3)==0) ; Forwardボタンが使えるか SetSlitTabCover iTab ; 選択タブ強調表示用半透明カバー return *TAB_GETINFO sendmsg hTab, TCM_GETCURSEL, 0, 0 : iTab = stat gosub *TAB_GETINFO2 return *TAB_GETINFO2 pTabInfo = 0 if ( iTab == -1 ){ return } tci(0) = 8 : sendmsg hTab, TCM_GETITEMA, iTab, varptr(tci) if ( stat == 0 ){ return } pTabInfo = tci(6) dupptr dpCtrl, WV2_DATA_SIZE * 28 + pTabInfo, 8, 4 return *TAB_SELECT gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } pView = -1 : gosub *TAB_UPDATE gosub *WM_SIZE ret = CCall2(dpCtrl, WV2Ctrl_put_IsVisible, 1, 1) return *TAB_UPDATE gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } gosub *MENU_UPDATE update_url = "" // pView == -1 : タブをクリックしたり新規タブが発生して表示WebViewが変わるとき(*TAB_SELECTを通った) // == dpCtrl(1) : EVENTが発生したWebViewが表示中のWebViewと一致している // != dpCtrl(1) : 表示中のWebViewでなく裏のタブのWebViewがEVENTを発生した if ( pView == -1 || pView == dpCtrl(1) ){ _dpCtrl_ = dpCtrl(1) _iTab_ = iTab }else { _dpCtrl_ = pView _iTab_ = GetTabId_SamePView( pView ) ; EVENTが発生したWebViewを持つタブIDを探す if _iTab_ == -1 : return } ;if ( pView == -1 || pView == dpCtrl(1) ){ if ( CCall2( _dpCtrl_ , WV2_get_Source, 1, varptr(p1)) == 0 ){ sdim update_url,256 WideCharToMultiByte 0,0,p1,-1,varptr.update_url,256,0,0 if ( pView == -1 || pView == dpCtrl(1) ){ // 検索エンジンのURLだったらユーザーの使用エンジンとして認識する foreach searchEngineUrl i = instr(searchEngineUrl(cnt),0,".")+1 : if i == 0 :continue j = instr(searchEngineUrl(cnt),i,".")+1 : if j == 0 :continue ; https://www.yahoo. までを取り出す。「.co.jp」「.com」とかの違いは無視する。 temp = strmid(searchEngineUrl(cnt),0,i+j) if temp == strmid(update_url,0,strlen.temp) { if userSearchEngineName != searchEngineName(cnt) { userSearchEngineUrl = searchEngineUrl(cnt) userSearchEngineName = searchEngineName(cnt) userSearchEngineQuery = searchEngineQuery(cnt) sdim bufTmpUni,256 : cnvstow bufTmpUni, userSearchEngineName sendmsg hEditSearch, 0x1501/*EM_SETCUEBANNER*/, 0, varptr(bufTmpUni) } } loop // URL Editのテキスト更新 SetWindowTextW hEditUrl, p1 } CoTaskMemFree p1 } ;} if ( CCall2( _dpCtrl_ , WV2_get_DocumentTitle, 1, varptr(p1)) == 0 ){ if ( pView == -1 || pView == dpCtrl(1) ){ SetWindowTextW hWnd0, p1 } // タブへのテキスト書き込みとともにアイコンも更新 id = getIndex_FaviconList(update_url) ; id == -1 -> faviconが取得できなかったホストとして登録されている tci(0) = 3 : tci(3) = p1 : tci(5) = id : if tci(5)<0 : tci(5)=0 sendmsg hTab, TCM_SETITEMW, _iTab_, varptr(tci) CoTaskMemFree p1 // faviconをまだ持ってない(id==0)場合ダウンロード if id == 0 && badInet == 0 : Favicon_Download update_url } return // Faviconダウンロード #deffunc Favicon_Download str _update_url, local _url _url = _update_url i = instr(_url,0,"://")+3 : if i == 2 : return j = instr(_url,i,"/") : if j == -1 : j = 1024 temp = strmid(_url,0,i+j)+"/favicon.ico" ; 一般的な置き場所で一回決め打ち // 前のをダウンロード中かもしれないからリストに足していく if length.faviconDownloader <= faviconDownloader_index { // リストの最後まで取得しきっていたら初期化する sdim faviconDownloader, 256, 0 faviconDownloader_index = 0 faviconDownloader(0) = temp }else { // 同じホストがないか確認して末尾に足す i = 0 foreach faviconDownloader if faviconDownloader(cnt) == temp : i = 1 : break loop if i = 0 : faviconDownloader(length.faviconDownloader) = temp } /* --------------------------- hspinet - faviconダウンロードループ(リストの先頭から順次) --------------------------- */ timer_repeat 50 ; タイマーループ(前のダウンロード処理が稼働中だったらp4=0[省略]なので追加では何も処理しない。上でリストに足されただけで継続される) if timer_cnt == 0 { uniq(url) = faviconDownloader( faviconDownloader_index ) neturl uniq(url) netrequest_get "" logmes "DOWNLOAD 開始 url="+uniq(url) } uniq(br) = 0 ; 終了処理フラグ netexec res if res < 0 { logmes "DOWNLOAD 失敗 res="+res uniq(br) = -1 }else : if res > 0 { logmes "DOWNLOAD 完了" // バッファを確保(実際に受信した量より多めに確保される) sdim uniq(buf), netgetv_size() // 受信データを代入 netgetv_data uniq(buf) if instr(uniq(buf),0,"html") != -1 { // DOWNLOAD 失敗。中身を見るとhtmlテキストが取得されている。結局アイコンのダウンロードはできていない。 uniq(br) = -1 }else : if netgetv_requestsize() <= 0 { // DOWNLOAD 失敗。0バイトアイコン。qiitaとかこれになる。 uniq(br) = -1 }else { // DOWNLOAD 成功。ファイル名を ホスト.ico (ホスト.png) にして保存 uniq(ext) = ".ico" uniq(i) = instr(uniq(url),0,"://")+3 uniq(j) = instr(uniq(url),uniq(i),"/") : if uniq(j) == -1 : uniq(j) = 1024 uniq(k) = instr(uniq(url),0,"domain=") : if uniq(k) != -1 : uniq(i) = uniq(k)+7 : uniq(j) = 1024 : uniq(ext) = ".png" ; Google様のご加護を頂いたとき uniq(temp) = strmid( uniq(url), uniq(i), uniq(j) ) + uniq(ext) logmes "get_favicon: "+uniq(temp) bsave dir_exe+"\\favicons\\"+uniq(temp), uniq(buf), netgetv_requestsize() ; 実際に受信したサイズで保存 // 【 favicon 保存完了 】-> タブのアイコンを更新 gosub *TAB_ICON_UPDATE uniq(br) = 1 } } // ダウンロード完了or失敗 if uniq(br) { if uniq(br) == -1 { ; 失敗 if getpath(uniq(url),2) == ".ico" { // icoが見つからないときはGoogle様にお願いしてもう一度まわす uniq(i) = instr(uniq(url),0,"://")+3 uniq(j) = instr(uniq(url),uniq(i),"/") : if uniq(j) == -1 : uniq(j) = 1024 faviconDownloader(length.faviconDownloader) = "https://www.google.com/s2/favicons?sz=32&domain="+strmid(uniq(url),uniq(i),uniq(j)) ; Google API }else { add_DefaultIconHost uniq(url) } } faviconDownloader_index++ if length.faviconDownloader <= faviconDownloader_index : timer_break ; ダウンロードリスト全て完了していたら終了 timer_continue 0 ; timer_cnt を 0 に戻して次のダウンロード処理 } timer_loop return // タブすべてのアイコンを更新チェック *TAB_ICON_UPDATE sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 repeat stat tci(0) = 8/*TCIF_PARAM)*/|2/*TCIF_IMAGE*/ : sendmsg hTab, TCM_GETITEMA, cnt, varptr(tci) if ( stat == 0 ){ continue } if tci(5) != 0 : continue ; 既にdefault.icoではない pTabInfo_temp = tci(6) dupptr dpCtrl_temp, WV2_DATA_SIZE * 28 + pTabInfo_temp, 8, 4 if ( CCall2(dpCtrl_temp(1), WV2_get_Source, 1, varptr(p1)) == 0 ){ // タブデータからURLを取得した sdim u,256 WideCharToMultiByte 0,0,p1,-1,varptr.u,256,0,0 id = getIndex_FaviconList(u) ; URL(のホスト)のアイコンのイメージリストID if id > 0 { // タブのアイコン更新 tci(0) = 2 : tci(5) = id sendmsg hTab, TCM_SETITEMA, cnt, varptr(tci) } CoTaskMemFree p1 } loop return // タブIDからURLを取り出す #defcfunc GetUrl_Tab int _id, local _p1, local _u _u = "" tci(0) = 8/*TCIF_PARAM)*/ : sendmsg hTab, TCM_GETITEMA, _id, varptr(tci) if ( stat == 0 ){ return "" } pTabInfo_temp = tci(6) dupptr dpCtrl_temp, WV2_DATA_SIZE * 28 + pTabInfo_temp, 8, 4 if ( CCall2(dpCtrl_temp(1), WV2_get_Source, 1, varptr(_p1)) == 0 ){ // タブデータからURLを取得した sdim _u,256 WideCharToMultiByte 0,0,_p1,-1,varptr._u,256,0,0 CoTaskMemFree _p1 } return _u // 起動時, *CMD_NEW_TAB *TAB_ADD if ( bAdd ){ return } bAdd = 1 gosub *TAB_ADD2 gosub *EVENT_SET gosub *TAB_SELECT bufTmp = DEF_URL : if bufTmp == "" : bufTmp = userSearchEngineUrl SetWindowTextA hEditUrl, varptr(bufTmp) gosub *CMD_NAVIGATE bAdd = 0 return // 起動時, *CMD_NEW_TAB, 検索ボックスで新規タブ(すべて末尾にタブを追加) *TAB_ADD2 tabYoyaku=1 ; 1つ増える予定でリサイズしてもらう gosub *TabReWidth ; タブコントロールのリサイズ(増える前に大きくしないと溢れたときに表示がガチャガチャする) gosub *TAB_GETINFO if ( pTabInfo ){ ret = CCall2(dpCtrl, WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブを非表示 } sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : iTab = stat ; 末尾にタブ追加を指示 tci(0) = 11 : tci(6) = 0 : tci(5) = 0 bufTmp = "Loading..." : tci(3) = varptr(bufTmp) sendmsg hTab, TCM_INSERTITEMA, iTab, varptr(tci) sendmsg hTab, TCM_SETCURSEL, iTab, 0 ; 末尾のタブにフォーカス curCtrl = WebView2_CreateCtrl(pEnv, hWnd0) curView = WebView2_GetView(curCtrl) if ( curCtrl == 0 || curView == 0 ){ gosub *TAB_DEL return } return // WebViewのリンクで新規タブ, タブメニュー:右隣に新しいタブ のための命令 // _stayCursel : 新タブにフォーカスしないで今選択されているタブの表示を継続 // _selpos : この指定タブの右隣に新しいタブを挿入する #deffunc Tab_Add3 int _stayCursel, int _selpos tabYoyaku=1 ; 1つ増える予定でリサイズしてもらう gosub *TabReWidth ; タブコントロールのリサイズ(増える前に大きくしないと溢れたときに表示がガチャガチャする) if _stayCursel == 0 { gosub *TAB_GETINFO if ( pTabInfo ){ ret = CCall2(dpCtrl, WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブを非表示 } } iTab = _selpos + 1 ; 指定したタブのとなりに追加を指示 tci(0) = 11 : tci(6) = 0 : tci(5) = 0 bufTmp = "Loading..." : tci(3) = varptr(bufTmp) sendmsg hTab, TCM_INSERTITEMA, iTab, varptr(tci) if _stayCursel == 0 { sendmsg hTab, TCM_SETCURSEL, iTab, 0 ; stayのときは今のタブを選択したままに } curCtrl = WebView2_CreateCtrl(pEnv, hWnd0) curView = WebView2_GetView(curCtrl) if ( curCtrl == 0 || curView == 0 ){ gosub *TAB_DEL return } return *TAB_DEL sendmsg hTab, TCM_GETCURSEL, 0, 0 : nowTab = stat sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 if ( stat <= 1 ){ return } if ( bDel ){ return } bDel = 1 gosub *TAB_GETINFO2 if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(0), WV2Ctrl_Close, 0) WebView2_Release dpCtrl(1) WebView2_Release dpCtrl(0) HeapFree GetProcessHeap(), 0, pTabInfo sendmsg hTab, TCM_DELETEITEM, iTab, 0 ; if ( iTab ){ iTab-- } mostLeftTabDel = (nowTab==0 && iTab==0) if iTab <= nowTab : iTab = nowTab - 1 : else : iTab = nowTab if iTab < 0 : iTab = 0 sendmsg hTab, TCM_SETCURSEL, iTab, 0 if nowTab != iTab || mostLeftTabDel { gosub *TAB_SELECT ; 表示するタブが変わったときだけ*TAB_SELECT処理を実行 }else { gosub *WM_SIZE ; その代わりウィンドウのリサイズは実行してあげる } bDel = 0 return /* --------------------------- タブの移動を無理やり実装 --------------------------- */ // タブの移動始め(ドラッグしてdpi_.5ピクセル以上動いた) *TAB_MOVE_Start logmes "TAB_MOVE_Start" sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat if ( stat <= 1 ){ return } gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } // 現在のタブのテキストとアイコンIDを記憶しておく sdim tabTitles0, 256, numTab ; 元 sdim tabTitles2, 256, numTab ; 書き込みしたもの(振り分けと比較して変わったところだけを書き換える) sdim tabIcons0, numTab ; 元 sdim tabIcons2, numTab ; 書き込みしたもの(振り分けと比較して変わったところだけを書き換える) repeat numTab tci(0) = 1/*TCIF_TEXT*/|2/*TCIF_IMAGE*/ sdim bufTmp,256 : tci(3) = varptr(bufTmp), 256 sendmsg hTab, TCM_GETITEMA, cnt, varptr(tci) if stat == 0 : continue tabTitles0(cnt) = bufTmp tabTitles2(cnt) = bufTmp tabIcons0(cnt) = tci(5) tabIcons2(cnt) = tci(5) loop // ダミータブにテキストをセット tci(0) = 3 bufTmp = tabTitles0(iTab) : tci(3) = varptr(bufTmp) : tci(5) = tabIcons0(iTab) sendmsg hTabDummy, TCM_SETITEMA, 0, varptr(tci) // 1.メインのタブコントロールの1タブ幅を取り出してダミーも同じ幅にする tabMoveRECT = 0,0,0,0 sendmsg hTab,0x130A/*TCM_GETITEMRECT*/, iTab, varptr(tabMoveRECT) tabMoveSIZE = tabMoveRECT(2) - tabMoveRECT(0), tabMoveRECT(3) - tabMoveRECT(1) ClientToScreen hTab, varptr(tabMoveRECT) // 2.タブのどこをクリックしたかを記憶。ダミーはその差分だけズラして表示する(tabMoveMouseXYはクリック開始点) tabMoveSA = tabMoveMouseXY(0) - tabMoveRECT(0), tabMoveMouseXY(1) - tabMoveRECT(1) sendmsg hTab, TCM_GETCURSEL, 0, 0 // 上記1,2を反映してダミータブを表示 pt = ginfo_mx, ginfo_my ScreenToClient hWnd0, varptr(pt) SetWindowPos hTabDummy, 0, pt(0)-tabMoveSA(0), pt(1)-tabMoveSA(1), tabMoveSIZE(0), tabMoveSIZE(1), $43 tabMoveOriiTab = iTab SetSlitTabCover -1 ; タブカバーはメインタブ全体を覆わせる return // タブ移動中 *TAB_MOVE_Following if length.tabTitles0 <= 1 : return // ダミータブを移動 pt = ginfo_mx, ginfo_my ScreenToClient hWnd0, varptr(pt) MoveWindow hTabDummy, pt(0)-tabMoveSA(0), pt(1)-tabMoveSA(1), tabMoveSIZE(0), tabMoveSIZE(1),1 // マウスのスクリーン座標をタブコントロールのクライアント座標に変換してTCM_HITTESTでどのタブ上かを判定 TCHITTESTINFO = ginfo_mx, ginfo_my, 0 ScreenToClient hTab, varptr(TCHITTESTINFO) TCHITTESTINFO(1) = 5 sendmsg hTab, TCM_HITTEST, 0, varptr(TCHITTESTINFO) tabMoveDestinationTabID = stat if tabMoveDestinationTabID == -1 : return ; タブ上では無い // どのタブのテキストとアイコンを入れ替える必要があるかを調査 repeat length.tabTitles0 if tabMoveDestinationTabID < tabMoveOriiTab { if cnt < tabMoveDestinationTabID { bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) }else : if cnt == tabMoveDestinationTabID { bufTmp = " " chngid = -1 }else : if cnt <= tabMoveOriiTab { bufTmp = tabTitles0(cnt-1) chngid = tabIcons0(cnt-1) }else { bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) } }else : if tabMoveOriiTab < tabMoveDestinationTabID { if cnt < tabMoveOriiTab { bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) }else : if cnt < tabMoveDestinationTabID { bufTmp = tabTitles0(cnt+1) chngid = tabIcons0(cnt+1) }else : if cnt == tabMoveDestinationTabID { bufTmp = " " chngid = -1 }else { bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) } }else { if cnt != tabMoveDestinationTabID { bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) }else { bufTmp = " " chngid = -1 } } //見かけ上だけ書き換え(後で元に戻して、それからタブのデータを入れ替える) if tabTitles2(cnt) != bufTmp || tabIcons2(cnt) != chngid { tci(0) = 3 : tci(3) = varptr(bufTmp) : tci(5) = chngid sendmsg hTab, TCM_SETITEMA, cnt, varptr(tci) tabTitles2(cnt) = bufTmp tabIcons2(cnt) = chngid } loop return // タブ移動終了 *TAB_MOVE_End ShowWindow hTabDummy, 0 // いったんテキストを全て元に戻す repeat length.tabTitles0 bufTmp = tabTitles0(cnt) chngid = tabIcons0(cnt) if tabTitles2(cnt) != bufTmp || tabIcons2(cnt) != chngid { tci(0) = 3 : tci(3) = varptr(bufTmp) : tci(5) = chngid sendmsg hTab, TCM_SETITEMA, cnt, varptr(tci) tabTitles2(cnt) = bufTmp tabIcons2(cnt) = chngid } loop // 同じ場所 か あさっての所にドロップしていたらタブ入れ替えしない if ( (tabMoveOriiTab == tabMoveDestinationTabID) || (tabMoveOriiTab < 0 || tabMoveDestinationTabID < 0) )==0 { // タブ入れ替え : tabMoveOriiTabからデータを抽出 → tabMoveDestinationTabIDの位置にInsert → tabMoveOriiTabのタブを削除 ;logmes "tabMoveOriiTab="+tabMoveOriiTab+" tabMoveDestinationTabID="+tabMoveDestinationTabID Tab_Replace tabMoveOriiTab, tabMoveDestinationTabID } gosub *TAB_SELECT return // タブ入れ替え(元の場所, 移動先) #deffunc Tab_Replace int _tabMoveOriiTab, int _tabMoveDestinationTabID tci(0) = 11 : sendmsg hTab, TCM_GETITEMA, _tabMoveOriiTab, varptr(tci) if ( stat == 0 ){ return } sendmsg hTab, TCM_INSERTITEMA, _tabMoveDestinationTabID + (_tabMoveOriiTab < _tabMoveDestinationTabID), varptr(tci) sendmsg hTab, TCM_DELETEITEM, _tabMoveOriiTab + (_tabMoveOriiTab > _tabMoveDestinationTabID), 0 sendmsg hTab, TCM_SETCURSEL, _tabMoveDestinationTabID, 0 return /* --------------------------------------------------------- Label Event --------------------------------------------------------- */ *EVENT_TITLE pView = wparam : gosub *TAB_UPDATE return *EVENT_COMPLETE pView = wparam : gosub *TAB_UPDATE return // 同じpViewを持つタブIDを取得 #defcfunc GetTabId_SamePView int _pView, local _mae_iTab, local _getTabID _mae_iTab = iTab _getTabID = -1 sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 repeat stat iTab = cnt gosub *TAB_GETINFO2 ; iTabを指定すると*TAB_GETINFO2の中でタブ情報からdpCtrlを拾ってくれる if dpCtrl(1) == _pView : _getTabID = iTab : break loop // *TAB_GETINFO2 の使用で変わった変数を元に戻す iTab = _mae_iTab : gosub *TAB_GETINFO2 return _getTabID *EVENT_FULLSCR gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } if ( dpCtrl(1) != wparam ){ return } if ( CCall2(dpCtrl(1), WV2_GetFullScreen, 1, varptr(p1)) ){ return } if ( p1 ){ ShowWindow hEditUrl, 0 ShowWindow hTab, 0 wndInfo(0) = GetWindowLong(hWnd0, -20) wndInfo(1) = GetWindowLong(hWnd0, -16) wndInfo(2) = GetMenu(hWnd0) SetMenu hWnd0, 0 if ( WebView2_GetWndRect(hWnd0, rc) == 0 ){ return } wndInfo(3) = rc(0), rc(1), rc(2), rc(3) SetWindowLong hWnd0, -20, 0 SetWindowLong hWnd0, -16, wndInfo(1) & 0xff000000 if ( WebView2_GetMonitorRect(hWnd0, rc) == 0 ){ return } SetWindowPos hWnd0, -1, rc(0), rc(1), rc(2), rc(3), 0x220 } else { ShowWindow hEditUrl, 5 ShowWindow hTab, 5 SetWindowLong hWnd0, -20, wndInfo(0) SetWindowLong hWnd0, -16, wndInfo(1) if ( wndInfo(2) ){ SetMenu hWnd0, wndInfo(2) } if ( wndInfo(0) & 0x8 ){ p1 = -1 } else { p1 = -2 } SetWindowPos hWnd0, p1, wndInfo(3), wndInfo(4), wndInfo(5), wndInfo(6), 0x220 ShowWindow hWnd0, 1 } return *EVENT_PRINT dialog strf("PDF isSuccessful %d", lparam) ; mi(1) = 1 : mi(3) = 0 ; SetMenuItemInfo hMenu, 8, 1, varptr(mi) ; DrawMenuBar hWnd0 bPDF = 0 return *EVENT_NEWWND logmes "EVENT_NEWWND" if ( lparam == 0 || bAdd != 0 ){ return } bAdd = 1 pNewWnd = lparam if ( CCall2(pNewWnd, WV2NewWnd_GetDeferral, 1, varptr(pDef)) == 0 ){ PostMessage hWnd0, 0x9004, 0, 0 bAdd = 1 } return *EVENT_NEWWND2 logmes "EVENT_NEWWND2" if ( CCall2(pNewWnd, WV2NewWnd_put_Handled, 1, 1) == 0 ){ if ( CCall2(pNewWnd, WV2NewWnd_get_Uri, 1, varptr(p1)) == 0 ){ alalHide IID_NewtabButton ;gosub *TAB_ADD2 sendmsg hTab, TCM_GETCURSEL, 0, 0 Tab_Add3 1/*stay*/, stat ; 今のタブ(stat)のとなりに新タブを追加。タブフォーカスは移動させない。 ret = CCall2(pNewWnd, WV2NewWnd_put_NewWindow, 1, curView) gosub *EVENT_SET ;gosub *TAB_SELECT ; 表示するタブは変わらないので*TAB_SELECT処理の必要がない gosub *WM_SIZE ; その代わりウィンドウのリサイズは実行してあげる } } ret = CCall2(pDef, WV2Deferral_Complete, 0) WebView2_Release pDef bAdd = 0 return *EVENT_SET pTabInfo = 0 pTabInfo = HeapAlloc(GetProcessHeap(), 8, WV2_DATA_SIZE * 28 + 8) if ( pTabInfo == 0 ){ return } dupptr dp, pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_TITLECHANGED, hWnd0, 0x9000, dp ret = CCall2(curView, WV2_add_DocumentTitleChanged, 2, dp, varptr(dp(6))) dupptr dp, WV2_DATA_SIZE * 4 + pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_NAVIGATIONCOMPLETED, hWnd0, 0x9001, dp ret = CCall2(curView, WV2_add_NavigationCompleted, 2, dp, varptr(dp(6))) dupptr dp, WV2_DATA_SIZE * 8 + pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_FULLSCREEN, hWnd0, 0x9002, dp ret = CCall2(curView, WV2_add_FullScrChanged, 2, dp, varptr(dp(6))) dupptr dp, WV2_DATA_SIZE * 12 + pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_NEWWINDOW, hWnd0, 0x9003, dp ret = CCall2(curView, WV2_add_NewWindowRequested, 2, dp, varptr(dp(6))) dupptr dpCtrl, WV2_DATA_SIZE * 28 + pTabInfo, 8, 4 dpCtrl(0) = curCtrl, curView tci(0) = 8 : tci(6) = pTabInfo sendmsg hTab, TCM_SETITEMW, iTab, varptr(tci) return /* --------------------------------------------------------- Label Menu --------------------------------------------------------- */ *CMD_BACK gosub *TAB_GETINFO if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_get_GoBack, 0) } return *CMD_FORWARD gosub *TAB_GETINFO if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_get_GoForward, 0) } return *CMD_RELOAD gosub *TAB_GETINFO if ( pTabInfo ){ ret = CCall2(dpCtrl(1), WV2_Reload, 0) } return *CMD_NAVIGATE gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } p1 = (GetWindowTextLengthW(hEditUrl) + 1) * 2 sdim bufTmp, p1 GetWindowTextW hEditUrl, varptr(bufTmp), p1 ret = CCall2(dpCtrl(1), WV2_Navigate, 1, varptr(bufTmp)) return *CMD_NEW_TAB gosub *TAB_ADD return *CMD_DEL_NOWTAB sendmsg hTab, TCM_GETCURSEL, 0, 0 : iTab = stat *CMD_DEL_TAB gosub *TAB_DEL return *CMD_CAPTURE dialog "png", 17 if ( stat == 0 ){ return } if ( SHCreateStreamOnFileEx(refstr, 0x1002, 0x80, 1, 0, p1) ){ return } gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } dupptr dp, WV2_DATA_SIZE * 20 + pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_CAPTURE, hWnd0, 0, dp ret = CCall2(dpCtrl(1), WV2_CapturePreview, 3, 0, p1, dp) WebView2_EventWait dp WebView2_Release p1 return *CMD_PRINTPDF if ( bPDF ){ return } dialog "pdf", 17 if ( stat == 0 ){ return } gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } bPDF = 1 ; mi(1) = 1 : mi(3) = 3 ; SetMenuItemInfo hMenu, 8, 1, varptr(mi) ; DrawMenuBar hWnd0 dupptr dp, WV2_DATA_SIZE * 24 + pTabInfo, WV2_DATA_SIZE * 4, 4 WebView2_EventInit WV2_EVENT_PRINTTOPDF, hWnd0, 0x9005, dp sdim bufTmp, (strlen(refstr) + 1) * 2 cnvstow bufTmp, refstr ret = CCall2(dpCtrl(1), WV2_PrintToPdf, 3, varptr(bufTmp), 0, dp) return stat *CMD_DOWNLOAD gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } if ( CCall2(dpCtrl(1), WV2_IsDownloadDialogOpen, 1, varptr(p1)) ){ return } if ( p1 ){ p1 = WV2_CloseDownloadDialog } else { p1 = WV2_OpenDownloadDialog } ret = CCall2(dpCtrl(1), p1, 0) return *CMD_TASKMANAGER gosub *TAB_GETINFO if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(1), WV2_OpenTaskManagerWindow, 0) return *CMD_NEXT_TAB sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat if( numTab <= 1 ){ return } sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat == -1 ){ return } iTab = stat : gosub *TAB_GETINFO2 if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(0), WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブiTabを非表示にして iTab = (iTab+1) \ numTab sendmsg hTab, TCM_SETCURSEL, iTab, 0 ; 次のタブを選択して gosub *TAB_SELECT ; 選択タブのWebView2諸々を表示 return *CMD_PREVIOUS_TAB sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat if( numTab <= 1 ){ return } sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat == -1 ){ return } iTab = stat : gosub *TAB_GETINFO2 if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(0), WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブiTabを非表示にして iTab = (iTab-1+numTab) \ numTab sendmsg hTab, TCM_SETCURSEL, iTab, 0 ; 後ろのタブを選択して gosub *TAB_SELECT ; 選択タブのWebView2諸々を表示 return #deffunc Cmd_OpenTabN int _p1, local _iTab, local _numTab _iTab = _p1 - 1 sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : _numTab = stat if _iTab < 0 : _iTab = _numTab - 1 ; _p1==0 で LastTab if( _numTab <= _iTab ){ return } sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat == -1 ){ return } if ( stat == _iTab ){ return } iTab = stat : gosub *TAB_GETINFO2 if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(0), WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブiTabを非表示にして iTab = _iTab sendmsg hTab, TCM_SETCURSEL, iTab, 0 ; タブを選択して gosub *TAB_SELECT ; 選択タブのWebView2諸々を表示 return /* --------------------------------------------------------- WM_SIZE - コントロールのサイズ調整 --------------------------------------------------------- */ *WM_SIZE GetClientRect hWnd0, varptr(rc) if ( IsWindowVisible(hEditUrl) ){ kensakuBarWidth = rc(2) / 5 : if kensakuBaX < dpi_.175 : kensakuBaX = dpi_.175 MoveWindow hEditUrl, dpi_.75, dpi_.5, rc(2) - (dpi_(200)+kensakuBarWidth), dpi_.20, dpi_.5 MoveWindow hEditSearch, rc(2) - (dpi_(50)+kensakuBarWidth), dpi_.5, kensakuBarWidth, dpi_.20, dpi_.5 gosub *TabReWidth ; タブコントロールのリサイズ if initedAlphaLayer { ; 初期化が終わっているか確認 alalWidth IID_SettingsButton,,, rc(2)-dpi_.40, alalWidth IID_LevelMeter,,, rc(2) - (dpi_(123)+kensakuBarWidth), alalWidth IID_ReloadButton,,, dpi_.75 + rc(2) - (dpi_(200)+kensakuBarWidth) - dpi_.28, rect_=0,0,0,0 GetClientRect hTab, varptr(rect_) alalWidth IID_NewtabButton,,, rect_(2) + dpi_.5 alalShow IID_NewtabButton alalWidth IID_TabBarTranslucentCover,tabWidth sendmsg hTab, TCM_GETCURSEL, 0, 0 : iTab = stat SetSlitTabCover iTab } p1 = 55 } else { p1 = 0 } gosub *TAB_GETINFO if ( pTabInfo ){ WebView2_Size dpCtrl(0), 0, dpi_.p1, rc(2), rc(3) } return /* --------------------------------------------------------- Tabコントロールのサイズ調整 --------------------------------------------------------- */ *TabReWidth GetClientRect hWnd0, varptr(rc) RECT = 0,0,0,0 sendmsg hTab,0x130A/*TCM_GETITEMRECT*/, 0, varptr(RECT) RECT(2) -= RECT(0) : RECT(3) -= RECT(1) sendmsg hTab,0x1304/*TCM_GETITEMCOUNT*/,0,0 num = stat if DontReWidthTabItemSize == 0 { ; タブをミドルクリックで消したときタブ上を離れるまでタブ幅変更を禁止 // タブ1つのサイズを計算 w = (rc(2)-dpi_.50) / (num + tabYoyaku) ; tabYoyaku : タブ1つ多めのサイズで調整するフラグ if w > dpi_.160 : w = dpi_.160 ; 最大サイズ if BrowserTabWidth ! w { p1 = 0 << 16 : p1 |= w : sendmsg hTab, 0x1329/*TCM_SETITEMSIZE*/, 0, p1 ; タブ1つの幅を設定 RECT(2) = w BrowserTabWidth = w } } tabWidth = ((RECT(2)) * (num + tabYoyaku) + dpi_.5) ; タブコントロール全体のサイズ MoveWindow hTab, 1, dpi_.30, tabWidth, dpi_.25, 1 tabYoyaku = 0 return /* --------------------------------------------------------- WM_CLOSE - 参考元で使用。今はoncmdしてない。WebView2の破棄用。 --------------------------------------------------------- */ *WM_CLOSE sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 repeat stat iTab = cnt : gosub *TAB_DEL loop WebView2_Release pEnv ; if ( hMenu ){ DestroyMenu hMenu } return /* --------------------------------------------------------- WM_NOTIFY --------------------------------------------------------- */ *WM_NOTIFY if ( lparam == 0 ){ return } dupptr dpHdr, lparam, 12, 4 if ( dpHdr(0) == hTab ){ ;logmes "nmhdr2 = "+dpHdr(2) if ( dpHdr(2) == -552/*TCN_SELCHANGING*/ ){ ; CHANGEしようとしているCHANGE前 sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat == -1 ){ return } iTab = stat : gosub *TAB_GETINFO2 if ( pTabInfo == 0 ){ return } ret = CCall2(dpCtrl(0), WV2Ctrl_put_IsVisible, 1, 0) ; 今のタブiTabを非表示にして } if ( dpHdr(2) == -551/*TCN_SELCHANGE*/ ){ ; CHANGEしたら gosub *TAB_SELECT ; 選択タブのWebView2諸々を表示 return } if ( dpHdr(2) == -5/*NM_RCLICK*/ ){ MyPost MP_TabMenu return } }else : if dpHdr(0) == hTooltips { // 爆発レベルメータのツールチップを表示 if dpHdr(2) == $FFFFFDF8/*TTN_GETDISPINFO*/ { dupptr NMTTDISPINFO, lparam, 108 dupptr szText, lparam+16, 80, 2 lv = GetMyBombLevel(getUserBombCountAll()) szText=" レベル:"+lv+" \n"+strf(" 爆発力:%1.2f倍 ",GetBombBairitsu(lv)) } } return /* --------------------------------------------------------- WM_COMMAND - 主にMyPost先 --------------------------------------------------------- */ *WM_COMMAND switch wparam case MP_Bomb gosub *BOMB swbreak case MP_TabDelMclick // マウスミドルクリック (タブ上か確認して必要ならDEL) if WindowFromPoint(ginfo_mx, ginfo_my) == hTab { dim tchi, 3 GetCursorPos varptr(tchi) ScreenToClient hTab, varptr(tchi) sendmsg hTab, TCM_HITTEST, 0, varptr(tchi) if ( stat == -1 ){ return } DontReWidthTabItemSize = 1 iTab = stat : gosub *TAB_DEL // タブコントロール上を離れるまでタブ幅が変更されないようにする timer_repeat 50 timer_init: dim uniq(tchi),3 _init_end logmes "No Change TabWidth - timer_cnt="+timer_cnt GetCursorPos varptr(uniq(tchi)) ScreenToClient hTab, varptr(uniq(tchi)) sendmsg hTab, TCM_HITTEST, 0, varptr(uniq(tchi)) if ( stat == -1 ) : timer_break timer_deinit: DontReWidthTabItemSize = 0 gosub *WM_SIZE timer_loop } swbreak case MP_TabMoveStartCheck // マウスドラッグ (タブ上でdpi_.5ピクセル以上進んだらタブ移動状態に遷移) if abs(tabMoveMouseXY(0)-ginfo_mx) > dpi_.5 { pt = tabMoveMouseXY(0), tabMoveMouseXY(1) ScreenToClient hTab, varptr(pt) sendmsg hTab, TCM_HITTEST, 0, varptr(pt) if ( stat != -1 ){ gosub *TAB_MOVE_Start seqTabMove = 1 } } swbreak case MP_TabMoveFollowing // タブ移動中 gosub *TAB_MOVE_Following swbreak case MP_TabMoveEnd // タブ移動終了 gosub *TAB_MOVE_End swbreak case MP_NewTab gosub *CMD_NEW_TAB swbreak case MP_Menu // ブラウザメニュー RECT = 0,0,0,0 alalGetRect IID_SettingsButton, RECT, -1 SetTimer hWnd0,0,10,0 ; メニュー中も無理やり爆発を動かす // ポップアップメニュー表示 TrackPopupMenu hPopMenu, $188/*TPM_RIGHTALIGN|TPM_NONOTIFY|TPM_RETURNCMD*/, RECT(2), RECT(3), $180, hWnd0, 0 st = stat KillTimer hWnd0,0 if st = 0 : return ; 選択キャンセル switch st case ITEM_Print SetFocus GetHwndTopWebview(hWnd0) ; WebView2にフォーカスするとショートカットを実行できる。keybd_eventで無理やりコマンドを実行する。 keybd_event 0x11/*Ctrl*/, 0, 0/*down*/, 0 keybd_event 'P', 0, 0/*down*/, 0 keybd_event 'P', 0, 2/*up*/, 0 keybd_event 0x11/*Ctrl*/, 0, 2/*up*/, 0 swbreak case ITEM_WebCapture SetFocus GetHwndTopWebview(hWnd0) keybd_event 0x11/*Ctrl*/, 0, 0/*down*/, 0 keybd_event 0x10/*Shift*/, 0, 0/*down*/, 0 keybd_event 'S', 0, 0/*down*/, 0 keybd_event 'S', 0, 2/*up*/, 0 keybd_event 0x10/*Shift*/, 0, 2/*up*/, 0 keybd_event 0x11/*Ctrl*/, 0, 2/*up*/, 0 swbreak case ITEM_WebSelect SetFocus GetHwndTopWebview(hWnd0) keybd_event 0x11/*Ctrl*/, 0, 0/*down*/, 0 keybd_event 0x10/*Shift*/, 0, 0/*down*/, 0 keybd_event 'X', 0, 0/*down*/, 0 keybd_event 'X', 0, 2/*up*/, 0 keybd_event 0x10/*Shift*/, 0, 2/*up*/, 0 keybd_event 0x11/*Ctrl*/, 0, 2/*up*/, 0 swbreak case ITEM_DownLoad gosub *CMD_DOWNLOAD swbreak case ITEM_OpenEdge if ( CCall2(dpCtrl(1), WV2_get_Source, 1, varptr(p1)) == 0 ){ sdim u,256 WideCharToMultiByte 0,0,p1,-1,varptr.u,256,0,0 exec "cmd.exe /c start microsoft-edge:"+u,2 CoTaskMemFree p1 } swbreak case ITEM_DevTool SetFocus GetHwndTopWebview(hWnd0) keybd_event 0x7B/*F12*/, 0, 1/*down*/, 0 keybd_event 0x7B/*F12*/, 0, 3/*up*/, 0 swbreak case ITEM_VerInfo dialog "バージョン "+_VERSION_STR_, 0, " Internet Explosion のバージョン情報" swbreak swend swbreak case MP_TabMenu // タブメニュー dim tchi, 3 GetCursorPos varptr(tchi) ScreenToClient hTab, varptr(tchi) sendmsg hTab, TCM_HITTEST, 0, varptr(tchi) if ( stat == -1 ){ return } tabMenu_iTab = stat ; どのタブを右クリックしたか記憶しておく SetTimer hWnd0,0,10,0 ; メニュー中も無理やり爆発を動かす // ポップアップメニュー表示 TrackPopupMenu hPopTabMenu, $180/*TPM_NONOTIFY|TPM_RETURNCMD*/, ginfo_mx, ginfo_my, $180, hWnd0, 0 st = stat KillTimer hWnd0,0 if st = 0 : return ; 選択キャンセル switch st case ITAB_NewTabRight if ( bAdd ){ return } bAdd = 1 Tab_Add3 0/*stayしない*/, tabMenu_iTab gosub *EVENT_SET bufTmp = DEF_URL : if bufTmp == "" : bufTmp = userSearchEngineUrl sdim bufTmpUni,256 : cnvstow bufTmpUni, bufTmp ret = CCall2(dpCtrl(1), WV2_Navigate, 1, varptr(bufTmpUni)) gosub *TAB_SELECT bAdd = 0 swbreak case ITAB_Reload SetFocus GetHwndTopWebview(hWnd0) ; WebView2にフォーカスするとショートカットを実行できる。keybd_eventで無理やりコマンドを実行する。 keybd_event 0x11/*Ctrl*/, 0, 0/*down*/, 0 keybd_event 'R', 0, 0/*down*/, 0 keybd_event 'R', 0, 2/*up*/, 0 keybd_event 0x11/*Ctrl*/, 0, 2/*up*/, 0 swbreak case ITAB_Duplicate if ( bAdd ){ return } bAdd = 1 Tab_Add3 0/*stayしない*/, tabMenu_iTab gosub *EVENT_SET bufTmp = GetUrl_Tab(tabMenu_iTab) sdim bufTmpUni,256 : cnvstow bufTmpUni, bufTmp ret = CCall2(dpCtrl(1), WV2_Navigate, 1, varptr(bufTmpUni)) gosub *TAB_SELECT bAdd = 0 swbreak case ITAB_Close iTab = tabMenu_iTab : gosub *TAB_DEL swbreak case ITAB_CloseOther sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat repeat stat, 1 iTab = numTab - cnt if (numTab - cnt) != tabMenu_iTab : gosub *TAB_DEL loop swbreak case ITAB_CloseLeft sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat repeat tabMenu_iTab, 1 iTab = tabMenu_iTab - cnt : gosub *TAB_DEL loop swbreak case ITAB_CloseRight sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat repeat stat, 1 iTab = numTab - cnt if (numTab - cnt) == tabMenu_iTab : break gosub *TAB_DEL loop swbreak swend swbreak case MP_Navigate // URL EditでEnterキーが押された gosub *CMD_NAVIGATE swbreak case MP_Search // Search EditでEnterキーが押された // *TAB_ADD の挙動参考 if ( bAdd ){ return } bAdd = 1 gosub *TAB_ADD2 gosub *EVENT_SET gosub *TAB_SELECT ;bufTmp = DEF_URL ;SetWindowTextA hEditUrl, varptr(bufTmp) // URL Editに userSearchEngineQuery+検索ワード を設定 p1 = (GetWindowTextLengthW(hEditSearch) + 1) * 2 sdim bufTmp, p1 GetWindowTextW hEditSearch, varptr(bufTmp), p1 ;sdim bufSearchText,512 ;GetWindowTextW hEditSearch, varptr.bufSearchText, 512 sdim bufTmpUni,256 : cnvstow bufTmpUni, userSearchEngineQuery sdim bufTmp2, p1 + lstrlenW(userSearchEngineQuery) + 2 lstrcatW varptr(bufTmp2),varptr(bufTmpUni) lstrcatW varptr(bufTmp2),varptr(bufTmp) bufTmpUni = bufTmpUni + bufTmp SetWindowTextW hEditUrl, varptr.bufTmp2 gosub *CMD_NAVIGATE ; 検索ワードでNAVIGATEされる bAdd = 0 swbreak swend return /* --------------------------------------------------------- マウスフック --------------------------------------------------------- */ *onMouseHook dupptr MSLLHOOKSTRUCT, lparam, 5*4 switch wparam case 0x0201/*WM_LBUTTONDOWN*/ : lbdTabMove = 1 tabMoveMouseXY = ginfo_mx, ginfo_my, 0 case 0x0203/*WM_LBUTTONDBLCLK*/ : MyPost MP_Bomb ; 爆発!! gosub *StartMouseMoveDetection swbreak case 0x0202/*WM_LBUTTONUP*/ : lbdTabMove = 0 swbreak case 0x0204/*WM_RBUTTONDOWN*/ : if tGTimer()-rUpTime > 50 : MyPost MP_Bomb ; なんか2回爆発する。抑制。 swbreak case 0x0205/*WM_RBUTTONUP*/ : rUpTime = tGTimer() swbreak case 0x0207/*WM_MBUTTONDOWN*/ : MyPost MP_TabDelMclick case 0x0209/*WM_MBUTTONDBLCLK*/ : MyPost MP_Bomb swbreak swend return // Tab入れ替え操作の為のMouseMove解析 *StartMouseMoveDetection timer_repeat 16 ;logmes "tabMove :"+seqTabMove+" _ "+timer_cnt if seqTabMove == 0 { if lbdTabMove == 0 : timer_break MyPost MP_TabMoveStartCheck ; 移動量チェック。タブ移動状態に遷移したらseqTabMove==1になる }else { if lbdTabMove == 1 { MyPost MP_TabMoveFollowing ; タブ移動中処理 }else { MyPost MP_TabMoveEnd ; タブ移動終了 seqTabMove = 0 timer_break } } timer_loop tid_MouseMoveDetection = stat return /* --------------------------------------------------------- ホットキー --------------------------------------------------------- */ // 登録 *RegistHotkey RegisterHotKey hWnd0, MYHOTKEY_NewWindow, MOD_CONTROL | MOD_NOREPEAT, 'N' RegisterHotKey hWnd0, MYHOTKEY_NewTab, MOD_CONTROL | MOD_NOREPEAT, 'T' RegisterHotKey hWnd0, MYHOTKEY_NextTab1, MOD_CONTROL | MOD_NOREPEAT, 0x09/*VK_TAB*/ RegisterHotKey hWnd0, MYHOTKEY_NextTab2, MOD_CONTROL | MOD_NOREPEAT, 0x22/*VK_NEXT*/ RegisterHotKey hWnd0, MYHOTKEY_PreviousTab1, MOD_SHIFT | MOD_CONTROL | MOD_NOREPEAT, 0x09/*VK_TAB*/ RegisterHotKey hWnd0, MYHOTKEY_PreviousTab2, MOD_CONTROL | MOD_NOREPEAT, 0x21/*VK_PRIOR*/ RegisterHotKey hWnd0, MYHOTKEY_OpenTab1, MOD_CONTROL | MOD_NOREPEAT, '1' RegisterHotKey hWnd0, MYHOTKEY_OpenTab2, MOD_CONTROL | MOD_NOREPEAT, '2' RegisterHotKey hWnd0, MYHOTKEY_OpenTab3, MOD_CONTROL | MOD_NOREPEAT, '3' RegisterHotKey hWnd0, MYHOTKEY_OpenTab4, MOD_CONTROL | MOD_NOREPEAT, '4' RegisterHotKey hWnd0, MYHOTKEY_OpenTab5, MOD_CONTROL | MOD_NOREPEAT, '5' RegisterHotKey hWnd0, MYHOTKEY_OpenTab6, MOD_CONTROL | MOD_NOREPEAT, '6' RegisterHotKey hWnd0, MYHOTKEY_OpenTab7, MOD_CONTROL | MOD_NOREPEAT, '7' RegisterHotKey hWnd0, MYHOTKEY_OpenTab8, MOD_CONTROL | MOD_NOREPEAT, '8' RegisterHotKey hWnd0, MYHOTKEY_OpenLastTab, MOD_CONTROL | MOD_NOREPEAT, '9' RegisterHotKey hWnd0, MYHOTKEY_OpenHomepage, MOD_ALT | MOD_NOREPEAT, 0x24/*VK_HOME*/ RegisterHotKey hWnd0, MYHOTKEY_GoBack, MOD_ALT | MOD_NOREPEAT, 0x25/*VK_LEFT*/ RegisterHotKey hWnd0, MYHOTKEY_GoForward, MOD_ALT | MOD_NOREPEAT, 0x27/*VK_RIGHT*/ RegisterHotKey hWnd0, MYHOTKEY_CloseTab1, MOD_CONTROL | MOD_NOREPEAT, 'W' RegisterHotKey hWnd0, MYHOTKEY_CloseTab2, MOD_CONTROL | MOD_NOREPEAT, 0x73/*VK_F4*/ RegisterHotKey hWnd0, MYHOTKEY_CloseApp, MOD_SHIFT | MOD_CONTROL | MOD_NOREPEAT, 'W' RegisterHotKey hWnd0, MYHOTKEY_MoveTabLeft, MOD_SHIFT | MOD_CONTROL | MOD_NOREPEAT, 0x21/*VK_PRIOR*/ RegisterHotKey hWnd0, MYHOTKEY_MoveTabRight, MOD_SHIFT | MOD_CONTROL | MOD_NOREPEAT, 0x22/*VK_NEXT*/ return // 解除 *UnregistHotkey repeat MYHOTKEY_MAX_ID - 1, 1 UnregisterHotKey hWnd0, cnt loop return // 実行 *onHOTKEY logmes "lp="+((lparam>>16)&$FFFF)+", "+(lparam&$FFFF)+" wp="+wparam switch wparam case MYHOTKEY_NewWindow exec dir_exe+"\\InternetExplosion.exe" swbreak case MYHOTKEY_NewTab gosub *CMD_NEW_TAB swbreak case MYHOTKEY_NextTab1 case MYHOTKEY_NextTab2 gosub *CMD_NEXT_TAB swbreak case MYHOTKEY_PreviousTab1 case MYHOTKEY_PreviousTab2 gosub *CMD_PREVIOUS_TAB swbreak case MYHOTKEY_OpenTab1 Cmd_OpenTabN 1 swbreak case MYHOTKEY_OpenTab2 Cmd_OpenTabN 2 swbreak case MYHOTKEY_OpenTab3 Cmd_OpenTabN 3 swbreak case MYHOTKEY_OpenTab4 Cmd_OpenTabN 4 swbreak case MYHOTKEY_OpenTab5 Cmd_OpenTabN 5 swbreak case MYHOTKEY_OpenTab6 Cmd_OpenTabN 6 swbreak case MYHOTKEY_OpenTab7 Cmd_OpenTabN 7 swbreak case MYHOTKEY_OpenTab8 Cmd_OpenTabN 8 swbreak case MYHOTKEY_OpenLastTab Cmd_OpenTabN 0 swbreak case MYHOTKEY_OpenHomepage bufTmp = DEF_URL : if bufTmp == "" : bufTmp = userSearchEngineUrl SetWindowTextA hEditUrl, varptr(bufTmp) gosub *CMD_NAVIGATE swbreak case MYHOTKEY_GoBack gosub *CMD_BACK swbreak case MYHOTKEY_GoForward gosub *CMD_FORWARD swbreak case MYHOTKEY_CloseTab1 gosub *CMD_DEL_NOWTAB swbreak case MYHOTKEY_CloseTab2 gosub *CMD_DEL_NOWTAB swbreak case MYHOTKEY_CloseApp gosub *quit swbreak case MYHOTKEY_MoveTabLeft sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat <= 0 ){ return } oli = stat Tab_Replace oli, oli-1 iTab = oli-1 sendmsg hTab, TCM_SETCURSEL, iTab, 0 gosub *TAB_SELECT swbreak case MYHOTKEY_MoveTabRight sendmsg hTab, TCM_GETITEMCOUNT, 0, 0 : numTab = stat sendmsg hTab, TCM_GETCURSEL, 0, 0 if ( stat == -1 ){ return } if ( stat+1 >= numTab ){ return } oli = stat Tab_Replace oli, oli+1 iTab = oli+1 sendmsg hTab, TCM_SETCURSEL, iTab, 0 gosub *TAB_SELECT swbreak swend return /* --------------------------------------------------------- WM_ACTIVE (アクティブ、非アクティブでタイトルバー下の背景色を塗り替える) --------------------------------------------------------- */ *onACTIVE if(wparam == 0){ ; 非アクティブ isActive = -1 color colorrefInactiveWindow&0xFF,(colorrefInactiveWindow>>8)&0xFF,(colorrefInactiveWindow>>16)&0xFF : boxf sendmsg hTab, TCM_GETCURSEL, 0, 0 : SetSlitTabCover stat gosub *UnregistHotkey }else { ; アクティブ isActive = 0 color colorrefActiveWindow&0xFF,(colorrefActiveWindow>>8)&0xFF,(colorrefActiveWindow>>16)&0xFF : boxf sendmsg hTab, TCM_GETCURSEL, 0, 0 : SetSlitTabCover stat gosub *RegistHotkey } return /* --------------------------------------------------------- WM_DISPLAYCHANGE (ディスプレイの解像度/色数が変化した時) --------------------------------------------------------- */ *onDISPLAYCHANGE // 何か必要になれば実装 /* horizontal = lparam & $FFFF vertical = lparam >> 16 & $FFFF logmes "解像度 ("+horizontal+" x "+vertical+" ピクセル)" logmes "色数 ("+wparam+" ビット)" */ return /* --------------------------------------------------------- サブクラス化してEditの入力を監視 --------------------------------------------------------- */ *EditSearchKeyProc dupptr msg,lparam,wparam*4,4 if msg.1 == 0x0102/*WM_CHAR*/ : if msg.2 == 13/*VK_RETURN*/ : MyPost MP_Search : return 0 ; Enterを握りつぶして音を鳴らさない if msg.1 == 0x0007/*WM_SETFOCUS*/ : PostMessage hEditSearch, $00B1/*EM_SETSEL*/, 0, -1 return CallWindowProc(defEditSearchProc,msg.0,msg.1,msg.2,msg.3) *EditUrlKeyProc dupptr msg,lparam,wparam*4,4 if msg.1 == 0x0102/*WM_CHAR*/ : if msg.2 == 13/*VK_RETURN*/ : MyPost MP_Navigate : return 0 ; Enterを握りつぶして音を鳴らさない if msg.1 == 0x0007/*WM_SETFOCUS*/ : PostMessage hEditUrl, $00B1/*EM_SETSEL*/, 0, -1 return CallWindowProc(defEditUrlProc,msg.0,msg.1,msg.2,msg.3) /* --------------------------------------------------------- WM_TIMER(メニュー中も無理やり爆発を動かすため) --------------------------------------------------------- */ *onTimer timer_fire 0 ; timer_repeatを無理やり実行。メニューを開くとメイン処理が止まるのでTimerで叩く return *quit KillTimer hWnd0,0 ; 念のためタイマー止める DestroyMenu hPopMenu ; どこのウィンドウにも張り付いていないメニューは明示的に破棄 DestroyMenu hPopTabMenu SetWindowLong hEditUrl, -4/*GWL_WNDPROC*/, defEditUrlProc ; Editのサブクラス化を解除 SetWindowLong hEditSearch, -4/*GWL_WNDPROC*/, defEditSearchProc ; destroy_FaviconList ; favicon用イメージリストを破棄 mhUnhook ; フックの終了 gosub *UnregistHotkey gosub *iniSave ; 設定保存 gosub *BOMB0 ; 終わりボム return //end ; 終わりボム内でendさせている //return