OSDN Git Service

背景を透明化することができた。
[winaudioj/winwrapper.git] / winwrapper / sf_windows.cpp
index 2001601..cd62341 100644 (file)
@@ -14,6 +14,7 @@
 #include "sf_windows.h"\r
 #include "exception.h"\r
 \r
+#pragma comment(lib,"dxerr.lib")\r
 #pragma comment( lib, "dxguid.lib" )\r
 #pragma comment( lib, "d3d11.lib" )\r
 #pragma comment( lib, "d3dx11.lib" )\r
@@ -33,6 +34,28 @@ using namespace std;
 \r
 namespace sf \r
 {\r
+  HRESULT EnableBlurBehind(HWND hwnd)\r
+  {\r
+    HRESULT hr = S_OK;\r
+\r
+    ////Create and populate the BlurBehind structre\r
+    //DWM_BLURBEHIND bb = {0};\r
+    ////Enable Blur Behind and Blur Region;\r
+    //bb.dwFlags = DWM_BB_ENABLE;\r
+    //bb.fEnable = true;\r
+    //bb.hRgnBlur = NULL;\r
+\r
+    ////Enable Blur Behind\r
+    //hr = DwmEnableBlurBehindWindow(hwnd, &bb);\r
+    //if (SUCCEEDED(hr))\r
+    //{\r
+    //  //do more things\r
+    MARGINS mgn = {-1};\r
+    hr = DwmExtendFrameIntoClientArea( hwnd, &mgn );\r
+    /*   }*/\r
+    return hr;\r
+  }\r
+\r
   // 汎用情報格納用\r
   struct mode_info \r
   {\r
@@ -209,23 +232,23 @@ namespace sf
     case WM_LBUTTONDOWN:\r
       return on_left_mouse_button_down(\r
         wParam,dpi_.scale_x(\r
-          GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
-          ;\r
+        GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
+        ;\r
       ;\r
     case WM_LBUTTONUP:\r
       return on_left_mouse_button_up(\r
         wParam,dpi_.scale_x(\r
-          GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
-          ;\r
+        GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
+        ;\r
     case WM_LBUTTONDBLCLK:\r
       return on_left_mouse_button_double_click(wParam,\r
         dpi_.scale_x(\r
-          GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
-          ;\r
+        GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
+        ;\r
     case WM_MOUSEMOVE:\r
       {\r
-         return on_mouse_move(wParam,\r
-        dpi_.scale_x(\r
+        return on_mouse_move(wParam,\r
+          dpi_.scale_x(\r
           GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
           ;\r
         //                                     on_mouse_move(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),wParam); \r
@@ -233,8 +256,8 @@ namespace sf
     case WM_MOUSEWHEEL:\r
       return on_mouse_wheel(GET_KEYSTATE_WPARAM(wParam),GET_WHEEL_DELTA_WPARAM(wParam),\r
         dpi_.scale_x(\r
-          GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
-          ;\r
+        GET_X_LPARAM(lParam)),dpi_.scale_y(GET_Y_LPARAM(lParam)))\r
+        ;\r
     case WM_MOUSELEAVE:\r
       return on_mouse_leave() ;\r
     case WM_KEYDOWN:\r
@@ -259,8 +282,8 @@ namespace sf
     return other_window_proc(hwnd,message,wParam,lParam);\r
 \r
   };\r
-  \r
-   template <typename ProcType> \r
+\r
+  template <typename ProcType> \r
   void base_win32_window<ProcType>::register_class (\r
     const wchar_t * menu_name,\r
     uint32_t        style ,\r
@@ -295,14 +318,16 @@ namespace sf
 \r
 \r
     // Windowを作成する\r
-    CreateWindow(\r
+    // Windowを作成する\r
+    CreateWindowEx(\r
+      WS_EX_APPWINDOW | WS_EX_LAYERED ,\r
       name_.c_str(),\r
       title_.c_str(),\r
       WS_OVERLAPPEDWINDOW,\r
       CW_USEDEFAULT,\r
       CW_USEDEFAULT,\r
       static_cast<uint32_t>(dpi_.scale_x(width_)),\r
-      static_cast<uint32_t>(dpi_.scale_y(height_)),\r
+      static_cast<uint32_t>(dpi_.scale_x(height_)),\r
       NULL,\r
       NULL,\r
       HINST_THISCOMPONENT,\r
@@ -311,7 +336,7 @@ namespace sf
     ::GetWindowPlacement(hwnd_,&wp_);\r
   }\r
 \r
\r
+\r
   //void base_win32_window::show() \r
   //{\r
   //  //HRESULT hr = S_OK;\r
@@ -343,7 +368,7 @@ namespace sf
 \r
   template <typename ProcType> \r
   base_win32_window<ProcType>::base_win32_window(const std::wstring& title,const std::wstring& name,bool fit_to_display,float width,float height)\r
-    : title_(title),name_(name),fit_to_display_(fit_to_display),width_(width),height_(height),thunk_(this,reinterpret_cast<ProcType::proc_type>(base_win32_window::WndProc)),hwnd_(0),timer_(*this,100)\r
+    : title_(title),name_(name),fit_to_display_(fit_to_display),width_(width),height_(height),thunk_(this,reinterpret_cast<ProcType::proc_type>(base_win32_window::WndProc)),hwnd_(0),timer_(*this,10)\r
   {\r
     memset(&wp_,0,sizeof(wp_));\r
     wp_.length = sizeof(WINDOWPLACEMENT);\r
@@ -361,7 +386,7 @@ namespace sf
   template <typename ProcType> \r
   void  base_win32_window<ProcType>::create_device_independent_resources()\r
   {\r
-    \r
+\r
     // DXGI Factory の 生成\r
 \r
     if(!dxgi_factory_)\r
@@ -374,10 +399,12 @@ namespace sf
 \r
   template <typename ProcType> \r
   void  base_win32_window<ProcType>::create_device(){\r
-   calc_client_size();\r
+    calc_client_size();\r
     HRESULT hr = S_OK;\r
     init_ = false;\r
\r
+    RECT rc;\r
+    GetWindowRect(hwnd_,&rc);\r
+\r
     // アダプタデバイス情報の取得\r
     //LARGE_INTEGER version;\r
     THROW_IFERR(dxgi_factory_->EnumAdapters1(0,&adapter_));\r
@@ -409,25 +436,26 @@ namespace sf
 \r
     // MSAA\r
     DXGI_SAMPLE_DESC msaa;\r
-         for(int i = 0; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i++){\r
-                 UINT q;\r
-                 if SUCCEEDED(d3d_device_->CheckMultisampleQualityLevels(DXGI_FORMAT_D24_UNORM_S8_UINT, i, &q)){\r
-                         if(1 < q){\r
-                                 msaa.Count = i;\r
-                                 msaa.Quality = q - 1;\r
+    for(int i = 0; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i++){\r
+      UINT q;\r
+      if SUCCEEDED(d3d_device_->CheckMultisampleQualityLevels(DXGI_FORMAT_D24_UNORM_S8_UINT, i, &q)){\r
+        if(1 < q){\r
+          msaa.Count = i;\r
+          msaa.Quality = q - 1;\r
           break;\r
-                         }\r
-                 }\r
-         }\r
+        }\r
+      }\r
+    }\r
 \r
     // 表示モード\r
     DXGI_MODE_DESC desired_desc = {} , actual_desc = {};\r
     // 各色8ビットで符号化なし正規化数\r
-    desired_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;\r
+    desired_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;\r
     desired_desc.Height = client_height_;// 高さ\r
     desired_desc.Width = client_width_;// 幅\r
     desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし\r
     // リフレッシュレートを60Hzを要求する\r
+\r
     desired_desc.RefreshRate.Numerator = 60000;\r
     desired_desc.RefreshRate.Denominator = 1000;\r
     // 近いモードを検索\r
@@ -441,11 +469,11 @@ namespace sf
       desc.SampleDesc.Count    = 1;\r
       desc.BufferUsage                 = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r
       desc.BufferCount                 = 1;\r
-//      desc.SampleDesc = msaa;\r
+      //      desc.SampleDesc = msaa;\r
       desc.OutputWindow                = hwnd_;\r
//     desc.SwapEffect                        = DXGI_SWAP_EFFECT_;\r
     //desc.SwapEffect                        = DXGI_SWAP_EFFECT_DISCARD;\r
       desc.Windowed                    = TRUE;\r
-      desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;\r
+      desc.Flags = DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE;\r
 \r
       THROW_IFERR(dxgi_factory_->CreateSwapChain(d3d_device_,&desc,&swap_chain_));\r
 \r
@@ -462,13 +490,13 @@ namespace sf
       compile_flag |= D3DCOMPILE_DEBUG;\r
 #endif\r
       HRESULT hr = D3DX11CompileFromFile( L"dxgi_test.fx", NULL, NULL, "VS", "vs_5_0", \r
-         compile_flag, 0, NULL, &vsblob, &vserrblob, NULL );\r
+        compile_flag, 0, NULL, &vsblob, &vserrblob, NULL );\r
       if( FAILED( hr ) )\r
       {\r
-          if( vserrblob != NULL )\r
-              OutputDebugStringA( (char*)vserrblob->GetBufferPointer() );\r
-          if( vserrblob ) vserrblob.Release();\r
-          throw sf::win32_error_exception(hr);\r
+        if( vserrblob != NULL )\r
+          OutputDebugStringA( (char*)vserrblob->GetBufferPointer() );\r
+        if( vserrblob ) vserrblob.Release();\r
+        throw sf::win32_error_exception(hr);\r
       }\r
 \r
       // バーテックスシェーダの生成\r
@@ -476,16 +504,16 @@ namespace sf
 \r
       // 入力頂点レイアウトの定義\r
       D3D11_INPUT_ELEMENT_DESC\r
-       layout[] = {\r
-      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r
-      { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r
-      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }};\r
-      ;\r
+        layout[] = {\r
+          { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r
+          { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r
+          { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }};\r
+          ;\r
 \r
-      // 入力頂点レイアウトの生成\r
-      THROW_IFERR(d3d_device_->CreateInputLayout( layout, ARRAYSIZE(layout), vsblob->GetBufferPointer(),\r
-                                          vsblob->GetBufferSize(), &input_layout_ ));\r
-      vsblob.Release();\r
+          // 入力頂点レイアウトの生成\r
+          THROW_IFERR(d3d_device_->CreateInputLayout( layout, ARRAYSIZE(layout), vsblob->GetBufferPointer(),\r
+            vsblob->GetBufferSize(), &input_layout_ ));\r
+          vsblob.Release();\r
     }\r
 \r
     // 入力レイアウトの設定\r
@@ -499,13 +527,13 @@ namespace sf
       compile_flag |= D3DCOMPILE_DEBUG;\r
 #endif\r
       HRESULT hr = D3DX11CompileFromFile( L"dxgi_test.fx", NULL, NULL, "PS", "ps_5_0", \r
-         compile_flag, 0, NULL, &psblob, &pserror, NULL );\r
+        compile_flag, 0, NULL, &psblob, &pserror, NULL );\r
       if( FAILED( hr ) )\r
       {\r
-          if( pserror != NULL )\r
-              OutputDebugStringA( (char*)pserror->GetBufferPointer() );\r
-          safe_release(pserror);\r
-          throw sf::win32_error_exception(hr);\r
+        if( pserror != NULL )\r
+          OutputDebugStringA( (char*)pserror->GetBufferPointer() );\r
+        safe_release(pserror);\r
+        throw sf::win32_error_exception(hr);\r
       }\r
 \r
       // ピクセルシェーダの作成\r
@@ -515,38 +543,38 @@ namespace sf
     }\r
 \r
     // バーテックスバッファの作成\r
- // Create vertex buffer\r
   // Create vertex buffer\r
     simple_vertex vertices[] =\r
     {\r
-        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ),XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) ,XMFLOAT2( 0.0f, 1.0f ) },\r
-\r
-        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, -1.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),  XMFLOAT3( 0.0f, -1.0f, 0.0f ) ,XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) , XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ),XMFLOAT2( 0.0f, 1.0f ) },\r
-\r
-        { XMFLOAT3( -1.0f, -1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ),XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( -1.0f, 1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },\r
-\r
-        { XMFLOAT3( 1.0f, -1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },\r
-\r
-        { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( -1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 1.0f ) },\r
-\r
-        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 1.0f, 0.0f ) },\r
-        { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 0.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
-        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ),XMFLOAT2( 0.0f, 1.0f ) }\r
+      { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ),XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 1.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) ,XMFLOAT2( 0.0f, 1.0f ) },\r
+\r
+      { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, -1.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, -1.0f, -1.0f ),  XMFLOAT3( 0.0f, -1.0f, 0.0f ) ,XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ) , XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, -1.0f, 0.0f ),XMFLOAT2( 0.0f, 1.0f ) },\r
+\r
+      { XMFLOAT3( -1.0f, -1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT3( -1.0f, 0.0f, 0.0f ),XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( -1.0f, 1.0f, 1.0f ),XMFLOAT3( -1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },\r
+\r
+      { XMFLOAT3( 1.0f, -1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 1.0f, 0.0f, 0.0f ), XMFLOAT2( 0.0f, 1.0f ) },\r
+\r
+      { XMFLOAT3( -1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, -1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( -1.0f, 1.0f, -1.0f ),XMFLOAT3( 0.0f, 0.0f, -1.0f ) , XMFLOAT2( 0.0f, 1.0f ) },\r
+\r
+      { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 0.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) , XMFLOAT2( 1.0f, 0.0f ) },\r
+      { XMFLOAT3( 1.0f, 1.0f, 1.0f ),XMFLOAT3( 0.0f, 0.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },\r
+      { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ),XMFLOAT2( 0.0f, 1.0f ) }\r
     };\r
     //std::vector<simple_vertex> vertices = boost::assign::list_of<simple_vertex>\r
     //\r
@@ -598,23 +626,23 @@ namespace sf
     // インデックスバッファの生成\r
     WORD indices[] =\r
     {\r
-        3,1,0,\r
-        2,1,3,\r
+      3,1,0,\r
+      2,1,3,\r
 \r
-        6,4,5,\r
-        7,4,6,\r
+      6,4,5,\r
+      7,4,6,\r
 \r
-        11,9,8,\r
-        10,9,11,\r
+      11,9,8,\r
+      10,9,11,\r
 \r
-        14,12,13,\r
-        15,12,14,\r
+      14,12,13,\r
+      15,12,14,\r
 \r
-        19,17,16,\r
-        18,17,19,\r
+      19,17,16,\r
+      18,17,19,\r
 \r
-        22,20,21,\r
-        23,20,22\r
+      22,20,21,\r
+      23,20,22\r
     };\r
 \r
     bd.Usage = D3D11_USAGE_DEFAULT;\r
@@ -636,10 +664,10 @@ namespace sf
     bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;\r
     bd.CPUAccessFlags = 0;\r
     THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_never_changes_ ));\r
-    \r
+\r
     bd.ByteWidth = sizeof(cb_change_on_resize);\r
     THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_change_on_resize_ ));\r
