OSDN Git Service

#30666 動作確認用に、DTXManiaプロジェクトにマクロ WindowedFullscreen を定義すると、解像度切り替えでないフルスクリーン切り替えの動作にな...
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 19 Feb 2013 16:34:51 +0000 (16:34 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 19 Feb 2013 16:34:51 +0000 (16:34 +0000)
#30666 タスクバーとウインドウの重なり発生時にFPSが落ちるかどうかのテストのため、タスクバーとスタートボタンを消去・再表示するための静的クラス CTaskBar をFDKに追加。(ただしDTXMania側での呼び出しを注釈化しており、現在未使用)

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@531 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
FDK17プロジェクト/FDK19.csproj
FDK17プロジェクト/コード/04.グラフィック/CTaskBar.cs [new file with mode: 0644]

index 3385690..29fb2bf 100644 (file)
@@ -39,7 +39,7 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">\r
     <DebugSymbols>true</DebugSymbols>\r
     <OutputPath>bin\x86\Debug\</OutputPath>\r
-    <DefineConstants>TRACE;DEBUG;TEST_ENGLISH_ TEST_Direct3D9Ex_</DefineConstants>\r
+    <DefineConstants>TRACE;DEBUG;TEST_ENGLISH_ TEST_Direct3D9Ex_ WindowedFullscreen</DefineConstants>\r
     <DebugType>full</DebugType>\r
     <PlatformTarget>x86</PlatformTarget>\r
     <ErrorReport>prompt</ErrorReport>\r
index 1fdecd9..13678ba 100644 (file)
@@ -308,49 +308,61 @@ namespace DTXMania
 \r
                public void t全画面・ウィンドウモード切り替え()\r
                {\r
+#if WindowedFullscreen\r
+                       if ( ConfigIni != null )\r
+#else\r
                        DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();\r
                        if ( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )\r
-                       //if ( ConfigIni != null )\r
+#endif\r
                        {\r
+#if !WindowedFullscreen\r
                                settings.Windowed = ConfigIni.bウィンドウモード;\r
+#endif\r
                                if ( ConfigIni.bウィンドウモード == false )     // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode\r
                                {\r
                                        currentClientSize = this.Window.ClientSize;\r
                                        ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;\r
                                        ConfigIni.nウインドウheight = this.Window.ClientSize.Height;\r
+//                                     FDK.CTaskBar.ShowTaskBar( false );\r
                                }\r
+#if !WindowedFullscreen\r
                                base.GraphicsDeviceManager.ChangeDevice( settings );\r
+#endif\r
                                if ( ConfigIni.bウィンドウモード == true )      // #23510 2010.10.27 yyagi: to resume window size from backuped value\r
                                {\r
+#if WindowedFullscreen\r
                                                                                                                        // #30666 2013.2.2 yyagi Don't use Fullscreen mode becasue NVIDIA GeForce is\r
                                                                                                                        // tend to delay drawing on Fullscreen mode. So DTXMania uses Maximized window\r
                                                                                                                        // in spite of using fullscreen mode.\r
-                                       //app.Window.WindowState = FormWindowState.Normal;\r
-                                       //app.Window.FormBorderStyle = FormBorderStyle.Sizable;\r
-                                       //app.Window.WindowState = FormWindowState.Normal;\r
-\r
+                                       app.Window.WindowState = FormWindowState.Normal;\r
+                                       app.Window.FormBorderStyle = FormBorderStyle.Sizable;\r
+                                       app.Window.WindowState = FormWindowState.Normal;\r
+#endif\r
                                        base.Window.ClientSize =\r
                                                new Size( currentClientSize.Width, currentClientSize.Height );\r
-                       }\r
+//                                     FDK.CTaskBar.ShowTaskBar( true );\r
+                               }\r
+#if WindowedFullscreen\r
                                else \r
                                {\r
-                                       //app.Window.WindowState = FormWindowState.Normal;\r
-                                       //app.Window.FormBorderStyle = FormBorderStyle.None;\r
-                                       //app.Window.WindowState = FormWindowState.Maximized;\r
-               }\r
-                               //if ( ConfigIni.bウィンドウモード )\r
-                               //{\r
-                               //    if ( !this.bマウスカーソル表示中 )\r
-                               //    {\r
-                               //        Cursor.Show();\r
-                               //        this.bマウスカーソル表示中 = true;\r
-                               //    }\r
-                               //}\r
-                               //else if ( this.bマウスカーソル表示中 )\r
-                               //{\r
-                               //    Cursor.Hide();\r
-                               //    this.bマウスカーソル表示中 = false;\r
-                               //}\r
+                                       app.Window.WindowState = FormWindowState.Normal;\r
+                                       app.Window.FormBorderStyle = FormBorderStyle.None;\r
+                                       app.Window.WindowState = FormWindowState.Maximized;\r
+                               }\r
+                               if ( ConfigIni.bウィンドウモード )\r
+                               {\r
+                                   if ( !this.bマウスカーソル表示中 )\r
+                                   {\r
+                                       Cursor.Show();\r
+                                       this.bマウスカーソル表示中 = true;\r
+                                   }\r
+                               }\r
+                               else if ( this.bマウスカーソル表示中 )\r
+                               {\r
+                                   Cursor.Hide();\r
+                                   this.bマウスカーソル表示中 = false;\r
+                               }\r
+#endif\r
                        }\r
                }\r
 \r
