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