-    \r
+\r
     bd.ByteWidth = sizeof(cb_changes_every_frame);\r
     THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_changes_every_frame_ ));\r
 \r
@@ -676,7 +704,8 @@ namespace sf
     d3d_context_->UpdateSubresource( cb_never_changes_, 0, NULL, &cnc, 0, 0 );\r
 \r
     // 投影行列のセットアップ\r
-    mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, client_width_ / client_height_, 0.01f, 100.0f );\r
+\r
+    mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, /*(rc.right - rc.left)/(rc.bottom - rc.top)*/client_width_ / client_height_, 0.01f, 100.0f );\r
     cb_change_on_resize ccor;\r
     ccor.mProjection = XMMatrixTranspose( mat_projection_ );\r
     // 定数バッファに格納\r
@@ -685,19 +714,24 @@ namespace sf
     init_ = true;// 初期化完了\r
   }\r
 \r
- template <typename ProcType> \r
 template <typename ProcType> \r
   void  base_win32_window<ProcType>::create_swapchain_dependent_resources()\r
   {\r
 \r
-       // ビューの作成\r
+    // ビューの作成\r
     THROW_IF_ERR(swap_chain_->GetBuffer(0,texture_.GetIID(),(void**)&texture_));\r
+    D3D11_TEXTURE2D_DESC desc;\r
+    texture_->GetDesc(&desc);\r
+\r
     THROW_IF_ERR(d3d_device_->CreateRenderTargetView(texture_,0,&view_));\r
     texture_.Release();\r
 \r
+    RECT rc;\r
+    GetWindowRect(hwnd_,&rc);\r
     // 深度バッファの作成\r
     D3D11_TEXTURE2D_DESC depth = {} ;\r
-    depth.Width = client_width_;\r
-    depth.Height = client_height_;\r
+    depth.Width = desc.Width;//rc.right - rc.left;client_width_;\r
+    depth.Height = desc.Height;//rc.bottom - rc.top;client_height_;\r
     depth.MipLevels = 1;\r
     depth.ArraySize = 1;\r
     depth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;\r
@@ -717,11 +751,11 @@ namespace sf
 \r
     // OMステージに登録する\r
     d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
-  \r
+\r
     // ビューポートの設定\r
     D3D11_VIEWPORT vp;\r
-    vp.Width = client_width_;\r
-    vp.Height = client_height_;\r
+    vp.Width = depth.Width;//client_width_;\r
+    vp.Height = depth.Height;//client_height_;\r
     vp.MinDepth = 0.0f;\r
     vp.MaxDepth = 1.0f;\r
     vp.TopLeftX = 0;\r
@@ -729,7 +763,7 @@ namespace sf
     d3d_context_->RSSetViewports( 1, &vp );\r
   }\r
 \r