@@ -1524,10 +1536,14 @@ for (int i = 0; i < 3; i++) {
             base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y);   // #30675 2013.02.04 ikanick add\r
 \r
                        base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);   // #34510 yyagi 2010.10.31 to change window size got from Config.ini\r
+#if !WindowedFullscreen\r
                        if (!ConfigIni.bウィンドウモード)                                               // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode\r
                        {                                                                                                               // #30666 2013.02.02 yyagi: currentClientSize should be always made\r
+#endif\r
                                currentClientSize = new Size( ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight );\r
+#if !WindowedFullscreen\r
                        }\r
+#endif\r
                        base.Window.MaximizeBox = true;                                                 // #23510 2010.11.04 yyagi: to support maximizing window\r
                        base.Window.FormBorderStyle = FormBorderStyle.Sizable;  // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize\r
                                                                                                                                                // #30666 2013.02.02 yyagi: moved the code to t全画面・ウインドウモード切り替え()\r
@@ -1546,8 +1562,11 @@ for (int i = 0; i < 3; i++) {
                        #region [ Direct3D9 デバイスの生成 ]\r
                        //---------------------\r
                        DeviceSettings settings = new DeviceSettings();\r
+#if WindowedFullscreen\r
+                       settings.Windowed = true;                                                               // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode\r
+#else\r
                        settings.Windowed = ConfigIni.bウィンドウモード;\r
-                       //settings.Windowed = true;                                                             // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode\r
+#endif\r
                        settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;\r
                        settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;\r
 //                     settings.BackBufferCount = 3;\r
@@ -1574,7 +1593,9 @@ for (int i = 0; i < 3; i++) {
                        base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);   // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini.\r
                        base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms));    // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive\r
                                                                                                                                                                                                                                // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )\r
-                       //this.t全画面・ウィンドウモード切り替え();                             // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"\r
+#if WindowedFullscreen\r
+                       this.t全画面・ウィンドウモード切り替え();                               // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"\r
+#endif\r
                        actFlushGPU = new CActFlushGPU();\r
                        //---------------------\r
                        #endregion\r
