• 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

Revision6e95ff08acc2129da7af3a8dd67fe36afa094498 (tree)
Time2019-08-28 05:43:37
Authoryoshy <yoshy@user...>
Commiteryoshy

Log Message

Merge branch 'merge_org_126' into develop

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
@@ -89,6 +89,7 @@ BEGIN
8989 MENUITEM "Viewpoint 3\t9", IDM_VIEWPOINT3
9090 MENUITEM SEPARATOR
9191 MENUITEM "Window size...", IDM_WINDOWSIZE
92+ MENUITEM "Full Screen\tF11", IDM_FULLSCREEN
9293 END
9394 POPUP "Option"
9495 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" />
@@ -292,6 +293,7 @@
292293 <ClInclude Include="MTFirstPersonCam.h" />
293294 <ClInclude Include="MTFont2Bmp.h" />
294295 <ClInclude Include="MTFontTexture.h" />
296+ <ClInclude Include="MTGamePadCtrl.h" />
295297 <ClInclude Include="MTGraphicCfgDlg.h" />
296298 <ClInclude Include="MTGridBox.h" />
297299 <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 <ClCompile Include="MTGridBoxMod.cpp">
219225 <Filter>Sources\SceneObject</Filter>
220226 </ClCompile>
@@ -427,6 +433,9 @@
427433 <ClInclude Include="MTWindowSizeCfgDlg.h">
428434 <Filter>Sources\Dialog</Filter>
429435 </ClInclude>
436+ <ClInclude Include="MTGamePadCtrl.h">
437+ <Filter>Sources\XInputUtility</Filter>
438+ </ClInclude>
430439 <ClInclude Include="MTGridBoxMod.h">
431440 <Filter>Sources\SceneObject</Filter>
432441 </ClInclude>
--- a/MIDITrail/MIDITrailApp.cpp
+++ b/MIDITrail/MIDITrailApp.cpp
@@ -54,6 +54,8 @@ MIDITrailApp::MIDITrailApp(void)
5454 m_Accel = NULL;
5555 m_Title[0] = _T('\0');
5656 m_WndClassName[0] = _T('\0');
57+ m_isFullScreen = false;
58+ m_hMenu = NULL;
5759
5860 //レンダリング系
5961 m_pScene = NULL;
@@ -105,6 +107,9 @@ MIDITrailApp::MIDITrailApp(void)
105107
106108 //次回オープン対象ファイルパス
107109 m_NextFilePath[0] = _T('\0');
110+
111+ //ゲームパッド用視点番号
112+ m_GamePadViewPointNo = 0;
108113 }
109114
110115 //******************************************************************************
@@ -238,6 +243,10 @@ int MIDITrailApp::Initialize(
238243 result = _StartTimer();
239244 if (result != 0) goto EXIT;
240245
246+ //ゲームパッド制御:ユーザインデックス0固定
247+ result = m_GamePadCtrl.Initialize(0);
248+ if (result != 0) goto EXIT;
249+
241250 EXIT:;
242251 return result;
243252 }
@@ -312,6 +321,13 @@ int MIDITrailApp::Run()
312321 if (result != 0) {
313322 YN_SHOW_ERR(m_hWnd);
314323 }
324+
325+ //ゲームパッド操作処理
326+ result = _GamePadProc();
327+ if (result != 0) {
328+ YN_SHOW_ERR(m_hWnd);
329+ }
330+
315331 //ウィンドウ表示状態でのみ描画を行う
316332 GetWindowPlacement(m_hWnd, &wndpl);
317333 if ((wndpl.showCmd != SW_HIDE) &&
@@ -417,6 +433,9 @@ int MIDITrailApp::_CreateWindow(
417433 result = YN_SET_ERR("Windows API error.", GetLastError(), 0);
418434 goto EXIT;
419435 }
436+
437+ //メニューバー表示切替のためウィンドウ生成直後にハンドルを取得しておく
438+ m_hMenu = GetMenu(m_hWnd);
420439
421440 //ユーザー設定ウィンドウサイズ変更
422441 result = _SetWindowSize();
@@ -446,6 +465,12 @@ int MIDITrailApp::_SetWindowSize()
446465 RECT wrect, crect;
447466 int ww, wh, cw, ch, framew, frameh;
448467 int applyToViewArea = 0;
468+ LONG apiresult = 0;
469+
470+ if (m_isFullScreen) {
471+ result = _SetWindowSizeFullScreen();
472+ goto EXIT;
473+ }
449474
450475 //ユーザ選択ウィンドウサイズ取得
451476 result = m_ViewConf.SetCurSection(_T("WindowSize"));
@@ -482,7 +507,18 @@ int MIDITrailApp::_SetWindowSize()
482507 width = width + framew;
483508 height = height + frameh;
484509 }
485-
510+
511+ //ウィンドウスタイル設定
512+ apiresult = SetWindowLong(m_hWnd, GWL_STYLE, MIDITRAIL_WINDOW_STYLE);
513+ if (apiresult == 0) {
514+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
515+ goto EXIT;
516+ }
517+
518+ //メニューバー表示
519+ result = _ShowMenu();
520+ if (result != 0) goto EXIT;
521+
486522 //ウィンドウサイズ変更
487523 bresult = SetWindowPos(
488524 m_hWnd, //ウィンドウハンドル
@@ -491,7 +527,73 @@ int MIDITrailApp::_SetWindowSize()
491527 0, //縦方向の位置
492528 width, //幅
493529 height, //高さ
494- SWP_NOMOVE //ウィンドウ位置指定
530+ SWP_NOMOVE | SWP_FRAMECHANGED | SWP_SHOWWINDOW //ウィンドウ位置指定
531+ );
532+ if (!bresult) {
533+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
534+ goto EXIT;
535+ }
536+
537+EXIT:;
538+ return result;
539+}
540+
541+//******************************************************************************
542+// ウィンドウサイズ変更:フルスクリーン
543+//******************************************************************************
544+int MIDITrailApp::_SetWindowSizeFullScreen()
545+{
546+ int result = 0;
547+ BOOL bresult = FALSE;
548+ LONG apiresult = 0;
549+ POINT mouseCursorPoint;
550+ HMONITOR hMonitor = NULL;
551+ MONITORINFOEX monitorInfo;
552+ int width = 0;
553+ int height = 0;
554+
555+ //マウスカーソル位置を取得
556+ bresult = GetCursorPos(&mouseCursorPoint);
557+ if (!bresult) {
558+ result = YN_SET_ERR("Windows API error.", GetLastError(), 0);
559+ goto EXIT;
560+ }
561+
562+ //マウスカーソルの位置に該当するモニタを選択
563+ hMonitor = MonitorFromPoint(mouseCursorPoint, MONITOR_DEFAULTTONEAREST);
564+
565+ //モニタ情報取得
566+ monitorInfo.cbSize = sizeof(MONITORINFOEX);
567+ bresult = GetMonitorInfo(hMonitor, &monitorInfo);
568+ if (!bresult) {
569+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)hMonitor);
570+ goto EXIT;
571+ }
572+
573+ //ウィンドウ縦横サイズ
574+ width = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left;
575+ height = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;
576+
577+ //ウィンドウスタイル設定
578+ apiresult = SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP);
579+ if (apiresult == 0) {
580+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
581+ goto EXIT;
582+ }
583+
584+ //メニューバー非表示
585+ result = _HideMenu();
586+ if (result != 0) goto EXIT;
587+
588+ //ウィンドウサイズ変更
589+ bresult = SetWindowPos(
590+ m_hWnd, //ウィンドウハンドル
591+ HWND_TOP, //配置順序:Zオーダー先頭
592+ monitorInfo.rcMonitor.left, //横方向の位置
593+ monitorInfo.rcMonitor.top, //縦方向の位置
594+ width, //幅
595+ height, //高さ
596+ SWP_FRAMECHANGED | SWP_SHOWWINDOW //ウィンドウ位置指定
495597 );
496598 if (!bresult) {
497599 result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
@@ -660,31 +762,6 @@ LRESULT MIDITrailApp::_WndProcImpl(
660762 if (result != 0) goto EXIT;
661763 break;
662764 //TAG: シーン追加
663- case IDM_AUTO_SAVE_VIEWPOINT:
664- //自動視点保存
665- result = _OnMenuAutoSaveViewpoint();
666- if (result != 0) goto EXIT;
667- break;
668- case IDM_SAVE_VIEWPOINT:
669- //視点保存
670- result = _OnMenuSaveViewpoint();
671- if (result != 0) goto EXIT;
672- break;
673- case IDM_RESET_VIEWPOINT:
674- //視点リセット
675- result = _OnMenuResetViewpoint();
676- if (result != 0) goto EXIT;
677- break;
678- case IDM_VIEWPOINT2:
679- //静的視点2に移動
680- result = _OnMenuViewpoint(2);
681- if (result != 0) goto EXIT;
682- break;
683- case IDM_VIEWPOINT3:
684- //静的視点3に移動
685- result = _OnMenuViewpoint(3);
686- if (result != 0) goto EXIT;
687- break;
688765 case IDM_ENABLE_PIANOKEYBOARD:
689766 //表示効果:ピアノキーボード
690767 result = _OnMenuEnableEffect(MTScene::EffectPianoKeyboard);
@@ -727,11 +804,42 @@ LRESULT MIDITrailApp::_WndProcImpl(
727804 if (result != 0) goto EXIT;
728805 break;
729806 // <<< add 20180404 yossiepon end
807+ //自動視点保存と視点保存は廃止
808+ //case IDM_AUTO_SAVE_VIEWPOINT:
809+ // //自動視点保存
810+ // result = _OnMenuAutoSaveViewpoint();
811+ // if (result != 0) goto EXIT;
812+ // break;
813+ //case IDM_SAVE_VIEWPOINT:
814+ // //視点保存
815+ // result = _OnMenuSaveViewpoint();
816+ // if (result != 0) goto EXIT;
817+ // break;
818+ case IDM_RESET_VIEWPOINT:
819+ //静的視点1に移動(視点リセット)
820+ result = _OnMenuResetViewpoint();
821+ if (result != 0) goto EXIT;
822+ break;
823+ case IDM_VIEWPOINT2:
824+ //静的視点2に移動
825+ result = _OnMenuViewpoint(2);
826+ if (result != 0) goto EXIT;
827+ break;
828+ case IDM_VIEWPOINT3:
829+ //静的視点3に移動
830+ result = _OnMenuViewpoint(3);
831+ if (result != 0) goto EXIT;
832+ break;
730833 case IDM_WINDOWSIZE:
731834 //ウィンドウサイズ設定
732835 result = _OnMenuWindowSize();
733836 if (result != 0) goto EXIT;
734837 break;
838+ case IDM_FULLSCREEN:
839+ //フルスクリーン
840+ result = _OnMenuFullScreen();
841+ if (result != 0) goto EXIT;
842+ break;
735843 case IDM_OPTION_MIDIOUT:
736844 //MIDI出力デバイス設定
737845 result = _OnMenuOptionMIDIOUT();
@@ -781,6 +889,10 @@ LRESULT MIDITrailApp::_WndProcImpl(
781889 result = _OnMouseButtonDown(message, wParam, lParam);
782890 if (result != 0) goto EXIT;
783891 break;
892+ case WM_MOUSEMOVE:
893+ result = _OnMouseMove(message, wParam, lParam);
894+ if (result != 0) goto EXIT;
895+ break;
784896 case WM_DROPFILES:
785897 //ファイルドロップ
786898 result = _OnDropFiles(wParam, lParam);
@@ -802,6 +914,14 @@ LRESULT MIDITrailApp::_WndProcImpl(
802914 result = _OnFilePathPosted();
803915 if (result != 0) goto EXIT;
804916 break;
917+ case WM_SIZE:
918+ //ウィンドウサイズ変更
919+ if (wParam == SIZE_MAXIMIZED) {
920+ //最大化:フルスクリーン
921+ result = _OnMenuFullScreen();
922+ if (result != 0) goto EXIT;
923+ }
924+ break;
805925 default:
806926 lresult = DefWindowProc(hWnd, message, wParam, lParam);
807927 break;
@@ -840,6 +960,13 @@ int MIDITrailApp::_OnMenuFileOpen()
840960
841961 //ファイル選択時の処理
842962 if (isSelected) {
963+ //フルスクリーンでメニューからファイル選択した場合
964+ // シーン生成処理でクライアントウィンドウのサイズを参照しているため
965+ // 一時的に表示したメニューを非表示に戻しておく
966+ if (m_isFullScreen) {
967+ _HideMenu();
968+ }
969+
843970 //演奏/モニタ停止とファイルオープン処理
844971 result = _StopPlaybackAndOpenFile(filePath);
845972 if (result != 0) goto EXIT;
@@ -1378,6 +1505,21 @@ EXIT:;
13781505 }
13791506
13801507 //******************************************************************************
1508+// メニュー選択:フルスクリーン
1509+//******************************************************************************
1510+int MIDITrailApp::_OnMenuFullScreen()
1511+{
1512+ int result = 0;
1513+
1514+ //フルスクリーン切替
1515+ result = _ToggleFullScreen();
1516+ if (result != 0) goto EXIT;
1517+
1518+EXIT:;
1519+ return result;
1520+}
1521+
1522+//******************************************************************************
13811523 // メニュー選択:MIDI出力デバイス設定
13821524 //******************************************************************************
13831525 int MIDITrailApp::_OnMenuOptionMIDIOUT()
@@ -1615,11 +1757,46 @@ int MIDITrailApp::_OnMouseButtonDown(
16151757 )
16161758 {
16171759 int result = 0;
1618-
1760+
16191761 if ((m_pScene != NULL) && (m_PlayStatus != NoData)) {
16201762 result = m_pScene->OnWindowClicked(button, wParam, lParam);
16211763 if (result != 0) goto EXIT;
16221764 }
1765+
1766+EXIT:;
1767+ return result;
1768+}
1769+
1770+//******************************************************************************
1771+// マウス移動イベント
1772+//******************************************************************************
1773+int MIDITrailApp::_OnMouseMove(
1774+ UINT button,
1775+ WPARAM wParam,
1776+ LPARAM lParam
1777+ )
1778+{
1779+ int result = 0;
1780+ LONG apiresult = 0;
1781+ POINT point;
1782+
1783+ point.x = LOWORD(lParam);
1784+ point.y = HIWORD(lParam);
1785+
1786+ //フルスクリーンの場合
1787+ if (m_isFullScreen) {
1788+ //マウスカーソルがスクリーン上端に移動した場合
1789+ if (point.y == 0) {
1790+ //メニューバー表示
1791+ result = _ShowMenu();
1792+ if (result != 0) goto EXIT;
1793+ }
1794+ else {
1795+ //メニューバー非表示
1796+ result = _HideMenu();
1797+ if (result != 0) goto EXIT;
1798+ }
1799+ }
16231800
16241801 EXIT:;
16251802 return result;
@@ -1720,6 +1897,13 @@ int MIDITrailApp::_OnKeyDown(
17201897 if (result != 0) goto EXIT;
17211898 }
17221899 break;
1900+ case VK_F11:
1901+ //フルスクリーン
1902+ result = _OnMenuFullScreen();
1903+ if (result != 0) goto EXIT;
1904+ break;
1905+ default:
1906+ break;
17231907 }
17241908
17251909 EXIT:;
@@ -1791,7 +1975,7 @@ int MIDITrailApp::_OnDropFiles(
17911975
17921976 //演奏/モニタ停止とファイルオープン処理
17931977 result = _StopPlaybackAndOpenFile(path);
1794- if (result != 0) goto EXIT;
1978+ if (result != 0) goto EXIT;
17951979
17961980 EXIT:;
17971981 if (hDrop != NULL) {
@@ -2177,7 +2361,7 @@ int MIDITrailApp::_ChangePlayStatus(
21772361 //}
21782362
21792363 //常にファイルドラッグ許可
2180- DragAcceptFiles(m_hWnd, TRUE);
2364+ DragAcceptFiles(m_hWnd, TRUE);
21812365
21822366 //メニュースタイル更新
21832367 result = _ChangeMenuStyle();
@@ -2218,19 +2402,21 @@ int MIDITrailApp::_ChangeMenuStyle()
22182402 IDM_VIEW_2DPIANOROLL,
22192403 IDM_VIEW_PIANOROLLRAIN,
22202404 IDM_VIEW_PIANOROLLRAIN2D,
2221- IDM_RESET_VIEWPOINT,
2222- IDM_VIEWPOINT2,
2223- IDM_VIEWPOINT3,
22242405 IDM_ENABLE_PIANOKEYBOARD,
22252406 IDM_ENABLE_RIPPLE,
22262407 IDM_ENABLE_PITCHBEND,
22272408 IDM_ENABLE_STARS,
22282409 IDM_ENABLE_COUNTER,
2410+ IDM_ENABLE_BACKGROUNDIMAGE,
22292411 // >>> add 20180404 yossiepon begin
22302412 IDM_ENABLE_TIMEINDICATOR,
22312413 IDM_ENABLE_GRIDBOX,
22322414 // <<< add 20180404 yossiepon end
2415+ IDM_RESET_VIEWPOINT,
2416+ IDM_VIEWPOINT2,
2417+ IDM_VIEWPOINT3,
22332418 IDM_WINDOWSIZE,
2419+ IDM_FULLSCREEN,
22342420 IDM_OPTION_MIDIOUT,
22352421 IDM_OPTION_MIDIIN,
22362422 IDM_OPTION_GRAPHIC,
@@ -2260,9 +2446,6 @@ int MIDITrailApp::_ChangeMenuStyle()
22602446 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_2DPIANOROLL
22612447 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_PIANOROLLRAIN
22622448 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_VIEW_PIANOROLLRAIN2D
2263- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT
2264- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT2
2265- { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT3
22662449 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PIANOKEYBOARD
22672450 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_RIPPLE
22682451 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_PITCHBEND
@@ -2273,7 +2456,11 @@ int MIDITrailApp::_ChangeMenuStyle()
22732456 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_TIMEINDICATOR
22742457 { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_ENABLE_GRIDBOX
22752458 // <<< add 20180404 yossiepon end
2459+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_RESET_VIEWPOINT
2460+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT2
2461+ { MF_GRAYED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_VIEWPOINT3
22762462 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_WINDOWSIZE
2463+ { MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED, MF_ENABLED }, //IDM_FULLSCREEN
22772464 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_MIDIOUT
22782465 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_MIDIIN
22792466 { MF_ENABLED, MF_ENABLED, MF_GRAYED, MF_GRAYED, MF_ENABLED, MF_GRAYED }, //IDM_OPTION_GRAPHIC
@@ -2907,6 +3094,9 @@ int MIDITrailApp::_UpdateMenuCheckmark()
29073094 //自動視点保存
29083095 _CheckMenuItem(IDM_AUTO_SAVE_VIEWPOINT, m_isAutoSaveViewpoint);
29093096
3097+ //フルスクリーン
3098+ _CheckMenuItem(IDM_FULLSCREEN, m_isFullScreen);
3099+
29103100 EXIT:;
29113101 return result;
29123102 }
@@ -3506,3 +3696,174 @@ EXIT:;
35063696 return result;
35073697 }
35083698
3699+//******************************************************************************
3700+// フルスクリーン切替
3701+//******************************************************************************
3702+int MIDITrailApp::_ToggleFullScreen()
3703+{
3704+ int result = 0;
3705+
3706+ m_isFullScreen = m_isFullScreen ? false : true;
3707+
3708+ result = _ChangeWindowSize();
3709+ if (result != 0) goto EXIT;
3710+
3711+EXIT:;
3712+ return result;
3713+}
3714+
3715+//******************************************************************************
3716+// メニュー表示
3717+//******************************************************************************
3718+int MIDITrailApp::_ShowMenu()
3719+{
3720+ int result = 0;
3721+ LONG apiresult = 0;
3722+
3723+ //メニューバー表示処理
3724+ if (GetMenu(m_hWnd) == NULL) {
3725+ apiresult = SetMenu(m_hWnd, m_hMenu);
3726+ if (apiresult == 0) {
3727+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
3728+ goto EXIT;
3729+ }
3730+ }
3731+
3732+ //メニュー選択マーク更新
3733+ result = _UpdateMenuCheckmark();
3734+ if (result != 0) goto EXIT;
3735+
3736+ //メニュースタイル更新
3737+ result = _ChangeMenuStyle();
3738+ if (result != 0) goto EXIT;
3739+
3740+EXIT:;
3741+ return result;
3742+}
3743+
3744+//******************************************************************************
3745+// メニュー非表示
3746+//******************************************************************************
3747+int MIDITrailApp::_HideMenu()
3748+{
3749+ int result = 0;
3750+ LONG apiresult = 0;
3751+
3752+ //メニューバー非表示処理
3753+ //すでにメニューバー非表示なら何もしない
3754+ if (GetMenu(m_hWnd) != NULL) {
3755+ //GetMenuで取得したハンドルは破棄されない
3756+ apiresult = SetMenu(m_hWnd, NULL);
3757+ if (apiresult == 0) {
3758+ result = YN_SET_ERR("Windows API error.", GetLastError(), (DWORD64)m_hWnd);
3759+ goto EXIT;
3760+ }
3761+ }
3762+
3763+EXIT:;
3764+ return result;
3765+}
3766+
3767+//******************************************************************************
3768+// ゲームパッド操作処理
3769+//******************************************************************************
3770+int MIDITrailApp::_GamePadProc()
3771+{
3772+ int result = 0;
3773+
3774+ result = m_GamePadCtrl.UpdateState();
3775+ if (result != 0) goto EXIT;
3776+
3777+ //_RPTN(_CRT_WARN, "GamePad: %d %d\n", m_GamePadCtrl.DidPressNow_A(), m_GamePadCtrl.DidPressNow_B());
3778+
3779+ //スタート 押下
3780+ if (m_GamePadCtrl.DidPressNow_Start()) {
3781+ //演奏開始/一時停止
3782+ result = _OnMenuPlay();
3783+ if (result != 0) goto EXIT;
3784+ }
3785+
3786+ //ボタンA 押下
3787+ if (m_GamePadCtrl.DidPressNow_A()) {
3788+ //演奏開始/一時停止
3789+ result = _OnMenuPlay();
3790+ if (result != 0) goto EXIT;
3791+ }
3792+
3793+ //ボタンB 押下
3794+ if (m_GamePadCtrl.DidPressNow_B()) {
3795+ //演奏停止
3796+ result = _OnMenuStop();
3797+ if (result != 0) goto EXIT;
3798+ }
3799+
3800+ //左ショルダー 押下
3801+ if (m_GamePadCtrl.DidPressNow_LShoulder()) {
3802+ //視点切り替え
3803+ result = _ChangeViewPoint(-1);
3804+ if (result != 0) goto EXIT;
3805+ }
3806+
3807+ //右ショルダー 押下
3808+ if (m_GamePadCtrl.DidPressNow_RShoulder()) {
3809+ //視点切り替え
3810+ result = _ChangeViewPoint(+1);
3811+ if (result != 0) goto EXIT;
3812+ }
3813+
3814+ //左トリガー 押下
3815+ if (m_GamePadCtrl.DidPressNow_LTrigger()) {
3816+ //再生リワインド
3817+ result = _OnMenuSkipBack();
3818+ if (result != 0) goto EXIT;
3819+ }
3820+
3821+ //右トリガー 押下
3822+ if (m_GamePadCtrl.DidPressNow_RTrigger()) {
3823+ //再生スキップ
3824+ result = _OnMenuSkipForward();
3825+ if (result != 0) goto EXIT;
3826+ }
3827+
3828+EXIT:;
3829+ return result;
3830+}
3831+
3832+//******************************************************************************
3833+// 視点切り替え
3834+//******************************************************************************
3835+int MIDITrailApp::_ChangeViewPoint(int step)
3836+{
3837+ int result = 0;
3838+
3839+ //ゲームパッド用視点番号更新
3840+ m_GamePadViewPointNo += step;
3841+
3842+ if (m_GamePadViewPointNo < 0) {
3843+ m_GamePadViewPointNo = 2;
3844+ }
3845+ else if (m_GamePadViewPointNo > 2) {
3846+ m_GamePadViewPointNo = 0;
3847+ }
3848+
3849+ //視点切り替え
3850+ switch (m_GamePadViewPointNo) {
3851+ case 0:
3852+ result = _OnMenuResetViewpoint();
3853+ if (result != 0) goto EXIT;
3854+ break;
3855+ case 1:
3856+ result = _OnMenuViewpoint(2);
3857+ if (result != 0) goto EXIT;
3858+ break;
3859+ case 2:
3860+ result = _OnMenuViewpoint(3);
3861+ if (result != 0) goto EXIT;
3862+ break;
3863+ default:
3864+ break;
3865+ }
3866+
3867+EXIT:;
3868+ return result;
3869+}
--- 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,16 +37,15 @@ 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-// >>> modify 20180404 yossiepon begin
47-#define MT_MENU_NUM (34)
48-// <<< modify 20180404 yossiepon end
46+// >>> modify 20190828 yossiepon begin
47+#define MT_MENU_NUM (35)
48+// <<< modify 20190828 yossiepon end
4949 #define MT_PLAYSTATUS_NUM (6)
5050
5151 //デバイスロスト警告メッセージ
@@ -148,6 +148,8 @@ private:
148148 HACCEL m_Accel;
149149 TCHAR m_Title[MAX_LOADSTRING];
150150 TCHAR m_WndClassName[MAX_LOADSTRING];
151+ bool m_isFullScreen;
152+ HMENU m_hMenu;
151153
152154 //レンダリング系
153155 DXRenderer m_Renderer;
@@ -231,6 +233,12 @@ private:
231233 //次回オープン対象ファイルパス
232234 TCHAR m_NextFilePath[_MAX_PATH];
233235
236+ //ゲームパッド制御
237+ MTGamePadCtrl m_GamePadCtrl;
238+
239+ //ゲームパッド用視点番号
240+ int m_GamePadViewPointNo;
241+
234242 //----------------------------------------------------------------
235243 //メソッド定義
236244 //----------------------------------------------------------------
@@ -238,6 +246,7 @@ private:
238246 int _RegisterClass(HINSTANCE hInstance);
239247 int _CreateWindow(HINSTANCE hInstance, int nCmdShow);
240248 int _SetWindowSize();
249+ int _SetWindowSizeFullScreen();
241250
242251 //設定ファイル初期化
243252 int _InitConfFile();
@@ -266,6 +275,7 @@ private:
266275 int _OnMenuSaveViewpoint();
267276 int _OnMenuEnableEffect(MTScene::EffectType type);
268277 int _OnMenuWindowSize();
278+ int _OnMenuFullScreen();
269279 int _OnMenuOptionMIDIOUT();
270280 int _OnMenuOptionMIDIIN();
271281 int _OnMenuOptionGraphic();
@@ -277,6 +287,7 @@ private:
277287 int _SequencerMsgProc();
278288 int _OnRecvSequencerMsg(unsigned long wParam, unsigned long lParam);
279289 int _OnMouseButtonDown(UINT button, WPARAM wParam, LPARAM lParam);
290+ int _OnMouseMove(UINT button, WPARAM wParam, LPARAM lParam);
280291 int _OnKeyDown(WPARAM wParam, LPARAM lParam);
281292 int _OnDropFiles(WPARAM wParam, LPARAM lParam);
282293
@@ -318,6 +329,12 @@ private:
318329 int _PostFilePathToFirstMIDITrail(LPTSTR pCmdLine);
319330 int _StopPlaybackAndOpenFile(TCHAR* pFilePath);
320331 int _FileOpenProc(TCHAR* pFilePath);
321-
332+
333+ int _ToggleFullScreen();
334+ int _ShowMenu();
335+ int _HideMenu();
336+ int _GamePadProc();
337+ int _ChangeViewPoint(int step);
338+
322339 };
323340
--- a/MIDITrail/MIDITrailVersion.h
+++ b/MIDITrail/MIDITrailVersion.h
@@ -17,8 +17,8 @@
1717
1818 //バージョン文字列
1919 // >>> modify 20190828 yossiepon begin
20-#define MIDITRAIL_VERSION_STRING_X86 _T("1.2.5 (x86), mod. yossiepon_20190828")
21-#define MIDITRAIL_VERSION_STRING_X64 _T("1.2.5 (x64), mod. yossiepon_20190828")
20+#define MIDITRAIL_VERSION_STRING_X86 _T("1.2.6 (x86), mod. yossiepon_20190828")
21+#define MIDITRAIL_VERSION_STRING_X64 _T("1.2.6 (x64), mod. yossiepon_20190828")
2222 // <<< modify 20190828 yossiepon end
2323
2424 //コピーライト
--- 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
@@ -79,6 +79,7 @@
7979 #define IDM_ENABLE_BACKGROUNDIMAGE 32842
8080 #define IDM_VIEWPOINT2 32843
8181 #define IDM_VIEWPOINT3 32844
82+#define IDM_FULLSCREEN 32849
8283 #define IDC_STATIC -1
8384
8485 // Next default values for new objects
@@ -87,7 +88,7 @@
8788 #ifndef APSTUDIO_READONLY_SYMBOLS
8889 #define _APS_NO_MFC 1
8990 #define _APS_NEXT_RESOURCE_VALUE 134
90-#define _APS_NEXT_COMMAND_VALUE 32848
91+#define _APS_NEXT_COMMAND_VALUE 32850
9192 #define _APS_NEXT_CONTROL_VALUE 1025
9293 #define _APS_NEXT_SYMED_VALUE 110
9394 #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