- template <typename ProcType> \r
 template <typename ProcType> \r
   void  base_win32_window<ProcType>::discard_swapchain_dependent_resources()\r
   {\r
     safe_release(depth_view_);\r
@@ -764,7 +798,7 @@ namespace sf
     safe_release(dxgi_factory_);\r
   }\r
 \r
-    template <typename ProcType> \r
+  template <typename ProcType> \r
   void  base_win32_window<ProcType>::get_dxgi_information()\r
   {\r
     int i = 0;\r
@@ -779,7 +813,7 @@ namespace sf
       DXGI_ADAPTER_DESC1 desc;\r
       adapter->GetDesc1(&desc);\r
       //adapter->CheckInterfaceSupport();\r
-      \r
+\r
       wdout << desc.Description << std::endl;\r
       wdout << desc.DedicatedVideoMemory << std::endl;\r
       IDXGIDevice1Ptr device;\r
@@ -815,7 +849,7 @@ namespace sf
             %  scanline_orders[mode.ScanlineOrdering].description\r
             << std::endl;\r
         }\r
-//        output->\r
+        //        output->\r
         wdout << output_desc.DeviceName << std::endl; \r
         oi++;\r
       }\r
@@ -831,7 +865,7 @@ namespace sf
     {\r
       calc_client_size();\r
       discard_swapchain_dependent_resources();\r
-      swap_chain_->ResizeBuffers(0,0,0,DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH);\r
+      swap_chain_->ResizeBuffers(0,0,0,DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE);\r
       create_swapchain_dependent_resources();\r
       // 投影行列のセットアップ\r
       mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, client_width_ / client_height_, 0.01f, 100.0f );\r
