OSDN Git Service

とりあえず更新。Direct2DとDWMの半透明ウィンドウの問題は未解決
authorSFPGMR <sfpg@git.sourceforge.jp>
Mon, 25 Apr 2011 12:07:42 +0000 (21:07 +0900)
committerSFPGMR <sfpg@git.sourceforge.jp>
Mon, 25 Apr 2011 12:07:42 +0000 (21:07 +0900)
wintimer/sf_windows.cpp
wintimer/toplevel_window.cpp

index 0fc9486..0aead2d 100644 (file)
@@ -222,10 +222,7 @@ namespace sf
 
   void base_window::discard_device()
   {
-    /*         if(render_target_)
-    {
-    render_target_.Release();
-    }*/
+    safe_release(render_target_);
   }
 
   void base_window::show(boost::uint32_t show_flag) 
index 4693189..e04f4e2 100644 (file)
@@ -22,25 +22,7 @@ namespace sf
   //ID2D1HwndRenderTargetPtr base_window::render_target() { return impl_->render_target();};
   //IDWriteFactoryPtr base_window::write_factory() {return impl_->write_factory();};
 
-  toplevel_window_ptr create_toplevel_window
-    (
-    const std::wstring& menu_name,
-    const std::wstring& name,
-    const boost::uint32_t show_flag,
-    bool fit_to_display,
-    float width,
-    float height
-    )
-  {
-    toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,width,height);
-    p->create_device_independent_resources();
-    p->register_class();
-    p->create_window();
-    p->show(show_flag);
-    p->update();
-    return toplevel_window_ptr(p);
-  }
-  
   toplevel_window::toplevel_window(const std::wstring& menu_name,const std::wstring& name,
     bool fit_to_display,float width,float height) 
     : base_window(menu_name,name,fit_to_display,width,height) , wm_task_bar_create_(0),timer_id_(0),result_time_(INTERVAL_SEC1),status_(active)
@@ -106,9 +88,13 @@ namespace sf
         //create_device();
 
         { 
+
           paint_struct begin_paint(hwnd);
+        
+          //CloseHandle(cb);
           // 描画コードの呼び出し
           render();
+
         }
 
 //        ::ShowWindow(hwnd_,SW_MINIMIZE);
@@ -118,10 +104,12 @@ namespace sf
       {
         ::InvalidateRect(hwnd, NULL, FALSE);
       }
+      break;
     case WM_ERASEBKGND:
       {
-        return FALSE;
+//        return FALSE;
       }
+      break;
     case WM_MOUSEMOVE:
       {
         //                                     on_mouse_move(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),wParam); 
@@ -217,6 +205,7 @@ namespace sf
   {
 
     static float t = 0.0f;
+    
 
     if (render_target_)
     {
@@ -224,12 +213,14 @@ namespace sf
       D2D1_SIZE_F renderTargetSize = render_target_->GetSize();
       try {
         render_target_->BeginDraw();
-        render_target_->Clear(D2D1::ColorF(D2D1::ColorF::White));
+        ID2D1SolidColorBrushPtr ebrush;
+        render_target_->Clear(D2D1::ColorF(0,1.0f));
+//        render_target_->FillRectangle(D2D1::RectF(0.0f,0.0f,renderTargetSize.width,renderTargetSize.height),);
+         
+//          (D2D1::ColorF(0,1.0f));
         render_target_->SetTransform(D2D1::Matrix3x2F::Identity());
         ID2D1SolidColorBrushPtr brush;
-        render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &brush);
-        ID2D1SolidColorBrushPtr brushr;
-        render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &brushr);
+        render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), &brush);
 
         D2D1_RECT_F layoutRect = D2D1::RectF(0.0f,0.0f,width_,height_);
         IDWriteTextFormatPtr write_text_format;
@@ -240,7 +231,7 @@ namespace sf
           DWRITE_FONT_WEIGHT_REGULAR,
           DWRITE_FONT_STYLE_NORMAL,
           DWRITE_FONT_STRETCH_NORMAL,
-          18.0f,
+          20.0f,
           L"ja-jp",
           &write_text_format
           ));
@@ -258,7 +249,16 @@ namespace sf
           layoutRect, 
           brush);
         THROW_IFERR(render_target_->EndDraw());
-      }  catch(...) {
+      } catch(sf::win32_error_exception& err)
+      {
+        if(err.hresult() == D2DERR_RECREATE_TARGET)
+        {
+          discard_device();
+          create_device();
+        } else {
+          throw;
+        }
+      } catch(...) {
         throw;
       }
     }
@@ -355,6 +355,49 @@ namespace sf
     return bitmap;
   }
 
+  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
+   }
+   return hr;
+}
 
+ toplevel_window_ptr create_toplevel_window
+    (
+    const std::wstring& menu_name,
+    const std::wstring& name,
+    const boost::uint32_t show_flag,
+    bool fit_to_display,
+    float width,
+    float height
+    )
+  {
+    toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,width,height);
+    p->create_device_independent_resources();
+    p->register_class();
+    p->create_window();
+
+    BOOL dwmEnable;
+    DwmIsCompositionEnabled (&dwmEnable); 
+    if (dwmEnable) EnableBlurBehind(p->hwnd_);
+
+    p->show(show_flag);
+    p->update();
+    return toplevel_window_ptr(p);
+  }
+  
 }