• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

MIDITrail をピカピカにする。鍵盤方向自動切替・多ポート・歌詞対応等


Commit MetaInfo

Revision0e7d12d8b69b96e81a0a4769106bb6e2c986e5a4 (tree)
Time2019-08-28 05:14:27
Authoryoshy <yoshy@user...>
Commiteryoshy

Log Message

[UPGRADE] original 1.2.6

Change Summary

Incremental Difference

--- a/MIDITrail/DXRenderer.cpp
+++ b/MIDITrail/DXRenderer.cpp
@@ -39,7 +39,8 @@ DXRenderer::~DXRenderer()
3939 //******************************************************************************
4040 int DXRenderer::Initialize(
4141 HWND hWnd,
42- unsigned long multiSampleType //省略時はゼロ:アンチエイリアシング無効
42+ unsigned long multiSampleType, //省略時はゼロ:アンチエイリアシング無効
43+ bool isFullScreen //省略時はfalse:フルスクリーン無効
4344 )
4445 {
4546 int result = 0;
@@ -48,9 +49,17 @@ int DXRenderer::Initialize(
4849 bool isSupport = false;
4950 D3DMULTISAMPLE_TYPE type = D3DMULTISAMPLE_NONE;
5051 unsigned long qualityLevels = 0;
52+ BOOL apiresult = FALSE;
53+ RECT windowRect;
5154
5255 m_hWnd = hWnd;
5356
57+ apiresult = GetWindowRect(m_hWnd, &windowRect);
58+ if (!apiresult) {
59+ result = YN_SET_ERR("Windows API error.", GetLastError(), 0);
60+ goto EXIT;
61+ }
62+
5463 if (DX_MULTI_SAMPLE_TYPE_MAX < multiSampleType) {
5564 result = YN_SET_ERR("Program error.", multiSampleType, 0);
5665 goto EXIT;
@@ -81,6 +90,11 @@ int DXRenderer::Initialize(
8190 m_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; //ダブルバッファリングスワップ指定
8291 m_D3DPP.EnableAutoDepthStencil = TRUE; //深度ステンシルバッファ作成
8392 m_D3DPP.AutoDepthStencilFormat = D3DFMT_D16; //自動深度ステンシルサーフェスフォーマット
93+ if (isFullScreen) {
94+ m_D3DPP.Windowed = FALSE; //ウインドウ内表示の指定
95+ m_D3DPP.BackBufferWidth = windowRect.right - windowRect.left; //バッファサイズ
96+ m_D3DPP.BackBufferHeight = windowRect.bottom - windowRect.top; //バッファサイズ
97+ }
8498
8599 //アンチエイリアシング有効化
86100 if (multiSampleType >= DX_MULTI_SAMPLE_TYPE_MIN) {
--- a/MIDITrail/DXRenderer.h
+++ b/MIDITrail/DXRenderer.h
@@ -4,7 +4,7 @@
44 //
55 // レンダラクラス
66 //
7-// Copyright (C) 2010-2012 WADA Masashi. All Rights Reserved.
7+// Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
88 //
99 //******************************************************************************
1010
@@ -39,7 +39,7 @@ public:
3939 public:
4040
4141 //初期化
42- int Initialize(HWND hWnd, unsigned long multiSampleType = 0);
42+ int Initialize(HWND hWnd, unsigned long multiSampleType = 0, bool isFullScreen = false);
4343
4444 //デバイス取得
4545 LPDIRECT3DDEVICE9 GetDevice();
--- a/MIDITrail/MIDITrail.rc
+++ b/MIDITrail/MIDITrail.rc
@@ -82,6 +82,7 @@ BEGIN
8282 MENUITEM "Viewpoint 3\t9", IDM_VIEWPOINT3
8383 MENUITEM SEPARATOR
8484 MENUITEM "Window size...", IDM_WINDOWSIZE
85+ MENUITEM "Full Screen\tF11", IDM_FULLSCREEN
8586 END
8687 POPUP "Option"
8788 BEGIN
--- a/MIDITrail/MIDITrail.vcxproj
+++ b/MIDITrail/MIDITrail.vcxproj
@@ -110,7 +110,7 @@
110110 <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
111111 </ClCompile>
112112 <Link>
113- <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
113+ <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;XInput.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
114114 <AdditionalLibraryDirectories>$(SolutionDir)\bin\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
115115 <GenerateDebugInformation>true</GenerateDebugInformation>
116116 <SubSystem>Windows</SubSystem>
@@ -133,7 +133,7 @@
133133 <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
134134 </ClCompile>
135135 <Link>
136- <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
136+ <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;XInput.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
137137 <AdditionalLibraryDirectories>$(SolutionDir)\x64\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
138138 <GenerateDebugInformation>true</GenerateDebugInformation>
139139 <SubSystem>Windows</SubSystem>
@@ -154,7 +154,7 @@
154154 </ClCompile>
155155 <Link>
156156 <AdditionalOptions>/PDBALTPATH:%_PDB% %(AdditionalOptions)</AdditionalOptions>
157- <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
157+ <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;XInput.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
158158 <AdditionalLibraryDirectories>$(SolutionDir)\bin\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
159159 <GenerateDebugInformation>true</GenerateDebugInformation>
160160 <SubSystem>Windows</SubSystem>
@@ -180,7 +180,7 @@
180180 </ClCompile>
181181 <Link>
182182 <AdditionalOptions>/PDBALTPATH:%_PDB% %(AdditionalOptions)</AdditionalOptions>
183- <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
183+ <AdditionalDependencies>dxerr.lib;dxguid.lib;d3dx9.lib;d3d9.lib;dinput8.lib;winmm.lib;XInput.lib;SMIDILib.lib;YNBaseLib.lib;imagehlp.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
184184 <AdditionalLibraryDirectories>$(SolutionDir)\x64\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
185185 <GenerateDebugInformation>true</GenerateDebugInformation>
186186 <SubSystem>Windows</SubSystem>
@@ -218,6 +218,7 @@
218218 <ClCompile Include="MTFirstPersonCam.cpp" />
219219 <ClCompile Include="MTFont2Bmp.cpp" />
220220 <ClCompile Include="MTFontTexture.cpp" />
221+ <ClCompile Include="MTGamePadCtrl.cpp" />
221222 <ClCompile Include="MTGraphicCfgDlg.cpp" />
222223 <ClCompile Include="MTGridBox.cpp" />
223224 <ClCompile Include="MTGridBoxLive.cpp" />
@@ -282,6 +283,7 @@
282283 <ClInclude Include="MTFirstPersonCam.h" />
283284 <ClInclude Include="MTFont2Bmp.h" />
284285 <ClInclude Include="MTFontTexture.h" />
286+ <ClInclude Include="MTGamePadCtrl.h" />
285287 <ClInclude Include="MTGraphicCfgDlg.h" />
286288 <ClInclude Include="MTGridBox.h" />
287289 <ClInclude Include="MTGridBoxLive.h" />
--- a/MIDITrail/MIDITrail.vcxproj.filters
+++ b/MIDITrail/MIDITrail.vcxproj.filters
@@ -32,6 +32,9 @@
3232 <Filter Include="Sources\Dialog">
3333 <UniqueIdentifier>{0346b7cc-b30c-4603-870f-2f75d5d335ed}</UniqueIdentifier>
3434 </Filter>
35+ <Filter Include="Sources\XInputUtility">
36+ <UniqueIdentifier>{d054de01-6c08-4761-ae2f-dacf689ea8ea}</UniqueIdentifier>
37+ </Filter>
3538 </ItemGroup>
3639 <ItemGroup>
3740 <Image Include="MIDITrail.ico">
@@ -215,6 +218,9 @@
215218 <ClCompile Include="MTWindowSizeCfgDlg.cpp">
216219 <Filter>Sources\Dialog</Filter>
217220 </ClCompile>
221+ <ClCompile Include="MTGamePadCtrl.cpp">
222+ <Filter>Sources\XInputUtility</Filter>
223+ </ClCompile>
218224 </ItemGroup>
219225 <ItemGroup>
220226 <ClInclude Include="MIDITrailApp.h">
@@ -397,5 +403,8 @@
397403 <ClInclude Include="MTWindowSizeCfgDlg.h">
398404 <Filter>Sources\Dialog</Filter>
399405 </ClInclude>
406+ <ClInclude Include="MTGamePadCtrl.h">
407+ <Filter>Sources\XInputUtility</Filter>
408+ </ClInclude>
400409 </ItemGroup>
401410 </Project>
\ No newline at end of file
--- a/MIDITrail/MIDITrailApp.cpp
+++ b/MIDITrail/MIDITrailApp.cpp
@@ -49,6 +49,8 @@ MIDITrailApp::MIDITrailApp(void)
4949 m_Accel = NULL;
5050 m_Title[0] = _T('\0');
5151 m_WndClassName[0] = _T('\0');
52+ m_isFullScreen = false;
53+ m_hMenu = NULL;
5254
5355 //レンダリング系
5456 m_pScene = NULL;
@@ -96,6 +98,9 @@ MIDITrailApp::MIDITrailApp(void)
9698
9799 //次回オープン対象ファイルパス
98100 m_NextFilePath[0] = _T('\0');
101+
102+ //ゲームパッド用視点番号
103+ m_GamePadViewPointNo = 0;
99104 }
100105
101106 //******************************************************************************
@@ -214,6 +219,10 @@ int MIDITrailApp::Initialize(
214219 result = _StartTimer();
215220 if (result != 0) goto EXIT;
216221
222+ //ゲームパッド制御:ユーザインデックス0固定
223+ result = m_GamePadCtrl.Initialize(0);
224+ if (result != 0) goto EXIT;
225+
217226 EXIT:;
218227 return result;
219228 }
@@ -288,6 +297,13 @@ int MIDITrailApp::Run()
288297 if (result != 0) {
289298 YN_SHOW_ERR(m_hWnd);
290299 }
300+
301+ //ゲームパッド操作処理
302+ result = _GamePadProc();
303+ if (result != 0) {
304+ YN_SHOW_ERR(m_hWnd);
305+ }
306+
291307 //ウィンドウ表示状態でのみ描画を行う
292308 GetWindowPlacement(m_hWnd, &wndpl);
293309 if ((wndpl.showCmd != SW_HIDE) &&
@@ -343,7 +359,7 @@ int MIDITrailApp::_RegisterClass(
343359 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MIDITRAIL));
344360 //アイコンリソースハンドル
345361 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルリソースハンドル
346- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景用ブラシハンドル
362+ wcex.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); //背景用ブラシハンドル:黒
347363 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MIDITRAIL); //メニューリソース名称
348364 wcex.lpszClassName = m_WndClassName; //ウィンドウクラス名称
349365 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
@@ -390,6 +406,9 @@ int MIDITrailApp::_CreateWindow(
390406 result = YN_SET_ERR("Windows API error.", GetLastError(), 0);
391407 goto EXIT;
392408 }
409+
410+ //メニューバー表示切替のためウィンドウ生成直後にハンドルを取得しておく
411+ m_hMenu = GetMenu(m_hWnd);
393412
394413 //ユーザー設定ウィンドウサイズ変更
395414 result = _SetWindowSize();
@@ -419,6 +438,12 @@ int MIDITrailApp::_SetWindowSize()
419438 RECT wrect, crect;
420439 int ww, wh, cw, ch, framew, frameh;
421440 int applyToViewArea = 0;
441+ LONG apiresult = 0;
442+
443+ if (m_isFullScreen) {
444+ result = _SetWindowSizeFullScreen();
445+ goto EXIT;
446+ }
422447
423448 //ユーザ選択ウィンドウサイズ取得
424449 result = m_ViewConf.SetCurSection(_T("WindowSize"));
@@ -455,7 +480,18 @@ int MIDITrailApp::_SetWindowSize()
455480 width = width + framew;
456481 height = height + frameh;
457482 }
458-
483+
484+ //ウィンドウスタイル設定
485+ apiresult = SetWindowLong(m_hWnd, GWL_STYLE, MIDITRAIL_WINDOW_STYLE);
486+ if (apiresult == 0) {
487+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
488+ goto EXIT;
489+ }
490+
491+ //メニューバー表示
492+ result = _ShowMenu();
493+ if (result != 0) goto EXIT;
494+
459495 //ウィンドウサイズ変更
460496 bresult = SetWindowPos(
461497 m_hWnd, //ウィンドウハンドル
@@ -464,7 +500,73 @@ int MIDITrailApp::_SetWindowSize()
464500 0, //縦方向の位置
465501 width, //幅
466502 height, //高さ
467- SWP_NOMOVE //ウィンドウ位置指定
503+ SWP_NOMOVE | SWP_FRAMECHANGED | SWP_SHOWWINDOW //ウィンドウ位置指定
504+ );
505+ if (!bresult) {
506+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
507+ goto EXIT;
508+ }
509+
510+EXIT:;
511+ return result;
512+}
513+
514+//******************************************************************************
515+// ウィンドウサイズ変更:フルスクリーン
516+//******************************************************************************
517+int MIDITrailApp::_SetWindowSizeFullScreen()
518+{
519+ int result = 0;
520+ BOOL bresult = FALSE;
521+ LONG apiresult = 0;
522+ POINT mouseCursorPoint;
523+ HMONITOR hMonitor = NULL;
524+ MONITORINFOEX monitorInfo;
525+ int width = 0;
526+ int height = 0;
527+
528+ //マウスカーソル位置を取得
529+ bresult = GetCursorPos(&mouseCursorPoint);
530+ if (!bresult) {
531+ result = YN_SET_ERR("Windows API error.", GetLastError(), 0);
532+ goto EXIT;
533+ }
534+
535+ //マウスカーソルの位置に該当するモニタを選択
536+ hMonitor = MonitorFromPoint(mouseCursorPoint, MONITOR_DEFAULTTONEAREST);
537+
538+ //モニタ情報取得
539+ monitorInfo.cbSize = sizeof(MONITORINFOEX);
540+ bresult = GetMonitorInfo(hMonitor, &monitorInfo);
541+ if (!bresult) {
542+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)hMonitor);
543+ goto EXIT;
544+ }
545+
546+ //ウィンドウ縦横サイズ
547+ width = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left;
548+ height = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;
549+
550+ //ウィンドウスタイル設定
551+ apiresult = SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP);
552+ if (apiresult == 0) {
553+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
554+ goto EXIT;
555+ }
556+
557+ //メニューバー非表示
558+ result = _HideMenu();
559+ if (result != 0) goto EXIT;
560+
561+ //ウィンドウサイズ変更
562+ bresult = SetWindowPos(
563+ m_hWnd, //ウィンドウハンドル
564+ HWND_TOP, //配置順序:Zオーダー先頭
565+ monitorInfo.rcMonitor.left, //横方向の位置
566+ monitorInfo.rcMonitor.top, //縦方向の位置
567+ width, //幅
568+ height, //高さ
569+ SWP_FRAMECHANGED | SWP_SHOWWINDOW //ウィンドウ位置指定
468570 );
469571 if (!bresult) {
470572 result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
@@ -626,31 +728,6 @@ LRESULT MIDITrailApp::_WndProcImpl(
626728 if (result != 0) goto EXIT;
627729 break;
628730 //TAG: シーン追加
629- case IDM_AUTO_SAVE_VIEWPOINT:
630- //自動視点保存
631- result = _OnMenuAutoSaveViewpoint();
632- if (result != 0) goto EXIT;
633- break;
634- case IDM_SAVE_VIEWPOINT:
635- //視点保存
636- result = _OnMenuSaveViewpoint();
637- if (result != 0) goto EXIT;
638- break;
639- case IDM_RESET_VIEWPOINT:
640- //視点リセット
641- result = _OnMenuResetViewpoint();
642- if (result != 0) goto EXIT;
643- break;
644- case IDM_VIEWPOINT2:
645- //静的視点2に移動
646- result = _OnMenuViewpoint(2);
647- if (result != 0) goto EXIT;
648- break;
649- case IDM_VIEWPOINT3:
650- //静的視点3に移動
651- result = _OnMenuViewpoint(3);
652- if (result != 0) goto EXIT;
653- break;
654731 case IDM_ENABLE_PIANOKEYBOARD:
655732 //表示効果:ピアノキーボード
656733 result = _OnMenuEnableEffect(MTScene::EffectPianoKeyboard);
@@ -681,11 +758,42 @@ LRESULT MIDITrailApp::_WndProcImpl(
681758 result = _OnMenuEnableEffect(MTScene::EffectBackgroundImage);
682759 if (result != 0) goto EXIT;
683760 break;
761+ //自動視点保存と視点保存は廃止
762+ //case IDM_AUTO_SAVE_VIEWPOINT:
763+ // //自動視点保存
764+ // result = _OnMenuAutoSaveViewpoint();
765+ // if (result != 0) goto EXIT;
766+ // break;
767+ //case IDM_SAVE_VIEWPOINT:
768+ // //視点保存
769+ // result = _OnMenuSaveViewpoint();
770+ // if (result != 0) goto EXIT;
771+ // break;
772+ case IDM_RESET_VIEWPOINT:
773+ //静的視点1に移動(視点リセット)
774+ result = _OnMenuResetViewpoint();
775+ if (result != 0) goto EXIT;
776+ break;
777+ case IDM_VIEWPOINT2:
778+ //静的視点2に移動
779+ result = _OnMenuViewpoint(2);
780+ if (result != 0) goto EXIT;
781+ break;
782+ case IDM_VIEWPOINT3:
783+ //静的視点3に移動
784+ result = _OnMenuViewpoint(3);
785+ if (result != 0) goto EXIT;
786+ break;
684787 case IDM_WINDOWSIZE:
685788 //ウィンドウサイズ設定
686789 result = _OnMenuWindowSize();
687790 if (result != 0) goto EXIT;
688791 break;
792+ case IDM_FULLSCREEN:
793+ //フルスクリーン
794+ result = _OnMenuFullScreen();
795+ if (result != 0) goto EXIT;
796+ break;
689797 case IDM_OPTION_MIDIOUT:
690798 //MIDI出力デバイス設定
691799 result = _OnMenuOptionMIDIOUT();
@@ -735,6 +843,10 @@ LRESULT MIDITrailApp::_WndProcImpl(
735843 result = _OnMouseButtonDown(message, wParam, lParam);
736844 if (result != 0) goto EXIT;
737845 break;
846+ case WM_MOUSEMOVE:
847+ result = _OnMouseMove(message, wParam, lParam);
848+ if (result != 0) goto EXIT;
849+ break;
738850 case WM_DROPFILES:
739851 //ファイルドロップ
740852 result = _OnDropFiles(wParam, lParam);
@@ -756,6 +868,14 @@ LRESULT MIDITrailApp::_WndProcImpl(
756868 result = _OnFilePathPosted();
757869 if (result != 0) goto EXIT;
758870 break;
871+ case WM_SIZE:
872+ //ウィンドウサイズ変更
873+ if (wParam == SIZE_MAXIMIZED) {
874+ //最大化:フルスクリーン
875+ result = _OnMenuFullScreen();
876+ if (result != 0) goto EXIT;
877+ }
878+ break;
759879 default:
760880 lresult = DefWindowProc(hWnd, message, wParam, lParam);
761881 break;
@@ -794,6 +914,13 @@ int MIDITrailApp::_OnMenuFileOpen()
794914
795915 //ファイル選択時の処理
796916 if (isSelected) {
917+ //フルスクリーンでメニューからファイル選択した場合
918+ // シーン生成処理でクライアントウィンドウのサイズを参照しているため
919+ // 一時的に表示したメニューを非表示に戻しておく
920+ if (m_isFullScreen) {
921+ _HideMenu();
922+ }
923+
797924 //演奏/モニタ停止とファイルオープン処理
798925 result = _StopPlaybackAndOpenFile(filePath);
799926 if (result != 0) goto EXIT;
@@ -1287,6 +1414,21 @@ EXIT:;
12871414 }
12881415
12891416 //******************************************************************************
1417+// メニュー選択:フルスクリーン
1418+//******************************************************************************
1419+int MIDITrailApp::_OnMenuFullScreen()
1420+{
1421+ int result = 0;
1422+
1423+ //フルスクリーン切替
1424+ result = _ToggleFullScreen();
1425+ if (result != 0) goto EXIT;
1426+
1427+EXIT:;
1428+ return result;
1429+}
1430+
1431+//******************************************************************************
12901432 // メニュー選択:MIDI出力デバイス設定
12911433 //******************************************************************************
12921434 int MIDITrailApp::_OnMenuOptionMIDIOUT()
@@ -1524,11 +1666,46 @@ int MIDITrailApp::_OnMouseButtonDown(
15241666 )
15251667 {
15261668 int result = 0;
1527-
1669+
15281670 if ((m_pScene != NULL) && (m_PlayStatus != NoData)) {
15291671 result = m_pScene->OnWindowClicked(button, wParam, lParam);
15301672 if (result != 0) goto EXIT;
15311673 }
1674+
1675+EXIT:;
1676+ return result;
1677+}
1678+
1679+//******************************************************************************
1680+// マウス移動イベント
1681+//******************************************************************************
1682+int MIDITrailApp::_OnMouseMove(
1683+ UINT button,
1684+ WPARAM wParam,
1685+ LPARAM lParam
1686+ )
1687+{
1688+ int result = 0;
1689+ LONG apiresult = 0;
1690+ POINT point;
1691+
1692+ point.x = LOWORD(lParam);
1693+ point.y = HIWORD(lParam);
1694+
1695+ //フルスクリーンの場合
1696+ if (m_isFullScreen) {
1697+ //マウスカーソルがスクリーン上端に移動した場合
1698+ if (point.y == 0) {
1699+ //メニューバー表示
1700+ result = _ShowMenu();
1701+ if (result != 0) goto EXIT;
1702+ }
1703+ else {
1704+ //メニューバー非表示
1705+ result = _HideMenu();
1706+ if (result != 0) goto EXIT;
1707+ }
1708+ }
15321709
15331710 EXIT:;
15341711 return result;
@@ -1629,6 +1806,13 @@ int MIDITrailApp::_OnKeyDown(
16291806 if (result != 0) goto EXIT;
16301807 }
16311808 break;
1809+ case VK_F11:
1810+ //フルスクリーン
1811+ result = _OnMenuFullScreen();
1812+ if (result != 0) goto EXIT;
1813+ break;
1814+ default:
1815+ break;
16321816 }
16331817
16341818 EXIT:;
@@ -2038,16 +2222,17 @@ int MIDITrailApp::_ChangeMenuStyle()
20382222 IDM_VIEW_2DPIANOROLL,
20392223 IDM_VIEW_PIANOROLLRAIN,
20402224 IDM_VIEW_PIANOROLLRAIN2D,
2041- IDM_RESET_VIEWPOINT,
2042- IDM_VIEWPOINT2,
2043- IDM_VIEWPOINT3,
20442225 IDM_ENABLE_PIANOKEYBOARD,
20452226 IDM_ENABLE_RIPPLE,
20462227 IDM_ENABLE_PITCHBEND,
20472228 IDM_ENABLE_STARS,
20482229 IDM_ENABLE_COUNTER,
20492230 IDM_ENABLE_BACKGROUNDIMAGE,
2231+ IDM_RESET_VIEWPOINT,
2232+ IDM_VIEWPOINT2,
2233+ IDM_VIEWPOINT3,
20502234 IDM_WINDOWSIZE,
2235+ IDM_FULLSCREEN,
20512236 IDM_OPTION_MIDIOUT,
20522237 IDM_OPTION_MIDIIN,
20532238 IDM_OPTION_GRAPHIC,
@@ -2074,16 +2259,17 @@ int MIDITrailApp::_ChangeMenuStyle()
20742259 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_2DPIANOROLL
20752260 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_PIANOROLLRAIN
20762261 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_PIANOROLLRAIN2D
2077- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT
2078- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT2
2079- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT3
20802262 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PIANOKEYBOARD
20812263 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_RIPPLE
20822264 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PITCHBEND
20832265 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_STARS
20842266 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_COUNTER
20852267 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_BACKGROUNDIMAGE
2268+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT
2269+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT2
2270+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT3
20862271 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_WINDOWSIZE
2272+ { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_FULLSCREEN
20872273 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_MIDIOUT
20882274 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_MIDIIN
20892275 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_GRAPHIC
@@ -2705,6 +2891,9 @@ int MIDITrailApp::_UpdateMenuCheckmark()
27052891 //自動視点保存
27062892 _CheckMenuItem(IDM_AUTO_SAVE_VIEWPOINT, m_isAutoSaveViewpoint);
27072893
2894+ //フルスクリーン
2895+ _CheckMenuItem(IDM_FULLSCREEN, m_isFullScreen);
2896+
27082897 EXIT:;
27092898 return result;
27102899 }
@@ -3300,3 +3489,174 @@ EXIT:;
33003489 return result;
33013490 }
33023491
3492+//******************************************************************************
3493+// フルスクリーン切替
3494+//******************************************************************************
3495+int MIDITrailApp::_ToggleFullScreen()
3496+{
3497+ int result = 0;
3498+
3499+ m_isFullScreen = m_isFullScreen ? false : true;
3500+
3501+ result = _ChangeWindowSize();
3502+ if (result != 0) goto EXIT;
3503+
3504+EXIT:;
3505+ return result;
3506+}
3507+
3508+//******************************************************************************
3509+// メニュー表示
3510+//******************************************************************************
3511+int MIDITrailApp::_ShowMenu()
3512+{
3513+ int result = 0;
3514+ LONG apiresult = 0;
3515+
3516+ //メニューバー表示処理
3517+ if (GetMenu(m_hWnd) == NULL) {
3518+ apiresult = SetMenu(m_hWnd, m_hMenu);
3519+ if (apiresult == 0) {
3520+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
3521+ goto EXIT;
3522+ }
3523+ }
3524+
3525+ //メニュー選択マーク更新
3526+ result = _UpdateMenuCheckmark();
3527+ if (result != 0) goto EXIT;
3528+
3529+ //メニュースタイル更新
3530+ result = _ChangeMenuStyle();
3531+ if (result != 0) goto EXIT;
3532+
3533+EXIT:;
3534+ return result;
3535+}
3536+
3537+//******************************************************************************
3538+// メニュー非表示
3539+//******************************************************************************
3540+int MIDITrailApp::_HideMenu()
3541+{
3542+ int result = 0;
3543+ LONG apiresult = 0;
3544+
3545+ //メニューバー非表示処理
3546+ //すでにメニューバー非表示なら何もしない
3547+ if (GetMenu(m_hWnd) != NULL) {
3548+ //GetMenuで取得したハンドルは破棄されない
3549+ apiresult = SetMenu(m_hWnd, NULL);
3550+ if (apiresult == 0) {
3551+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
3552+ goto EXIT;
3553+ }
3554+ }
3555+
3556+EXIT:;
3557+ return result;
3558+}
3559+
3560+//******************************************************************************
3561+// ゲームパッド操作処理
3562+//******************************************************************************
3563+int MIDITrailApp::_GamePadProc()
3564+{
3565+ int result = 0;
3566+
3567+ result = m_GamePadCtrl.UpdateState();
3568+ if (result != 0) goto EXIT;
3569+
3570+ //_RPTN(_CRT_WARN, "GamePad: %d %d\n", m_GamePadCtrl.DidPressNow_A(), m_GamePadCtrl.DidPressNow_B());
3571+
3572+ //スタート 押下
3573+ if (m_GamePadCtrl.DidPressNow_Start()) {
3574+ //演奏開始/一時停止
3575+ result = _OnMenuPlay();
3576+ if (result != 0) goto EXIT;
3577+ }
3578+
3579+ //ボタンA 押下
3580+ if (m_GamePadCtrl.DidPressNow_A()) {
3581+ //演奏開始/一時停止
3582+ result = _OnMenuPlay();
3583+ if (result != 0) goto EXIT;
3584+ }
3585+
3586+ //ボタンB 押下
3587+ if (m_GamePadCtrl.DidPressNow_B()) {
3588+ //演奏停止
3589+ result = _OnMenuStop();
3590+ if (result != 0) goto EXIT;
3591+ }
3592+
3593+ //左ショルダー 押下
3594+ if (m_GamePadCtrl.DidPressNow_LShoulder()) {
3595+ //視点切り替え
3596+ result = _ChangeViewPoint(-1);
3597+ if (result != 0) goto EXIT;
3598+ }
3599+
3600+ //右ショルダー 押下
3601+ if (m_GamePadCtrl.DidPressNow_RShoulder()) {
3602+ //視点切り替え
3603+ result = _ChangeViewPoint(+1);
3604+ if (result != 0) goto EXIT;
3605+ }
3606+
3607+ //左トリガー 押下
3608+ if (m_GamePadCtrl.DidPressNow_LTrigger()) {
3609+ //再生リワインド
3610+ result = _OnMenuSkipBack();
3611+ if (result != 0) goto EXIT;
3612+ }
3613+
3614+ //右トリガー 押下
3615+ if (m_GamePadCtrl.DidPressNow_RTrigger()) {
3616+ //再生スキップ
3617+ result = _OnMenuSkipForward();
3618+ if (result != 0) goto EXIT;
3619+ }
3620+
3621+EXIT:;
3622+ return result;
3623+}
3624+
3625+//******************************************************************************
3626+// 視点切り替え
3627+//******************************************************************************
3628+int MIDITrailApp::_ChangeViewPoint(int step)
3629+{
3630+ int result = 0;
3631+
3632+ //ゲームパッド用視点番号更新
3633+ m_GamePadViewPointNo += step;
3634+
3635+ if (m_GamePadViewPointNo < 0) {
3636+ m_GamePadViewPointNo = 2;
3637+ }
3638+ else if (m_GamePadViewPointNo > 2) {
3639+ m_GamePadViewPointNo = 0;
3640+ }
3641+
3642+ //視点切り替え
3643+ switch (m_GamePadViewPointNo) {
3644+ case 0:
3645+ result = _OnMenuResetViewpoint();
3646+ if (result != 0) goto EXIT;
3647+ break;
3648+ case 1:
3649+ result = _OnMenuViewpoint(2);
3650+ if (result != 0) goto EXIT;
3651+ break;
3652+ case 2:
3653+ result = _OnMenuViewpoint(3);
3654+ if (result != 0) goto EXIT;
3655+ break;
3656+ default:
3657+ break;
3658+ }
3659+
3660+EXIT:;
3661+ return result;
3662+}
--- a/MIDITrail/MIDITrailApp.h
+++ b/MIDITrail/MIDITrailApp.h
@@ -4,7 +4,7 @@
44 //
55 // MIDITrail アプリケーションクラス
66 //
7-// Copyright (C) 2010-2018 WADA Masashi. All Rights Reserved.
7+// Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
88 //
99 //******************************************************************************
1010
@@ -23,6 +23,7 @@
2323 #include "MTHowToViewDlg.h"
2424 #include "MTAboutDlg.h"
2525 #include "MTCmdLineParser.h"
26+#include "MTGamePadCtrl.h"
2627
2728 using namespace YNBaseLib;
2829 using namespace SMIDILib;
@@ -36,14 +37,13 @@ using namespace SMIDILib;
3637 //ウィンドウスタイル
3738 // WS_OVERLAPPEDWINDOW から次のスタイルを削ったもの
3839 // WS_THICKFRAME サイズ変更可
39-// WS_MAXIMIZEBOX 最大化ボタン
40-#define MIDITRAIL_WINDOW_STYLE (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
40+#define MIDITRAIL_WINDOW_STYLE (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
4141
4242 //後続起動プロセスのファイルパスポスト通知
4343 #define WM_FILEPATH_POSTED (WM_USER + 100)
4444
4545 //メニュースタイル制御
46-#define MT_MENU_NUM (31)
46+#define MT_MENU_NUM (32)
4747 #define MT_PLAYSTATUS_NUM (6)
4848
4949 //デバイスロスト警告メッセージ
@@ -146,6 +146,8 @@ private:
146146 HACCEL m_Accel;
147147 TCHAR m_Title[MAX_LOADSTRING];
148148 TCHAR m_WndClassName[MAX_LOADSTRING];
149+ bool m_isFullScreen;
150+ HMENU m_hMenu;
149151
150152 //レンダリング系
151153 DXRenderer m_Renderer;
@@ -225,6 +227,12 @@ private:
225227 //次回オープン対象ファイルパス
226228 TCHAR m_NextFilePath[_MAX_PATH];
227229
230+ //ゲームパッド制御
231+ MTGamePadCtrl m_GamePadCtrl;
232+
233+ //ゲームパッド用視点番号
234+ int m_GamePadViewPointNo;
235+
228236 //----------------------------------------------------------------
229237 //メソッド定義
230238 //----------------------------------------------------------------
@@ -232,6 +240,7 @@ private:
232240 int _RegisterClass(HINSTANCE hInstance);
233241 int _CreateWindow(HINSTANCE hInstance, int nCmdShow);
234242 int _SetWindowSize();
243+ int _SetWindowSizeFullScreen();
235244
236245 //設定ファイル初期化
237246 int _InitConfFile();
@@ -257,6 +266,7 @@ private:
257266 int _OnMenuSaveViewpoint();
258267 int _OnMenuEnableEffect(MTScene::EffectType type);
259268 int _OnMenuWindowSize();
269+ int _OnMenuFullScreen();
260270 int _OnMenuOptionMIDIOUT();
261271 int _OnMenuOptionMIDIIN();
262272 int _OnMenuOptionGraphic();
@@ -268,6 +278,7 @@ private:
268278 int _SequencerMsgProc();
269279 int _OnRecvSequencerMsg(unsigned long wParam, unsigned long lParam);
270280 int _OnMouseButtonDown(UINT button, WPARAM wParam, LPARAM lParam);
281+ int _OnMouseMove(UINT button, WPARAM wParam, LPARAM lParam);
271282 int _OnKeyDown(WPARAM wParam, LPARAM lParam);
272283 int _OnDropFiles(WPARAM wParam, LPARAM lParam);
273284
@@ -306,6 +317,11 @@ private:
306317 int _PostFilePathToFirstMIDITrail(LPTSTR pCmdLine);
307318 int _StopPlaybackAndOpenFile(TCHAR* pFilePath);
308319 int _FileOpenProc(TCHAR* pFilePath);
320+ int _ToggleFullScreen();
321+ int _ShowMenu();
322+ int _HideMenu();
323+ int _GamePadProc();
324+ int _ChangeViewPoint(int step);
309325
310326 };
311327
--- a/MIDITrail/MIDITrailVersion.h
+++ b/MIDITrail/MIDITrailVersion.h
@@ -16,8 +16,8 @@
1616 //******************************************************************************
1717
1818 //バージョン文字列
19-#define MIDITRAIL_VERSION_STRING_X86 _T("Version 1.2.5 (32bit)")
20-#define MIDITRAIL_VERSION_STRING_X64 _T("Version 1.2.5 (64bit)")
19+#define MIDITRAIL_VERSION_STRING_X86 _T("Version 1.2.6 (32bit)")
20+#define MIDITRAIL_VERSION_STRING_X64 _T("Version 1.2.6 (64bit)")
2121
2222 //コピーライト
2323 #define MIDITRAIL_COPYRIGHT _T("Copyright (C) 2010-2019 WADA Masashi");
--- a/MIDITrail/MTFirstPersonCam.cpp
+++ b/MIDITrail/MTFirstPersonCam.cpp
@@ -90,6 +90,10 @@ int MTFirstPersonCam::Initialize(
9090 m_DIKeyCtrl.Acquire();
9191 m_DIMouseCtrl.Acquire();
9292
93+ //ゲームパッド初期化:ユーザインデックス0固定
94+ result = m_GamePadCtrl.Initialize(0);
95+ if (result != 0) goto EXIT;
96+
9397 //カメラ初期化
9498 result = m_Camera.Initialize();
9599 if (result != 0) goto EXIT;
@@ -201,10 +205,14 @@ int MTFirstPersonCam::Transform(
201205 )
202206 {
203207 int result = 0;
208+ float dt = 0.0f;
204209 int dX = 0;
205210 int dY = 0;
206211 int dW = 0;
207-
212+
213+ //デルタタイム
214+ dt = (float)m_DeltaTime / 1000.0f;
215+
208216 //TODO: ここじゃないどこかへ移す
209217 m_DIKeyCtrl.Acquire();
210218 m_DIMouseCtrl.Acquire();
@@ -222,6 +230,12 @@ int MTFirstPersonCam::Transform(
222230 //if (result != 0) goto EXIT;
223231 result = 0;
224232
233+ //ゲームパッド状態更新
234+ result = m_GamePadCtrl.UpdateState();
235+ if (result != 0) goto EXIT;
236+
237+ //_RPTN(_CRT_WARN, "GamePad: %f %f\n", m_GamePadCtrl.GetState_ThumbRX(), m_GamePadCtrl.GetState_ThumbRY());
238+
225239 //マウス/ホイール移動量
226240 dX = m_DIMouseCtrl.GetDelta(DIMouseCtrl::AxisX);
227241 dY = m_DIMouseCtrl.GetDelta(DIMouseCtrl::AxisY);
@@ -232,6 +246,11 @@ int MTFirstPersonCam::Transform(
232246 dX = 0;
233247 dY = 0;
234248 }
249+
250+ //ゲームパッド操作:右スティック
251+ //スティック値は-1.0から1.0の範囲
252+ dX += m_VelocityPT * dt * m_GamePadCtrl.GetState_ThumbRX() * (100.0f);
253+ dY += m_VelocityPT * dt * m_GamePadCtrl.GetState_ThumbRY() * (-100.0f);
235254
236255 //CTRL+移動キーで視線方向を変化させる
237256 if (m_DIKeyCtrl.IsKeyDown(DIK_LCONTROL) || m_DIKeyCtrl.IsKeyDown(DIK_RCONTROL)) {
@@ -335,6 +354,8 @@ int MTFirstPersonCam::_TransformEyeDirection(
335354 int MTFirstPersonCam::_TransformCamPosition()
336355 {
337356 int result = 0;
357+ float dFB = 0.0f;
358+ float dLR = 0.0f;
338359 float phi = 0.0f;
339360 float phiRad = 0.0f;
340361 float distance = 0.0f;
@@ -396,7 +417,40 @@ int MTFirstPersonCam::_TransformCamPosition()
396417 m_CamVector.x += +(m_VelocityFB * dt * rate);
397418 }
398419 }
399-
420+
421+ //ゲームパッド操作:十字キー>前後左右移動
422+ if (distance == 0.0f) {
423+ if (m_GamePadCtrl.GetState_DPadUp()) {
424+ dFB = m_VelocityFB * dt * (1.0f);
425+ }
426+ if (m_GamePadCtrl.GetState_DPadDown()) {
427+ dFB = m_VelocityFB * dt * (-1.0f);
428+ }
429+ if (m_GamePadCtrl.GetState_DPadRight()) {
430+ dLR = m_VelocityLR * dt * (-1.0f);
431+ }
432+ if (m_GamePadCtrl.GetState_DPadLeft()) {
433+ dLR = m_VelocityLR * dt * (1.0f);
434+ }
435+ distance = sqrt((dFB * dFB) + (dLR * dLR));
436+ phi += D3DXToDegree(atan2(dLR, dFB));
437+ }
438+ //ゲームパッド操作:左スティック>前後左右移動
439+ if (distance == 0.0f) {
440+ //スティック値は-1.0から1.0の範囲
441+ dFB += m_VelocityFB * dt * m_GamePadCtrl.GetState_ThumbLX() * -1.0f;
442+ dLR += m_VelocityLR * dt * m_GamePadCtrl.GetState_ThumbLY();
443+ distance = sqrt((dFB * dFB) + (dLR * dLR));
444+ phi += D3DXToDegree(atan2(dFB, dLR));
445+ }
446+ //ゲームパッド操作:X,Yボタン>下降,上昇移動
447+ if (m_GamePadCtrl.GetState_X()) {
448+ m_CamVector.y += -(m_VelocityUD * dt);
449+ }
450+ if (m_GamePadCtrl.GetState_Y()) {
451+ m_CamVector.y += +(m_VelocityUD * dt);
452+ }
453+
400454 //クリッピング
401455 if (phi >= 360.0f) {
402456 phi -= 360.0f;
--- a/MIDITrail/MTFirstPersonCam.h
+++ b/MIDITrail/MTFirstPersonCam.h
@@ -4,7 +4,7 @@
44 //
55 // 一人称カメラクラス
66 //
7-// Copyright (C) 2010 WADA Masashi. All Rights Reserved.
7+// Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
88 //
99 //******************************************************************************
1010
@@ -21,6 +21,7 @@
2121 #include "DXCamera.h"
2222 #include "SMIDILib.h"
2323 #include "MTNoteDesign.h"
24+#include "MTGamePadCtrl.h"
2425
2526 using namespace SMIDILib;
2627
@@ -116,6 +117,7 @@ private:
116117
117118 DIKeyCtrl m_DIKeyCtrl;
118119 DIMouseCtrl m_DIMouseCtrl;
120+ MTGamePadCtrl m_GamePadCtrl;
119121 bool m_IsMouseCamMode;
120122 bool m_IsAutoRollMode;
121123 HWND m_hWnd;
--- /dev/null
+++ b/MIDITrail/MTGamePadCtrl.cpp
@@ -0,0 +1,615 @@
1+//******************************************************************************
2+//
3+// MIDITrail / MTGamePadCtrl
4+//
5+// ゲームパッド制御クラス
6+//
7+// Copyright (C) 2019 WADA Masashi. All Rights Reserved.
8+//
9+//******************************************************************************
10+
11+#include "StdAfx.h"
12+#include "YNBaseLib.h"
13+#include "MTGamePadCtrl.h"
14+
15+using namespace YNBaseLib;
16+
17+
18+//******************************************************************************
19+// コンストラクタ
20+//******************************************************************************
21+MTGamePadCtrl::MTGamePadCtrl(void)
22+{
23+ m_isConnected = false;
24+ ZeroMemory(&m_PrevGamePadState, sizeof(XINPUT_GAMEPAD));
25+ ZeroMemory(&m_CurGamePadState, sizeof(XINPUT_GAMEPAD));
26+ m_ThumbLX = 0.0f;
27+ m_ThumbLY = 0.0f;
28+ m_ThumbRX = 0.0f;
29+ m_ThumbRY = 0.0f;
30+}
31+
32+//******************************************************************************
33+// デストラクタ
34+//******************************************************************************
35+MTGamePadCtrl::~MTGamePadCtrl(void)
36+{
37+}
38+
39+//******************************************************************************
40+// 初期化
41+//******************************************************************************
42+int MTGamePadCtrl::Initialize(int userIndex)
43+{
44+ int result = 0;
45+ DWORD dwResult = 0;
46+ XINPUT_STATE xInputState;
47+
48+ if (userIndex >= XUSER_MAX_COUNT) {
49+ result = YN_SET_ERR("Program error.", userIndex, 0);
50+ goto EXIT;
51+ }
52+
53+ //ユーザインデックス
54+ m_UserIndex = userIndex;
55+
56+ //ゲームパッド状態取得
57+ m_isConnected = false;
58+ dwResult = XInputGetState(m_UserIndex, &xInputState);
59+ if (dwResult == ERROR_DEVICE_NOT_CONNECTED) {
60+ //ゲームパッド未接続
61+ //何もしない
62+ }
63+ else if (dwResult == ERROR_SUCCESS) {
64+ //ゲームパッド状態取得成功
65+ m_isConnected = true;
66+ m_CurGamePadState = xInputState.Gamepad;
67+ }
68+ else if (dwResult != ERROR_SUCCESS) {
69+ result = YN_SET_ERR("XInput API error.", m_UserIndex, dwResult);
70+ goto EXIT;
71+ }
72+
73+EXIT:;
74+ return result;
75+}
76+
77+//******************************************************************************
78+// ゲームパッド状態更新
79+//******************************************************************************
80+int MTGamePadCtrl::UpdateState()
81+{
82+ int result = 0;
83+ DWORD dwResult = 0;
84+ XINPUT_STATE xInputState;
85+
86+ m_PrevGamePadState = m_CurGamePadState;
87+ ZeroMemory(&m_CurGamePadState, sizeof(XINPUT_GAMEPAD));
88+
89+ //ゲームパッド状態取得
90+ m_isConnected = false;
91+ dwResult = XInputGetState(m_UserIndex, &xInputState);
92+ if (dwResult == ERROR_DEVICE_NOT_CONNECTED) {
93+ //ゲームパッド未接続
94+ //何もしない
95+ }
96+ else if (dwResult == ERROR_SUCCESS) {
97+ //ゲームパッド状態取得成功
98+ m_isConnected = true;
99+ m_CurGamePadState = xInputState.Gamepad;
100+ }
101+ else if (dwResult != ERROR_SUCCESS) {
102+ result = YN_SET_ERR("XInput API error.", m_UserIndex, dwResult);
103+ goto EXIT;
104+ }
105+
106+ //スティック状態正規化
107+ if (m_isConnected) {
108+ _NormalizeLStickState();
109+ _NormalizeRStickState();
110+ }
111+ else {
112+ m_ThumbLX = 0.0f;
113+ m_ThumbLY = 0.0f;
114+ m_ThumbRX = 0.0f;
115+ m_ThumbRY = 0.0f;
116+ }
117+
118+EXIT:;
119+ return result;
120+}
121+
122+//******************************************************************************
123+// 左スティック状態正規化
124+//******************************************************************************
125+void MTGamePadCtrl::_NormalizeLStickState()
126+{
127+ float rawX = 0.0f;
128+ float rawY = 0.0f;
129+ float normalizedX = 0.0f;
130+ float normalizedY = 0.0f;
131+ float magnitude = 0.0f;
132+
133+ rawX = m_CurGamePadState.sThumbLX;
134+ rawY = m_CurGamePadState.sThumbLY;
135+
136+ magnitude = sqrt((rawX * rawX) + (rawY * rawY));
137+ normalizedX = rawX / magnitude;
138+ normalizedY = rawY / magnitude;
139+
140+ if (magnitude > XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) {
141+ if (magnitude > 0x7FFF) {
142+ magnitude = 0x7FFF;
143+ }
144+ magnitude -= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE;
145+ }
146+ else {
147+ magnitude = 0.0f;
148+ normalizedX = 0.0f;
149+ normalizedY = 0.0f;
150+ }
151+
152+ m_ThumbLX = normalizedX;
153+ m_ThumbLY = normalizedY;
154+
155+ return;
156+}
157+
158+//******************************************************************************
159+// 右スティック状態正規化
160+//******************************************************************************
161+void MTGamePadCtrl::_NormalizeRStickState()
162+{
163+ float rawX = 0.0f;
164+ float rawY = 0.0f;
165+ float normalizedX = 0.0f;
166+ float normalizedY = 0.0f;
167+ float magnitude = 0.0f;
168+
169+ rawX = m_CurGamePadState.sThumbRX;
170+ rawY = m_CurGamePadState.sThumbRY;
171+
172+ magnitude = sqrt((rawX * rawX) + (rawY * rawY));
173+ normalizedX = rawX / magnitude;
174+ normalizedY = rawY / magnitude;
175+
176+ if (magnitude > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) {
177+ if (magnitude > 0x7FFF) {
178+ magnitude = 0x7FFF;
179+ }
180+ magnitude -= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE;
181+ }
182+ else {
183+ magnitude = 0.0f;
184+ normalizedX = 0.0f;
185+ normalizedY = 0.0f;
186+ }
187+
188+ m_ThumbRX = normalizedX;
189+ m_ThumbRY = normalizedY;
190+
191+ return;
192+}
193+
194+//******************************************************************************
195+// ボタン状態取得:上
196+//******************************************************************************
197+bool MTGamePadCtrl::GetState_DPadUp()
198+{
199+ bool state = false;
200+
201+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_DPAD_UP)) {
202+ state = true;
203+ }
204+
205+ return state;
206+}
207+
208+//******************************************************************************
209+// ボタン状態取得:下
210+//******************************************************************************
211+bool MTGamePadCtrl::GetState_DPadDown()
212+{
213+ bool state = false;
214+
215+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)) {
216+ state = true;
217+ }
218+
219+ return state;
220+}
221+
222+//******************************************************************************
223+// ボタン状態取得:左
224+//******************************************************************************
225+bool MTGamePadCtrl::GetState_DPadLeft()
226+{
227+ bool state = false;
228+
229+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)) {
230+ state = true;
231+ }
232+
233+ return state;
234+}
235+
236+//******************************************************************************
237+// ボタン状態取得:右
238+//******************************************************************************
239+bool MTGamePadCtrl::GetState_DPadRight()
240+{
241+ bool state = false;
242+
243+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)) {
244+ state = true;
245+ }
246+
247+ return state;
248+}
249+
250+//******************************************************************************
251+// ボタン状態取得:A
252+//******************************************************************************
253+bool MTGamePadCtrl::GetState_A()
254+{
255+ bool state = false;
256+
257+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_A)) {
258+ state = true;
259+ }
260+
261+ return state;
262+}
263+
264+//******************************************************************************
265+// ボタン状態取得:B
266+//******************************************************************************
267+bool MTGamePadCtrl::GetState_B()
268+{
269+ bool state = false;
270+
271+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_B)) {
272+ state = true;
273+ }
274+
275+ return state;
276+}
277+
278+//******************************************************************************
279+// ボタン状態取得:X
280+//******************************************************************************
281+bool MTGamePadCtrl::GetState_X()
282+{
283+ bool state = false;
284+
285+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_X)) {
286+ state = true;
287+ }
288+
289+ return state;
290+}
291+
292+//******************************************************************************
293+// ボタン状態取得:Y
294+//******************************************************************************
295+bool MTGamePadCtrl::GetState_Y()
296+{
297+ bool state = false;
298+
299+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_Y)) {
300+ state = true;
301+ }
302+
303+ return state;
304+}
305+
306+//******************************************************************************
307+// ボタン状態取得:左ショルダー
308+//******************************************************************************
309+bool MTGamePadCtrl::GetState_LShoulder()
310+{
311+ bool state = false;
312+
313+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER)) {
314+ state = true;
315+ }
316+
317+ return state;
318+}
319+
320+//******************************************************************************
321+// ボタン状態取得:右ショルダー
322+//******************************************************************************
323+bool MTGamePadCtrl::GetState_RShoulder()
324+{
325+ bool state = false;
326+
327+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER)) {
328+ state = true;
329+ }
330+
331+ return state;
332+}
333+
334+//******************************************************************************
335+// ボタン状態取得:左トリガー
336+//******************************************************************************
337+bool MTGamePadCtrl::GetState_LTrigger()
338+{
339+ bool state = false;
340+
341+ if ((m_isConnected) && (m_CurGamePadState.bLeftTrigger > 250)) {
342+ state = true;
343+ }
344+
345+ return state;
346+}
347+
348+//******************************************************************************
349+// ボタン状態取得:右トリガー
350+//******************************************************************************
351+bool MTGamePadCtrl::GetState_RTrigger()
352+{
353+ bool state = false;
354+
355+ if ((m_isConnected) && (m_CurGamePadState.bRightTrigger > 250)) {
356+ state = true;
357+ }
358+
359+ return state;
360+}
361+
362+//******************************************************************************
363+// ボタン状態取得:スタート
364+//******************************************************************************
365+bool MTGamePadCtrl::GetState_Start()
366+{
367+ bool state = false;
368+
369+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_START)) {
370+ state = true;
371+ }
372+
373+ return state;
374+}
375+
376+//******************************************************************************
377+// ボタン状態取得:バック
378+//******************************************************************************
379+bool MTGamePadCtrl::GetState_Back()
380+{
381+ bool state = false;
382+
383+ if ((m_isConnected) && (m_CurGamePadState.wButtons & XINPUT_GAMEPAD_BACK)) {
384+ state = true;
385+ }
386+
387+ return state;
388+}
389+
390+//******************************************************************************
391+// スティック状態取得:左スティックX
392+//******************************************************************************
393+float MTGamePadCtrl::GetState_ThumbLX()
394+{
395+ float state = 0.0f;
396+
397+ if (m_isConnected) {
398+ state = m_ThumbLX;
399+ }
400+
401+ return state;
402+}
403+
404+//******************************************************************************
405+// スティック状態取得:左スティックY
406+//******************************************************************************
407+float MTGamePadCtrl::GetState_ThumbLY()
408+{
409+ float state = 0.0f;
410+
411+ if (m_isConnected) {
412+ state = m_ThumbLY;
413+ }
414+
415+ return state;
416+}
417+
418+//******************************************************************************
419+// スティック状態取得:右スティックX
420+//******************************************************************************
421+float MTGamePadCtrl::GetState_ThumbRX()
422+{
423+ float state = 0.0f;
424+
425+ if (m_isConnected) {
426+ state = m_ThumbRX;
427+ }
428+
429+ return state;
430+}
431+
432+//******************************************************************************
433+// スティック状態取得:右スティックY
434+//******************************************************************************
435+float MTGamePadCtrl::GetState_ThumbRY()
436+{
437+ float state = 0.0f;
438+
439+ if (m_isConnected) {
440+ state = m_ThumbRY;
441+ }
442+
443+ return state;
444+}
445+
446+//******************************************************************************
447+// ボタン押下確認:A
448+//******************************************************************************
449+bool MTGamePadCtrl::DidPressNow_A()
450+{
451+ bool isNow = false;
452+
453+ if (m_isConnected) {
454+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_A) == 0)
455+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_A) != 0)) {
456+ isNow = true;
457+ }
458+ }
459+
460+ return isNow;
461+}
462+
463+//******************************************************************************
464+// ボタン押下確認:B
465+//******************************************************************************
466+bool MTGamePadCtrl::DidPressNow_B()
467+{
468+ bool isNow = false;
469+
470+ if (m_isConnected) {
471+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_B) == 0)
472+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_B) != 0)) {
473+ isNow = true;
474+ }
475+ }
476+
477+ return isNow;
478+}
479+
480+//******************************************************************************
481+// ボタン押下確認:X
482+//******************************************************************************
483+bool MTGamePadCtrl::DidPressNow_X()
484+{
485+ bool isNow = false;
486+
487+ if (m_isConnected) {
488+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_X) == 0)
489+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_X) != 0)) {
490+ isNow = true;
491+ }
492+ }
493+
494+ return isNow;
495+}
496+
497+//******************************************************************************
498+// ボタン押下確認:Y
499+//******************************************************************************
500+bool MTGamePadCtrl::DidPressNow_Y()
501+{
502+ bool isNow = false;
503+
504+ if (m_isConnected) {
505+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_Y) == 0)
506+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_Y) != 0)) {
507+ isNow = true;
508+ }
509+ }
510+
511+ return isNow;
512+}
513+
514+//******************************************************************************
515+// ボタン押下確認:左ショルダー
516+//******************************************************************************
517+bool MTGamePadCtrl::DidPressNow_LShoulder()
518+{
519+ bool isNow = false;
520+
521+ if (m_isConnected) {
522+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) == 0)
523+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0)) {
524+ isNow = true;
525+ }
526+ }
527+
528+ return isNow;
529+}
530+
531+//******************************************************************************
532+// ボタン押下確認:右ショルダー
533+//******************************************************************************
534+bool MTGamePadCtrl::DidPressNow_RShoulder()
535+{
536+ bool isNow = false;
537+
538+ if (m_isConnected) {
539+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) == 0)
540+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0)) {
541+ isNow = true;
542+ }
543+ }
544+
545+ return isNow;
546+}
547+
548+//******************************************************************************
549+// ボタン押下確認:左トリガー
550+//******************************************************************************
551+bool MTGamePadCtrl::DidPressNow_LTrigger()
552+{
553+ bool isNow = false;
554+
555+ if (m_isConnected) {
556+ if ((m_PrevGamePadState.bLeftTrigger < MT_GAME_PAD_TRRIGER_ON_THRESHOLD)
557+ && (m_CurGamePadState.bLeftTrigger >= MT_GAME_PAD_TRRIGER_ON_THRESHOLD)) {
558+ isNow = true;
559+ }
560+ }
561+
562+ return isNow;
563+}
564+
565+//******************************************************************************
566+// ボタン押下確認:右トリガー
567+//******************************************************************************
568+bool MTGamePadCtrl::DidPressNow_RTrigger()
569+{
570+ bool isNow = false;
571+
572+ if (m_isConnected) {
573+ if ((m_PrevGamePadState.bRightTrigger < MT_GAME_PAD_TRRIGER_ON_THRESHOLD)
574+ && (m_CurGamePadState.bRightTrigger >= MT_GAME_PAD_TRRIGER_ON_THRESHOLD)) {
575+ isNow = true;
576+ }
577+ }
578+
579+ return isNow;
580+}
581+
582+//******************************************************************************
583+// ボタン押下確認:スタート
584+//******************************************************************************
585+bool MTGamePadCtrl::DidPressNow_Start()
586+{
587+ bool isNow = false;
588+
589+ if (m_isConnected) {
590+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_START) == 0)
591+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_START) != 0)) {
592+ isNow = true;
593+ }
594+ }
595+
596+ return isNow;
597+}
598+
599+//******************************************************************************
600+// ボタン押下確認:バック
601+//******************************************************************************
602+bool MTGamePadCtrl::DidPressNow_Back()
603+{
604+ bool isNow = false;
605+
606+ if (m_isConnected) {
607+ if (((m_PrevGamePadState.wButtons & XINPUT_GAMEPAD_BACK) == 0)
608+ && ((m_CurGamePadState.wButtons & XINPUT_GAMEPAD_BACK) != 0)) {
609+ isNow = true;
610+ }
611+ }
612+
613+ return isNow;
614+}
615+
--- /dev/null
+++ b/MIDITrail/MTGamePadCtrl.h
@@ -0,0 +1,105 @@
1+//******************************************************************************
2+//
3+// MIDITrail / MTGamePadCtrl
4+//
5+// ゲームパッド制御クラス
6+//
7+// Copyright (C) 2019 WADA Masashi. All Rights Reserved.
8+//
9+//******************************************************************************
10+
11+// MEMO:
12+// XInputを用いてゲームパッドの状態を取得する。
13+
14+#pragma once
15+
16+#include <XInput.h>
17+
18+
19+//******************************************************************************
20+// パラメータ定義
21+//******************************************************************************
22+
23+//トリガーON閾値(0-255)
24+#define MT_GAME_PAD_TRRIGER_ON_THRESHOLD (250)
25+
26+
27+//******************************************************************************
28+// ゲームパッド制御クラス
29+//******************************************************************************
30+class MTGamePadCtrl
31+{
32+public:
33+
34+ //コンストラクタ/デストラクタ
35+ MTGamePadCtrl(void);
36+ virtual ~MTGamePadCtrl();
37+
38+ //初期化
39+ int Initialize(int userIndex);
40+
41+ //状態更新
42+ int UpdateState();
43+
44+ //ボタン状態取得
45+ bool GetState_DPadUp();
46+ bool GetState_DPadDown();
47+ bool GetState_DPadLeft();
48+ bool GetState_DPadRight();
49+ bool GetState_A();
50+ bool GetState_B();
51+ bool GetState_X();
52+ bool GetState_Y();
53+ bool GetState_LShoulder();
54+ bool GetState_RShoulder();
55+ bool GetState_LTrigger();
56+ bool GetState_RTrigger();
57+ bool GetState_Start();
58+ bool GetState_Back();
59+
60+ //スティック状態取得(0.0 - 1.0)
61+ float GetState_ThumbLX();
62+ float GetState_ThumbLY();
63+ float GetState_ThumbRX();
64+ float GetState_ThumbRY();
65+
66+ //ボタン押下確認
67+ bool DidPressNow_A();
68+ bool DidPressNow_B();
69+ bool DidPressNow_X();
70+ bool DidPressNow_Y();
71+ bool DidPressNow_LShoulder();
72+ bool DidPressNow_RShoulder();
73+ bool DidPressNow_LTrigger();
74+ bool DidPressNow_RTrigger();
75+ bool DidPressNow_Start();
76+ bool DidPressNow_Back();
77+
78+private:
79+
80+ //ユーザインデックス
81+ int m_UserIndex;
82+
83+ //ゲームパッド接続状態
84+ bool m_isConnected;
85+
86+ //ゲームパッド状態
87+ XINPUT_GAMEPAD m_PrevGamePadState;
88+ XINPUT_GAMEPAD m_CurGamePadState;
89+
90+ //スティック状態
91+ float m_ThumbLX;
92+ float m_ThumbLY;
93+ float m_ThumbRX;
94+ float m_ThumbRY;
95+
96+ void _NormalizeLStickState();
97+ void _NormalizeRStickState();
98+
99+};
100+
101+
102+
103+
104+
105+
--- a/MIDITrail/resource.h
+++ b/MIDITrail/resource.h
@@ -70,6 +70,7 @@
7070 #define IDM_ENABLE_BACKGROUNDIMAGE 32842
7171 #define IDM_VIEWPOINT2 32843
7272 #define IDM_VIEWPOINT3 32844
73+#define IDM_FULLSCREEN 32849
7374 #define IDC_STATIC -1
7475
7576 // Next default values for new objects
@@ -78,7 +79,7 @@
7879 #ifndef APSTUDIO_READONLY_SYMBOLS
7980 #define _APS_NO_MFC 1
8081 #define _APS_NEXT_RESOURCE_VALUE 134
81-#define _APS_NEXT_COMMAND_VALUE 32848
82+#define _APS_NEXT_COMMAND_VALUE 32850
8283 #define _APS_NEXT_CONTROL_VALUE 1025
8384 #define _APS_NEXT_SYMED_VALUE 110
8485 #endif
--- a/README.en.txt
+++ b/README.en.txt
@@ -1,6 +1,6 @@
11 ******************************************************************************
22
3- MIDITrail source code Ver.1.2.5 for Windows
3+ MIDITrail source code Ver.1.2.6 for Windows
44
55 Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
66
--- a/README.ja.txt
+++ b/README.ja.txt
@@ -1,6 +1,6 @@
11 ******************************************************************************
22
3- MIDITrail ソースコード Ver.1.2.5 for Windows
3+ MIDITrail ソースコード Ver.1.2.6 for Windows
44
55 Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
66
Binary files a/Resources/doc/Files/ViewMenu-Effect.png and b/Resources/doc/Files/ViewMenu-Effect.png differ
Binary files a/Resources/doc/Files/ViewMenu-Mode.png and b/Resources/doc/Files/ViewMenu-Mode.png differ
--- a/Resources/doc/MANUAL.en.html
+++ b/Resources/doc/MANUAL.en.html
@@ -4,7 +4,7 @@
44 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
55 <meta http-equiv="Content-Language" content="en">
66 <link rel="stylesheet" href="Files/doc.css" type="text/css">
7-<title>MIDITrail Ver.1.2.5 for Windows User Manual</title>
7+<title>MIDITrail Ver.1.2.6 for Windows User Manual</title>
88 </head>
99 <body>
1010
@@ -15,7 +15,7 @@
1515 English / <a href="MANUAL.ja.html">Japanese</a>
1616 </div>
1717
18-<h1>MIDITrail Ver.1.2.5 for Windows User Manual</h1>
18+<h1>MIDITrail Ver.1.2.6 for Windows User Manual</h1>
1919
2020 <p>
2121 Copyright (c) 2010-2019, WADA Masashi All rights reserved.<br>
@@ -262,7 +262,7 @@ or when you push following key, you can move to a fixed viewpoint.
262262
263263 <h3>(5) Change of window size</h3>
264264 <p>
265-Select "Window size..." from "View" menu, the Window size configuration dialog will appear.<br>
265+When you select "Window size..." from "View" menu, the Window size configuration dialog will appear.<br>
266266 Select your favorite window size, and push the OK button.<br>
267267 You can not change window size while playing or pausing.
268268 </p>
@@ -275,7 +275,13 @@ If you want to specify any window size, fill in "Width" "Height".<br>
275275 If you want to apply that size to the view area, check "Apply to the view area".
276276 </p>
277277
278-<h3>(6) Display counters</h3>
278+<h3>(6) Full Screen</h3>
279+<p>
280+When you select "Full Screen" from "View" menu, you can switch between window mode and full screen mode.<br>
281+By F11 key, you can switch the mode too.
282+</p>
283+
284+<h3>(7) Display counters</h3>
279285
280286 <p>
281287 <img src="Files/Counter.png"><br>
@@ -294,7 +300,7 @@ If you want to apply that size to the view area, check "Apply to the view area"
294300 </table>
295301 </p>
296302
297-<h3>(7) View mode select</h3>
303+<h3>(8) View mode select</h3>
298304 <p>
299305 You can select the view mode from "View" menu.
300306 You can not change the view mode while playing or pausing.
@@ -303,7 +309,7 @@ You can not change the view mode while playing or pausing.
303309 <img src="Files/ViewMenu-Mode.png"><br>
304310 </p>
305311
306-<h3>(8) Display/Effect switch</h3>
312+<h3>(9) Display/Effect switch</h3>
307313 <p>
308314 You can switch the display/effect at "View" menu.
309315 </p>
@@ -316,7 +322,7 @@ Some MIDI animation works are using pitch bend to shift the piano roll bars with
316322 If the MIDI animation is not displayed correctly, please disable the pitch bend effect to fix the piano roll bars.
317323 </p>
318324
319-<h3>(9) MIDITrail command line interface</h3>
325+<h3>(10) MIDITrail command line interface</h3>
320326 <p>
321327 If you want to start MIDITrail by command line, you can use following arguments.
322328 </p>
@@ -335,7 +341,7 @@ MIDITrail.exe [-p] [-q] ["path\to\file"]
335341 If you drop a MIDI file to the shortcut of MIDITrail, MIDITrail open the file on startup.
336342 </p>
337343
338-<h3>(10) Graphic configuration</h3>
344+<h3>(11) Graphic configuration</h3>
339345 <p>
340346 Select "Graphic..." from "Option" menu, the graphic configuration dialog will appear.<br>
341347 You can not change graphic configuration while playing or pausing.
@@ -360,7 +366,7 @@ You can change a quarter note length of piano roll.<br>
360366 You can specify a value from 0% to 1000%. The default value is 100%.<br>
361367 </p>
362368
363-<h3>(11) MIDI IN Monitor</h3>
369+<h3>(12) MIDI IN Monitor</h3>
364370 <p>
365371 You can view data sets received from MIDI IN device in realtime.<br>
366372 Select "MIDI IN..." from "Option" menu, then "MIDI IN configuration" dialog will appear.<br>
@@ -375,6 +381,29 @@ When you select "Start Monitoring" from "Playback" menu, MIDI IN monitoring will
375381 NOTE: MIDITrail can not record data sets received from MIDI IN.<br>
376382 </p>
377383
384+<h3>(13) Game Controller</h3>
385+<p>
386+You can operate by XInput game controller.<br>
387+</p>
388+<p>
389+<table>
390+ <tr><th>Button / Stick</th><th>Action</th></tr>
391+ <tr><td>START button</td><td>Play / Pause / Resume</td></tr>
392+ <tr><td>A button</td><td>Play / Pause / Resume</td></tr>
393+ <tr><td>B button</td><td>Stop</td></tr>
394+ <tr><td>X button</td><td>Viewpoint: down</td></tr>
395+ <tr><td>Y button</td><td>Viewpoint: up</td></tr>
396+ <tr><td>LB/RB shoulder button</td><td>Change viewpoint</td></tr>
397+ <tr><td>LT/RT trigger button</td><td>Skip back/forward</td></tr>
398+ <tr><td>Directional pad</td><td>Viewpoint movement: front and back, right and left</td></tr>
399+ <tr><td>Left stick</td><td>Viewpoint movement: front and back, right and left</td></tr>
400+ <tr><td>Right stick</td><td>Eye direction</td></tr>
401+</table>
402+</p>
403+<p>
404+NOTE: MIDITrail does not support DirectInput game controller.
405+</p>
406+
378407 <!-- ************************************************************* -->
379408 <h2><a name="restriction"></a>5. Restriction</h2>
380409
@@ -445,18 +474,12 @@ Width=800
445474 Height=600
446475 </pre>
447476
448-<h3>(4) Q. I want to display in full screen.</h3>
449-<p>
450-In present version, MIDITrail can not display in full screen.
451-It may support in the future.
452-</p>
453-
454-<h3>(5) Q. When I display the menu, the animation stops.</h3>
477+<h3>(4) Q. When I display the menu, the animation stops.</h3>
455478 <p>
456479 Sorry, it is a specification.
457480 </p>
458481
459-<h3>(6) Q. I got "DirectX API error. / FUNC: DXRenderer::Initialize / INFO: 8876086A" error.</h3>
482+<h3>(5) Q. I got "DirectX API error. / FUNC: DXRenderer::Initialize / INFO: 8876086A" error.</h3>
460483 <p>
461484 If your PC does not support Direct3D, this error occurs.<br>
462485 Please execute "DirectX Diagnostic Tool"(dxdiag.exe), and select "Display" tab.
@@ -465,7 +488,7 @@ If you can't change "Direct3D Acceleration" to "Enabled", your PC does not suppo
465488 Please use the PC which supports DirectX 9.0c graphics.
466489 </p>
467490
468-<h3>(7) Q. I want to change the ripple more showily.</h3>
491+<h3>(6) Q. I want to change the ripple more showily.</h3>
469492 <p>
470493 You can change size of the ripple by editing configuration file.<br>
471494 Please Check "7. Customize - (2) Piano roll".<br>
@@ -913,6 +936,10 @@ This version was released with MIDITrail for Mac OS X.<br>
913936 #39228 Changed appendix of user's manual<br>
914937 #39229 fixed bug (Code analysis found some mistakes)<br>
915938 </td></tr>
939+ <tr><td>2019/06/02</td><td>Ver.1.2.6</td><td>
940+#39274 Added full screen mode<br>
941+#39275 Added support for game controller<br>
942+ </td></tr>
916943 </table>
917944 </p>
918945
--- a/Resources/doc/MANUAL.ja.html
+++ b/Resources/doc/MANUAL.ja.html
@@ -4,7 +4,7 @@
44 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
55 <meta http-equiv="Content-Language" content="ja">
66 <link rel="stylesheet" href="Files/doc.css" type="text/css">
7-<title>MIDITrail Ver.1.2.5 for Windows ユーザーマニュアル</title>
7+<title>MIDITrail Ver.1.2.6 for Windows ユーザーマニュアル</title>
88 </head>
99 <body>
1010
@@ -14,7 +14,7 @@
1414 <a href="MANUAL.en.html">English</a> / Japanese
1515 </div>
1616
17-<h1>MIDITrail Ver.1.2.5 for Windows ユーザーマニュアル</h1>
17+<h1>MIDITrail Ver.1.2.6 for Windows ユーザーマニュアル</h1>
1818
1919 <p>
2020 Copyright (c) 2010-2019, WADA Masashi All rights reserved.<br>
@@ -272,8 +272,14 @@ Viewメニューから「Viewpoint 1 / Viewpoint 2 / Viewpoint 3」を選択す
272272 「Aplly to the view area」を選択すると、設定値が画像領域のサイズに反映されます。<br>
273273 </p>
274274
275-<h3>(6) 表示カウンタの種類</h3>
275+<h3>(6) フルスクリーン表示</h3>
276+<p>
277+「View」メニューから「Full Screen」を選択すると、ウィンドウ表示とフルスクリーン表示を
278+切り替えることができます。<br>
279+F11キーを押すことで、表示を切り替えることも可能です。
280+</p>
276281
282+<h3>(7) 表示カウンタの種類</h3>
277283 <p>
278284 <img src="Files/Counter.png"><br>
279285 </p>
@@ -291,7 +297,7 @@ Viewメニューから「Viewpoint 1 / Viewpoint 2 / Viewpoint 3」を選択す
291297 </table>
292298 </p>
293299
294-<h3>(7) ビューモード選択</h3>
300+<h3>(8) ビューモード選択</h3>
295301 <p>
296302 「View」メニューでビューモードを選択することができます。
297303 演奏中/一時停止中にビューモードの変更はできません。
@@ -300,7 +306,7 @@ Viewメニューから「Viewpoint 1 / Viewpoint 2 / Viewpoint 3」を選択す
300306 <img src="Files/ViewMenu-Mode.png"><br>
301307 </p>
302308
303-<h3>(8) 表示/エフェクト選択</h3>
309+<h3>(9) 表示/エフェクト選択</h3>
304310 <p>
305311 「View」メニューで表示/エフェクトの有無を切り替えることができます。
306312 </p>
@@ -315,7 +321,7 @@ MIDIアニメ作品が正常に表示されない場合は、バーの表示位
315321 ピッチベンドのエフェクトをOFFにしてください。
316322 </p>
317323
318-<h3>(9) MIDITrailコマンドラインインターフェース</h3>
324+<h3>(10) MIDITrailコマンドラインインターフェース</h3>
319325 <p>
320326 コマンドラインからMIDITrailを起動する場合は、以下の引数を指定できます。
321327 </p>
@@ -334,7 +340,7 @@ MIDITrail.exe [-p] [-q] ["path\to\file"]
334340 MIDITrailのショートカットにMIDIファイルをドロップすると、MIDITrail起動時にファイルを開くことができます。
335341 </p>
336342
337-<h3>(10) グラフィック設定</h3>
343+<h3>(11) グラフィック設定</h3>
338344 <p>
339345 「Option」メニューから「Graphic...」を選択すると、グラフィック設定ダイアログが表示されます。<br>
340346 演奏中/一時停止中にグラフィック設定の変更はできません。
@@ -359,7 +365,7 @@ PCがアンチエイリアシングに対応していない場合は「Not suppo
359365 0%から1000%を指定できます。デフォルトは100%です。
360366 </p>
361367
362-<h3>(11) MIDI IN モニタ</h3>
368+<h3>(12) MIDI IN モニタ</h3>
363369 <p>
364370 MIDI INデバイスで受信したデータをリアルタイム表示することができます。<br>
365371 「Option」メニューから「MIDI IN...」を選択すると、MIDI IN設定ダイアログが表示されます。<br>
@@ -374,6 +380,29 @@ MIDI INで受信したデータをそのままMIDI OUTに出力する場合は
374380 なお、MIDITrailはMIDI INで受信したデータを保存することはできません。<br>
375381 </p>
376382
383+<h3>(13) ゲームコントローラー</h3>
384+<p>
385+XInput対応のゲームコントローラーを用いて操作することができます。<br>
386+</p>
387+<p>
388+<table>
389+ <tr><th>ボタン / スティック</th><th>操作</th></tr>
390+ <tr><td>START ボタン</td><td>再生/一時停止</td></tr>
391+ <tr><td>A ボタン</td><td>再生/一時停止</td></tr>
392+ <tr><td>B ボタン</td><td>停止</td></tr>
393+ <tr><td>X ボタン</td><td>視点移動:下降</td></tr>
394+ <tr><td>Y ボタン</td><td>視点移動:上昇</td></tr>
395+ <tr><td>LB/RB ショルダーボタン</td><td>視点切り替え</td></tr>
396+ <tr><td>LT/RT トリガーボタン</td><td>再生スキップ</td></tr>
397+ <tr><td>十字キー</td><td>視点移動:前後左右</td></tr>
398+ <tr><td>左スティック</td><td>視点移動:前後左右</td></tr>
399+ <tr><td>右スティック</td><td>視線方向</td></tr>
400+</table>
401+</p>
402+<p>
403+注意:MIDITrailはDirectInputのゲームコントローラーをサポートしていません。
404+</p>
405+
377406 <!-- ************************************************************* -->
378407 <h2><a name="restriction"></a>5. 制限事項</h2>
379408
@@ -448,18 +477,12 @@ Width=800
448477 Height=600
449478 </pre>
450479
451-<h3>(4) フルスクリーン表示にしたい</h3>
452-<p>
453-現時点では、フルスクリーン表示には対応していません。<br>
454-そのうち対応するかもしれません。
455-</p>
456-
457-<h3>(5) メニューを表示すると画面の描画が止まります</h3>
480+<h3>(4) メニューを表示すると画面の描画が止まります</h3>
458481 <p>
459482 すいません。仕様です。<br>
460483 </p>
461484
462-<h3>(6) 「DirectX API error. / FUNC: DXRenderer::Initialize / INFO: 8876086A」というエラーが出ます</h3>
485+<h3>(5) 「DirectX API error. / FUNC: DXRenderer::Initialize / INFO: 8876086A」というエラーが出ます</h3>
463486 <p>
464487 お使いのPCがDirect3Dをサポートしていない場合にこのエラーが発生します。<br>
465488 DirectX診断ツール(dxdiag.exe)を起動して「ディスプレイ」タブを選択し、
@@ -468,7 +491,7 @@ DirectX診断ツール(dxdiag.exe)を起動して「ディスプレイ」タブ
468491 DirectX 9.0cをサポートしているPCを使用してください。
469492 </p>
470493
471-<h3>(7) 波紋を派手にしたい</h3>
494+<h3>(6) 波紋を派手にしたい</h3>
472495 <p>
473496 設定ファイルを編集することにより、波紋の大きさを変更することができます。<br>
474497 詳しくは「7. カスタマイズ - (2) ピアノロール表示のカスタマイズ」を参照してください。<br>
@@ -903,6 +926,10 @@ MIDITrail for Mac OS Xと同時にリリース<br>
903926 #39228 仕様変更:ユーザマニュアル補遺修正<br>
904927 #39229 バグ修正:コード分析対応<br>
905928 </td></tr>
929+ <tr><td>2019/06/02</td><td>Ver.1.2.6</td><td>
930+#39274 機能追加:フルスクリーン表示対応<br>
931+#39275 機能追加:ゲームコントローラー対応<br>
932+ </td></tr>
906933 </table>
907934 </p>
908935