@@ -844,78 +878,125 @@ namespace sf
     return std::is_same<proc_t,wndproc>::value?0:FALSE;  \r
   }\r
 \r
- template <typename ProcType>\r
- typename base_win32_window<ProcType>::result_t base_win32_window<ProcType>::on_create(CREATESTRUCT *p)\r
- {\r
-   create_device();\r
-   //timer_.start();\r
-   return std::is_same<proc_t,wndproc>::value?0:FALSE;\r
- }\r
-\r
- template <typename ProcType>\r
- typename base_win32_window<ProcType>::result_t base_win32_window<ProcType>::on_paint() \r
- {\r
-   sf::paint_struct p(hwnd_);\r
-   render();\r
-   return std::is_same<proc_t,wndproc>::value?0:FALSE;\r
- }\r
-\r
- template <typename ProcType>\r
- void base_win32_window<ProcType>::render()\r
- {\r
-   static float t = 0.0f;\r
-\r
-   static DWORD time_start = 0;\r
-\r
-   if(init_)\r
-   {\r
-\r
-     float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f };    \r
-\r
-     // 描画ターゲットのクリア\r
-     d3d_context_->ClearRenderTargetView(view_,color);\r
-     // 深度バッファのクリア\r
-     d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );\r
-\r
-     DWORD time_count = GetTickCount();\r
-     if( time_start == 0 )\r
-       time_start = time_count;\r
-     t = ( time_count - time_start ) / 1000.0f;\r
-\r
-     // Y軸で回転させる\r
-     mat_world_ = XMMatrixRotationY( t );\r
-\r
-     // 色の変更\r
-     mesh_color_.x = ( sinf( t * 1.0f ) + 1.0f ) * 0.5f;\r
-     mesh_color_.y = ( cosf( t * 3.0f ) + 1.0f ) * 0.5f;\r
-     mesh_color_.z = ( sinf( t * 5.0f ) + 1.0f ) * 0.5f;\r
-\r
-\r
-     // 定数更新\r
-     cb_changes_every_frame cb;\r
-\r
-     cb.mWorld = XMMatrixTranspose( mat_world_ );\r
-     cb.vLightColor = mesh_color_;\r
-     d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 );\r
-\r
-     // 立方体の描画\r
-     d3d_context_->VSSetShader( v_shader_, NULL, 0 );\r
-     d3d_context_->VSSetConstantBuffers( 0, 1, &cb_never_changes_.GetInterfacePtr() );\r
-     d3d_context_->VSSetConstantBuffers( 1, 1, &cb_change_on_resize_.GetInterfacePtr() );\r
-     d3d_context_->VSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );\r
-     d3d_context_->PSSetShader( p_shader_, NULL, 0 );\r
-     d3d_context_->PSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );\r
-     d3d_context_->PSSetShaderResources( 0, 1, &shader_res_view_.GetInterfacePtr() );\r
-     d3d_context_->PSSetSamplers( 0, 1, &sampler_state_.GetInterfacePtr() );\r
+  template <typename ProcType>\r
+  typename base_win32_window<ProcType>::result_t base_win32_window<ProcType>::on_create(CREATESTRUCT *p)\r
+  {\r
+    // DWM API\r
+    //BOOL dwmEnable;\r
+    //DwmIsCompositionEnabled (&dwmEnable); \r
+    //if (dwmEnable) EnableBlurBehind(hwnd_);\r
+    //DwmEnableComposition(DWM_EC_DISABLECOMPOSITION );\r
+\r
+    // ウィンドウ全体を半透明にする\r
+    //SetLayeredWindowAttributes(\r
+    //  hwnd_,\r
+    //  RGB(0,0,0), // color key\r
+    //  100, // alpha value\r
+    //  LWA_ALPHA | LWA_COLORKEY);\r
+\r
+    // ウィンドウの指定領域を半透明にする\r
+\r
+    create_device();\r
+\r
+    timer_.start();\r
+    //show();\r
+    show();\r
+    text(title_);\r
+    return std::is_same<proc_t,wndproc>::value?0:FALSE;\r
+  }\r
 \r