@@ -1732,7 +1753,7 @@ for (int i = 0; i < 3; i++) {
                        {                               \r
                                ESoundDeviceType soundDeviceType;\r
                                switch ( CDTXMania.ConfigIni.nSoundDeviceType )\r
-                       {\r
+                               {\r
                                        case 0:\r
                                                soundDeviceType = ESoundDeviceType.DirectSound;\r
                                                break;\r
@@ -1745,7 +1766,7 @@ for (int i = 0; i < 3; i++) {
                                        default:\r
                                                soundDeviceType = ESoundDeviceType.Unknown;\r
                                                break;\r
-                       }\r
+                               }\r
                                Sound管理 = new CSound管理( base.Window.Handle,\r
                                                                                        soundDeviceType,\r
                                                                                        CDTXMania.ConfigIni.nWASAPIBufferSizeMs,\r
index dd3272a..938e5c9 100644 (file)
     <Compile Include="コード\04.グラフィック\BitmapUtil.cs" />\r
     <Compile Include="コード\04.グラフィック\CAero.cs" />\r
     <Compile Include="コード\04.グラフィック\CAvi.cs" />\r
+    <Compile Include="コード\04.グラフィック\CTaskBar.cs" />\r
     <Compile Include="コード\04.グラフィック\頂点フォーマット%28Vertex%29\ColoredVertex.cs" />\r
     <Compile Include="コード\04.グラフィック\CTexture.cs" />\r
     <Compile Include="コード\04.グラフィック\CTextureCreateFailedException.cs" />\r
diff --git a/FDK17プロジェクト/コード/04.グラフィック/CTaskBar.cs b/FDK17プロジェクト/コード/04.グラフィック/CTaskBar.cs
new file mode 100644 (file)
index 0000000..eb0173b
--- /dev/null
@@ -0,0 +1,145 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Reflection;\r
+using System.Windows.Forms;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace FDK\r
+{\r
+       // referenced from http://dalmore.blog7.fc2.com/blog-entry-34.html\r
+\r
+       public static class CTaskBar\r
+       {\r
+               public static void ShowTaskBar( bool bShowTaskBar )\r
+               {\r
+                       Int32 hWnd1 = FindWindow( "Shell_TrayWnd", null );\r
+                       if( hWnd1 != 0 )\r
+                       {             //タスクバーの表示\r
+                               if ( bShowTaskBar )\r
+                               {\r
+                                       ShowWindow( hWnd1, TASKBAR_SHOW );                             //// タスクバーを常に表示\r
+                               }\r
+                               else\r
+                               {\r
+                                       ShowWindow( hWnd1, TASKBAR_HIDE );\r
+                               }\r
+                               APPBARDATA pData = new APPBARDATA();\r
+                               pData.cbSize = Marshal.SizeOf( pData );\r
+                               pData.hWnd = (IntPtr)hWnd1;\r
+                               pData.lParam = (int)ABMsg.ABM_NEW;      //REMOVEにするとオートハイドになる\r
+                               //タスクバーにメッセージ送信\r
+                               SHAppBarMessage( ABMsg.ABM_SETSTATE, ref pData );\r
+                       }\r
+\r
+                       Int32 hWnd2 = FindWindow( "Button", "スタート" );\r
+                       if ( hWnd2 != 0 )\r
+                       {             //タスクバーの表示\r
+                               if ( bShowTaskBar )\r
+                               {\r
+                                       ShowWindow( hWnd2, TASKBAR_SHOW );                             //// タスクバーを常に表示\r
+                               }\r
+                               else\r
+                               {\r
+                                       ShowWindow( hWnd2, TASKBAR_HIDE );\r
+                               }\r
+                               APPBARDATA pData = new APPBARDATA();\r
+                               pData.cbSize = Marshal.SizeOf( pData );\r
+                               pData.hWnd = (IntPtr) hWnd2;\r
+                               pData.lParam = (int) ABMsg.ABM_NEW;     //REMOVEにするとオートハイドになる\r
+                               //タスクバーにメッセージ送信\r
+                               SHAppBarMessage( ABMsg.ABM_SETSTATE, ref pData );\r
+                       }\r
+               }\r
+\r
+               /// <summary>\r
+               /// ABMsg 送るAppBarメッセージの識別子(以下のいずれか1つ)\r
+               /// ・ABM_ACTIVATE---AppBarがアクティブになった事をシステムに通知\r
+               /// ・ABM_GETAUTOHIDEBAR---スクリーンの特定の端に関連付けられているオートハイドAppBarのハンドルを返す\r
+               /// ・ABM_GETSTATE---タスクバーがオートハイドか常に最前面のどちらの常態にあるかを返す\r
+               /// ・ABM_GETTASKBARPOS---タスクバーの使用領域を返す\r
+               /// ・ABM_NEW---新しいAppBarを登録し、システムが通知に使用するメッセージIDを指定する\r
+               /// ・ABM_QUERYPOS---AppBarのためのサイズとスクリーン位置を要求する\r
+               /// ・ABM_REMOVE---AppBarの登録を削除する\r
+               /// ・ABM_SETAUTOHIDEBAR---スクリーンの端にオートハイドAppBarを登録または削除する\r
+               /// ・ABM_SETPOS---AppBarのサイズとスクリーン座標を設定する\r
+               /// ・ABM_WINDOWPOSCHANGED---AppBarの位置が変更されたことをシステムに通知する\r
+               /// pData: TAppBarData構造体(各フィールドはdwMessageに依存する)\r
+               /// </summary>\r
+               private enum ABMsg : int\r
+               {\r
+                       ABM_NEW = 0,\r
+                       ABM_REMOVE = 1,\r
+                       ABM_QUERYPOS = 2,\r
+                       ABM_SETPOS = 3,\r
+                       ABM_GETSTATE = 4,\r
+                       ABM_GETTASKBARPOS = 5,\r
+                       ABM_ACTIVATE = 6,\r
+                       ABM_GETAUTOHIDEBAR = 7,\r
+                       ABM_SETAUTOHIDEBAR = 8,\r
+                       ABM_WINDOWPOSCHANGED = 9,\r
+                       ABM_SETSTATE = 10\r
+               }\r
+\r
+               /// <summary>\r
+               /// APPBARDATA SHAppBarMessage関数にて使用されるAppBarに関する構造体。\r
+               /// cbSize.....SizeOf(TAppBarData)\r
+               /// hWnd.....AppBarのハンドル\r
+               /// uCallbackMessage.....任意のメッセージID(hWndのAppBarにメッセージを通知する際(ABM_NEWメッセージを送る際)に使用)\r
+               /// uEdge.....スクリーンの端を指定するフラグ(ABM_GETAUTOHIDEBAR、ABM_QUERYPOS、ABM_SETAUTOHIDEBAR、ABM_SETPOSメッセージを送る際に使用し、以下のいずれか1つ)\r
+               /// ・ABE_BOTTOM---下サイド\r
+               /// ・ABE_LEFT--- 左サイド\r
+               /// ・ABE_RIGHT---右サイド\r
+               /// ・ABE_TOP---上サイド\r
+               /// rc.....AppBarやタスクバーのスクリーン座標での表示領域(ABM_GETTASKBARPOS、ABM_QUERYPOS、ABM_SETPOSメッセージを送る際に使用する)\r
+               /// lParam.....メッセージ依存のパラメータ(ABM_SETAUTOHIDEBARメッセージと共に使用される)\r
+               /// </summary>\r
+               [StructLayout( LayoutKind.Sequential )]\r
+               private struct APPBARDATA\r
+               {\r
+                       public int cbSize;\r
+                       public IntPtr hWnd;\r
+                       public uint uCallbackMessage;\r
+                       public ABEdge uEdge;\r
+                       public RECT rc;\r
+                       public int lParam;\r
+               }\r
+               /// <summary>\r
+               /// ABEdge\r
+               /// </summary>\r
+               private enum ABEdge : int\r
+               {\r
+                       ABE_LEFT = 0,\r
+                       ABE_TOP = 1,\r
+                       ABE_RIGHT = 2,\r
+                       ABE_BOTTOM = 3\r
+               }\r
+               /// <summary>\r
+               /// RECT\r
+               /// </summary>\r
+               [StructLayout( LayoutKind.Sequential )]\r
+               private struct RECT\r
+               {\r
+                       public int left;\r
+                       public int top;\r
+                       public int right;\r
+                       public int bottom;\r
+               }\r
+               /// <summary>\r
+               /// SHAppBarMessage\r
+               /// </summary>\r
+               /// <param name="dwMessage"></param>\r
+               /// <param name="pData"></param>\r
+               /// <returns></returns>\r
+               [DllImport( "shell32.dll", CallingConvention = CallingConvention.StdCall )]\r
+               private static extern int SHAppBarMessage( ABMsg dwMessage, ref APPBARDATA pData );\r
+\r
+               [DllImport("user32.dll", EntryPoint = "ShowWindow")]\r
+               private static extern int ShowWindow(Int32 hWnd, int nCmdShow);\r
+               private const int TASKBAR_HIDE = 0;\r
+               private const int TASKBAR_SHOW = 5;\r
+\r
+               [DllImport( "user32.dll", EntryPoint = "FindWindow" )]\r
+               private static extern Int32 FindWindow( String lpClassName, String lpWindowName );\r
+       }\r
+}\r