-     d3d_context_->DrawIndexed( 36, 0, 0 );\r
+  template <typename ProcType>\r
+  typename base_win32_window<ProcType>::result_t base_win32_window<ProcType>::on_paint() \r
+  {\r
+    //{\r
+    sf::paint_struct p(hwnd_);\r
+    //  gdi_object<HBRUSH> brush(::CreateSolidBrush(RGB(255,0,0)));\r
+    //  {\r
+    //    FillRect(p->hdc,&p->rcPaint,brush);\r
+    //  }\r
+    //}\r
+    render();\r
+    return std::is_same<proc_t,wndproc>::value?0:FALSE;\r
+  }\r
 \r
-     // 表示\r
-     swap_chain_->Present(1,0);\r
+  template <typename ProcType>\r
+  void base_win32_window<ProcType>::render()\r
+  {\r
+    static float t = 0.0f;\r
+    static DWORD time_start = 0;\r
+    if(init_)\r
+    {\r
 \r
-   }\r
+      float color[4] = { 1.0f, 0.0f, 0.0f, 0.0f };    \r
+\r
+\r
+      // 描画ターゲットのクリア\r
+      d3d_context_->ClearRenderTargetView(view_,color);\r
+      // 深度バッファのクリア\r
+      d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );\r
+\r
+      DWORD time_count = GetTickCount();\r
+      if( time_start == 0 )\r
+        time_start = time_count;\r
+      t = ( time_count - time_start ) / 1000.0f;\r
+\r
+      // Y軸で回転させる\r
+      mat_world_ = XMMatrixRotationY( t );\r
+\r
+      // 色の変更\r
+      mesh_color_.x = ( sinf( t * 1.0f ) + 1.0f ) * 0.5f;\r
+      mesh_color_.y = ( cosf( t * 3.0f ) + 1.0f ) * 0.5f;\r
+      mesh_color_.z = ( sinf( t * 5.0f ) + 1.0f ) * 0.5f;\r
+\r
+\r
+      // 定数更新\r
+      cb_changes_every_frame cb;\r
+\r
+      cb.mWorld = XMMatrixTranspose( mat_world_ );\r
+      cb.vLightColor = mesh_color_;\r
+      d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 );\r
+\r
+      // 立方体の描画\r
+      d3d_context_->VSSetShader( v_shader_, NULL, 0 );\r
+      d3d_context_->VSSetConstantBuffers( 0, 1, &cb_never_changes_.GetInterfacePtr() );\r
+      d3d_context_->VSSetConstantBuffers( 1, 1, &cb_change_on_resize_.GetInterfacePtr() );\r
+      d3d_context_->VSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );\r
+      d3d_context_->PSSetShader( p_shader_, NULL, 0 );\r
+      d3d_context_->PSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );\r
+      d3d_context_->PSSetShaderResources( 0, 1, &shader_res_view_.GetInterfacePtr() );\r
+      d3d_context_->PSSetSamplers( 0, 1, &sampler_state_.GetInterfacePtr() );\r
+\r
+      d3d_context_->DrawIndexed( 36, 0, 0 );\r
+\r
+      // 表示\r
+      swap_chain_->Present(1,0);\r
+\r
+      // 画面に転送\r
+      IDXGISurface1Ptr surface;\r
+      THROW_IF_ERR(swap_chain_->GetBuffer(0, __uuidof(IDXGISurface1), (void**) &surface));\r
+      HDC sdc;\r
+      THROW_IF_ERR(surface->GetDC( FALSE, &sdc ));\r
+      get_dc ddc(hwnd_);\r
+      RECT rc;\r
+      GetWindowRect(hwnd_,&rc);\r
+      POINT wnd_pos = {rc.left,rc.top};\r
+      SIZE  wnd_size = {client_width_,client_height_};\r
+      BLENDFUNCTION blend;\r
+      blend.BlendOp = AC_SRC_OVER;\r
+      blend.BlendFlags = 0;\r
+      blend.SourceConstantAlpha = 128; // 不透明度(レイヤードウィンドウ全体のアルファ値)\r
+      blend.AlphaFormat = AC_SRC_ALPHA;\r
+      // デバイスコンテキストにおけるレイヤの位置\r
+      POINT po;\r
+      po.x = po.y = 0;\r
+      UpdateLayeredWindow(hwnd_, ddc.get(), &wnd_pos, &wnd_size, sdc, &po, RGB(255,0,0), &blend, ULW_ALPHA | ULW_COLORKEY);\r
+      surface->ReleaseDC( NULL);\r
+      surface.Release();\r
+      // OMステージに登録する\r
+      d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );\r
+    }\r
 \r
- }\r
 }\r
 \r
   template struct base_win32_window<wndproc>;\r
   template struct base_win32_window<dlgproc>;\r
@@ -926,7 +1007,7 @@ namespace sf
 \r
   subclass_window::subclass_window(HWND hwnd) \r
     : base_win32_window (\r
-      std::wstring(L""),std::wstring(L""),false,0,0\r
+    std::wstring(L""),std::wstring(L""),false,0,0\r
     ),is_subclassed_(false)\r
   {\r
     attach(hwnd);\r
@@ -934,7 +1015,7 @@ namespace sf
 \r
   subclass_window::subclass_window()\r
     : base_win32_window (\r
-      std::wstring(L""),std::wstring(L""),false,0,0\r
+    std::wstring(L""),std::wstring(L""),false,0,0\r
     ),is_subclassed_(false)\r
   {\r
 \r