OSDN Git Service

何もないウインドウの表示
authorSFPGMR <sfpg@git.sourceforge.jp>
Sun, 29 Jan 2012 03:03:32 +0000 (12:03 +0900)
committerSFPGMR <sfpg@git.sourceforge.jp>
Sun, 29 Jan 2012 03:03:32 +0000 (12:03 +0900)
38 files changed:
SF.props
winwrapper.sln
winwrapper/application.cpp [new file with mode: 0644]
winwrapper/application.h [new file with mode: 0644]
winwrapper/base_window.cpp [new file with mode: 0644]
winwrapper/base_window.h [new file with mode: 0644]
winwrapper/code_converter.cpp [new file with mode: 0644]
winwrapper/code_converter.h [new file with mode: 0644]
winwrapper/dout.h [new file with mode: 0644]
winwrapper/dpi.cpp [new file with mode: 0644]
winwrapper/dpi.h [new file with mode: 0644]
winwrapper/exception.cpp [new file with mode: 0644]
winwrapper/exception.h [new file with mode: 0644]
winwrapper/icon.cpp [new file with mode: 0644]
winwrapper/icon.h [new file with mode: 0644]
winwrapper/jumplist.cpp [new file with mode: 0644]
winwrapper/jumplist.h [new file with mode: 0644]
winwrapper/logger.cpp [new file with mode: 0644]
winwrapper/logger.h [new file with mode: 0644]
winwrapper/message_loop.h [new file with mode: 0644]
winwrapper/sf_com.cpp [new file with mode: 0644]
winwrapper/sf_com.h [new file with mode: 0644]
winwrapper/sf_memory.h [new file with mode: 0644]
winwrapper/sf_windows.cpp [new file with mode: 0644]
winwrapper/sf_windows.h [new file with mode: 0644]
winwrapper/singleton.h [new file with mode: 0644]
winwrapper/stdafx.cpp [new file with mode: 0644]
winwrapper/stdafx.h [new file with mode: 0644]
winwrapper/taskbar.cpp [new file with mode: 0644]
winwrapper/taskbar.h [new file with mode: 0644]
winwrapper/test_window.cpp [new file with mode: 0644]
winwrapper/test_window.h [new file with mode: 0644]
winwrapper/timer.cpp [new file with mode: 0644]
winwrapper/timer.h [new file with mode: 0644]
winwrapper/toplevel_window.cpp [new file with mode: 0644]
winwrapper/toplevel_window.h [new file with mode: 0644]
winwrapper/winmain.cpp [new file with mode: 0644]
winwrapper/winwrapper.vcxproj

index e8dfc62..b03ce6d 100644 (file)
--- a/SF.props
+++ b/SF.props
       <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
       <PrecompiledHeader>Use</PrecompiledHeader>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
+      <StructMemberAlignment>16Bytes</StructMemberAlignment>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PreprocessorDefinitions>_UNICODE;UNICODE;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ClCompile>\r
   </ItemDefinitionGroup>\r
   <ItemGroup />\r
index e61d07a..5f86821 100644 (file)
@@ -6,13 +6,17 @@ EndProject
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Win32 = Debug|Win32\r
+               Debug|x64 = Debug|x64\r
                Release|Win32 = Release|Win32\r
+               Release|x64 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Debug|Win32.Build.0 = Debug|Win32\r
-               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Release|Win32.ActiveCfg = Release|Win32\r
-               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Release|Win32.Build.0 = Release|Win32\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Debug|Win32.ActiveCfg = Debug|x64\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Debug|x64.ActiveCfg = Debug|x64\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Debug|x64.Build.0 = Debug|x64\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Release|Win32.ActiveCfg = Release|x64\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Release|x64.ActiveCfg = Release|x64\r
+               {FCD1CB35-CFBB-4449-A11C-6B7EDDD1D31E}.Release|x64.Build.0 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
diff --git a/winwrapper/application.cpp b/winwrapper/application.cpp
new file mode 100644 (file)
index 0000000..23f9990
--- /dev/null
@@ -0,0 +1,130 @@
+/*\r
+==============================================================================\r
+\r
+This file is part of the async\r
+Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+async can be redistributed and/or modified under the terms of the\r
+GNU General Public License, as published by the Free Software Foundation;\r
+either version 2 of the License, or (at your option) any later version.\r
+\r
+async is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with async; if not, visit www.gnu.org/licenses or write to the\r
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+Boston, MA 02111-1307 USA\r
+\r
+==============================================================================\r
+*/\r
+#include "StdAfx.h"\r
+#include <commctrl.h>\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+#include "timer.h"\r
+#include "message_loop.h"\r
+#include "sf_com.h"\r
+#include "application.h"\r
+#include "dout.h"\r
+#pragma comment(lib,"comctl32.lib")\r
+\r
+#ifndef HINST_THISCOMPONENT\r
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;\r
+#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)\r
+#endif\r
+\r
+\r
+using namespace std;\r
+\r
+namespace sf {\r
+#ifdef _DEBUG\r
+  std::wstring application::app_id_(L"SF.async_debug");\r
+#else\r
+  std::wstring application::app_id_(L"SF.async");\r
+#endif\r
+\r
+  application::application()  \r
+  {\r
+    instance_handle_ = HINST_THISCOMPONENT;\r
+    // ベースディレクトリの取得\r
+    wchar_t dir[MAX_PATH];\r
+    ::GetCurrentDirectoryW(MAX_PATH,dir);\r
+    base_directory_.assign(dir);\r
+  }\r
+\r
+  application::~application()\r
+  {\r
+  };\r
+\r
+  int application::execute(HINSTANCE hInstance,\r
+    HINSTANCE hPrevInstance,\r
+    LPTSTR    lpCmdLine,\r
+    int       nCmdShow)\r
+  {\r
+#ifdef _DEBUG\r
+    ::_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);\r
+#endif\r
+    UNREFERENCED_PARAMETER(hPrevInstance);\r
+    UNREFERENCED_PARAMETER(lpCmdLine);\r
+    std::wcout.imbue(std::locale(""));\r
+\r
+    // 2重起動の防止\r
+    SECURITY_DESCRIPTOR sd;\r
+    InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);\r
+    SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);        \r
+    SECURITY_ATTRIBUTES sec_attr;\r
+    sec_attr.nLength = sizeof (sec_attr);\r
+    sec_attr.lpSecurityDescriptor = &sd;\r
+    sec_attr.bInheritHandle = TRUE; \r
+#ifdef _DEBUG \r
+    sf::handle_holder handle(::CreateMutex(&sec_attr, FALSE, _T("async_mutex_debug")));\r
+#else\r
+    sf::handle_holder handle(::CreateMutex(&sec_attr, FALSE, _T("async_mutex")));\r
+#endif\r
+\r
+    if(NULL == handle.get() || ::GetLastError() == ERROR_ALREADY_EXISTS)\r
+    {\r
+      return 0;\r
+    }\r
+\r
+    // プロセスの優先順位\r
+    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);\r
+\r
+    // コモンコントロールの初期化 \r
+    static const INITCOMMONCONTROLSEX common_ctrls =\r
+    {\r
+      sizeof(INITCOMMONCONTROLSEX),\r
+      ICC_STANDARD_CLASSES | ICC_BAR_CLASSES\r
+    };\r
+\r
+    InitCommonControlsEx(&common_ctrls);\r
+\r
+    // COMの初期化\r
+    sf::com_initialize init(0,multi_threaded);\r
+\r
+    // アプリケーションIDの登録\r
+    sf::throw_if_err<application::exception>()(SetCurrentProcessExplicitAppUserModelID(app_id_.c_str()));\r
+\r
+    // タイマー精度の設定\r
+    sf::timer_period tp(1);\r
+\r
+\r
+    // ウィンドウの作成\r
+    window_.reset(new sf::test_window(\r
+      std::wstring(L"Windowラッパライブラリ"),std::wstring(L"Windowラッパライブラリ"),false,640,480));\r
+    //window_->create();\r
+\r
+    // メッセージループ\r
+    WPARAM ret = sf::run_message_loop()();\r
+\r
+    return ret;\r
+  }\r
+}\r
+\r
diff --git a/winwrapper/application.h b/winwrapper/application.h
new file mode 100644 (file)
index 0000000..1682c37
--- /dev/null
@@ -0,0 +1,83 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+#include "singleton.h"\r
+#include "exception.h"\r
+#include "sf_memory.h"\r
+#include "test_window.h"\r
+\r
+namespace sf {\r
+class application : public singleton<application>\r
+{\r
+public:\r
+  struct exception\r
+    : public sf::win32_error_exception \r
+  {\r
+    exception(uint32_t hr) : win32_error_exception(hr) {};\r
+    exception() : win32_error_exception() {} ;\r
+  };\r
+\r
\r
+  application();\r
+  ~application();\r
+  \r
+  int execute(HINSTANCE hInstance,\r
+                     HINSTANCE hPrevInstance,\r
+                     LPTSTR    lpCmdLine,\r
+                     int       nCmdShow);\r
+  \r
+\r
+  std::wstring& app_id(){return app_id_;};\r
+  HINSTANCE instance_handle() {return instance_handle_;};\r
+  \r
+  // アプリケーションのカレントディレクトリを返す\r
+  const std::wstring& base_directory() const { return base_directory_; }\r
+\r
\r
+// ----------------------------------------\r
+private:\r
+// ----------------------------------------\r
+\r
+  //void wasapi_setup();\r
+  HINSTANCE instance_handle_;\r
+  int return_code_;\r
+  \r
+//---------------------------------------\r
+// ファイル読取り関係\r
+//---------------------------------------\r
+public:\r
+\r
+private:\r
+\r
+  std::wstring base_directory_;\r
+  std::unique_ptr<test_window> window_;\r
+//--------------------------------\r
+// シーケンサ\r
+//--------------------------------\r
+public:\r
+private:\r
+  static std::wstring app_id_;\r
+  static const int WAIT_TIMEOUT_DEFAULT = 100; \r
+};\r
+}\r
+\r
diff --git a/winwrapper/base_window.cpp b/winwrapper/base_window.cpp
new file mode 100644 (file)
index 0000000..40a5e56
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+#include "StdAfx.h"\r
+#include "base_window.h"\r
+\r
+namespace sf {\r
+}
\ No newline at end of file
diff --git a/winwrapper/base_window.h b/winwrapper/base_window.h
new file mode 100644 (file)
index 0000000..12655e1
--- /dev/null
@@ -0,0 +1,67 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+namespace sf {\r
+/** window \83x\81[\83X\83N\83\89\83X */\r
+\r
+struct rect {\r
+  uint32_t width;\r
+  uint32_t height;\r
+};\r
+\r
+struct base_window : boost::noncopyable\r
+{\r
+  typedef boost::signals2::signal<void ()> on_render_type;\r
+\r
+  on_render_type on_render;\r
+  \r
+  // \90\82ÌWindow\83n\83\93\83h\83\8b\82ð\95Ô\82·\81B\r
+  virtual void * raw_handle() const = 0;\r
+  // \83E\83B\83\93\83h\83E\82ð\90\90¬\82·\82é\r
+  virtual void create() = 0;\r
+//  virtual void show(uint32_t show_flag) = 0;\r
+  // \83E\83B\83\93\83h\83E\82ð\95\\8e¦\82·\82é\r
+  virtual void show() = 0;\r
+  // \83E\83B\83\93\83h\83E\82ª\8d¡\95\\8e¦\82³\82ê\82Ä\82¢\82é\82©\82ð\95Ô\82·\r
+  virtual bool is_show() = 0;\r
+  // \83E\83B\83\93\83h\83E\82ð\89B\82·\r
+  virtual void hide() = 0;\r
+  //virtual void activate() = 0;\r
+  //virtual bool is_activate() = 0;\r
+  //virtual void deactivate() = 0;\r
+  //virtual void \r
+  //virtual void size(uint32_t width,uint32_t height); \r
+  //virtual rect size(); \r
+\r
+  virtual void text(std::wstring& text) = 0;\r
+  //virtual std::wstring text() = 0;\r
+\r
+  virtual void update() = 0;\r
+\r
+protected:\r
+  virtual ~base_window() {};\r
+\r
+};\r
+\r
+}\r
+\r
diff --git a/winwrapper/code_converter.cpp b/winwrapper/code_converter.cpp
new file mode 100644 (file)
index 0000000..46b279c
--- /dev/null
@@ -0,0 +1,34 @@
+#include "stdafx.h"\r
+\r
+namespace sf \r
+{\r
+\r
+  code_converter<char,wchar_t>::code_converter(const char*p)\r
+  {\r
+    int len = ::MultiByteToWideChar(CP_ACP,0,p,-1,NULL,0);\r
+    m_dest.reset(new wchar_t[len]);\r
+    ::MultiByteToWideChar(CP_ACP,0,p,-1,&m_dest[0],len);\r
+  };\r
+\r
+  code_converter<char,wchar_t>::code_converter(const std::string& p)\r
+  {\r
+    int len = ::MultiByteToWideChar(CP_ACP,0,p.c_str(),-1,NULL,0);\r
+    m_dest.reset(new wchar_t[len]);\r
+    ::MultiByteToWideChar(CP_ACP,0,p.c_str(),-1,&m_dest[0],len);\r
+  };\r
+\r
+  code_converter<wchar_t,char>::code_converter(const wchar_t*p)\r
+  {\r
+    int len = ::WideCharToMultiByte(CP_ACP,0,p,-1,NULL,0,NULL,NULL);\r
+    m_dest.reset(new char[len]);\r
+    ::WideCharToMultiByte(CP_ACP,0,p,-1,&m_dest[0],len,NULL,NULL);\r
+  };\r
+\r
+  code_converter<wchar_t,char>::code_converter(const std::wstring & p)\r
+  {\r
+    int len = ::WideCharToMultiByte(CP_ACP,0,p.c_str(),-1,NULL,0,NULL,NULL);\r
+    m_dest.reset(new char[len]);\r
+    ::WideCharToMultiByte(CP_ACP,0,p.c_str(),-1,&m_dest[0],len,NULL,NULL);\r
+  };\r
+\r
+};
\ No newline at end of file
diff --git a/winwrapper/code_converter.h b/winwrapper/code_converter.h
new file mode 100644 (file)
index 0000000..9ee1cc2
--- /dev/null
@@ -0,0 +1,79 @@
+#pragma once\r
+\r
+\r
+/** @file\r
+ *  @author S.F. (Satoshi Fujiwara)\r
+ *  @brief wchar_t <--> char の変換ユーティリティ\r
+ *  引数として文字列を引き渡す際、変換が必要な場合、下記のようにアダプタ的に使用することを想定している。\r
+ *  std::wstring a(L"abcd");\r
+ *  std::wstring b((sf::code_converter<wcha_t,char>(a)));\r
+ *\r
+ * 後、ATLコード差し替え用のtypedefも用意している。\r
+ *  これは、アダプタとしての利用のみに限定される。\r
+ *  sf::ct2a hoge_(L"abcef"); // 想定していない(動作する場合もあるし、ダメな場合もある)\r
+ */\r
+\r
+namespace sf \r
+{\r
+    /** 雛形 */\r
+    template <typename SrcChar,typename DestChar>\r
+    struct code_converter\r
+    {\r
+    public:\r
+        explicit code_converter(SrcChar* p);\r
+        explicit code_converter(std::basic_string<SrcChar> & p);\r
+        operator DestChar*();\r
+    };\r
+\r
+    /** char -> wchar_tへの変換 */\r
+    template <>\r
+    struct code_converter<char,wchar_t>\r
+    {\r
+        explicit code_converter(const char* p);\r
+        explicit code_converter(const std::string& p);\r
+\r
+        operator wchar_t*() const {return m_dest.get();}\r
+    private:\r
+        boost::scoped_array<wchar_t> m_dest;\r
+    };\r
+\r
+    /** wchar_t -> char */\r
+    template <>\r
+    struct code_converter<wchar_t,char>\r
+    {\r
+        explicit code_converter(const wchar_t* p);\r
+        explicit code_converter(const std::wstring& p);\r
+        operator char* () const {return m_dest.get();}\r
+    private:\r
+        boost::scoped_array<char> m_dest;\r
+    };\r
+\r
+    /** ATLコード差し替えのためのエイリアス */\r
+    typedef sf::code_converter<char,wchar_t> ca2w;\r
+\r
+    /** ATLコード差し替えのためのエイリアス */\r
+    typedef sf::code_converter<wchar_t,char> cw2a;\r
+\r
+    #ifdef _UNICODE\r
+\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        typedef sf::code_converter<char,wchar_t> ca2t;\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        typedef sf::code_converter<wchar_t,char> ct2a;\r
+\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        inline const wchar_t* ct2w(const wchar_t* p) { return p;};\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        inline const wchar_t* cw2t(const wchar_t* p) { return p;};\r
+\r
+    #else\r
+\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        inline const char* ct2a(const char* p) { return p;};\r
+        /** ATLコード差し替えのためのエイリアス */\r
+        inline const char* ca2t(const char* p) { return p;};\r
+\r
+    #endif\r
+}\r
+\r
+\r
diff --git a/winwrapper/dout.h b/winwrapper/dout.h
new file mode 100644 (file)
index 0000000..360a1a5
--- /dev/null
@@ -0,0 +1,148 @@
+#pragma once\r
+\r
+/* http://vision.kuee.kyoto-u.ac.jp/~nob/doc/win32/win32.html#doc1_42 \r
+       \82æ\82è\94q\8eØ\r
+*/\r
+\r
+\r
+#ifndef STDX_DSTREAM_H\r
+\r
+#define STDX_DSTREAM_H\r
+\r
+namespace sf\r
+{\r
+\r
+#ifdef _DEBUG\r
+  \r
+// VC++ \82Å STLport \82¾\82Æ using std::char_traits; \82Ý\82½\82¢\82È\82Ì\82ª\95K\97v\82©\82à\r
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >\r
+class basic_dbg_streambuf: public std::basic_stringbuf<Ch_T, Tr_T>\r
+{\r
+public:\r
+  basic_dbg_streambuf()\r
+    {\r
+#ifndef STDX_DSTREAM_BUFFERING\r
+      setbuf(0,0);\r
+#endif\r
+    }\r
+\r
+  virtual ~basic_dbg_streambuf()\r
+    {\r
+      sync();\r
+    }\r
+\r
+protected:\r
+  int sync(void)\r
+    {\r
+      dbg_out(str().c_str());\r
+      pbump(static_cast<int>(pbase() - pptr()));\r
+      return 0;\r
+    }\r
+\r
+  void dbg_out(const Ch_T*);\r
+};\r
+\r
+template <>\r
+inline void basic_dbg_streambuf<char>::dbg_out(const char *str)\r
+{\r
+  ::OutputDebugStringA(str);\r
+}\r
+\r
+template <>\r
+inline void basic_dbg_streambuf<wchar_t>::dbg_out(const wchar_t *str)\r
+{\r
+  ::OutputDebugStringW(str);\r
+}\r
+\r
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >\r
+class basic_dbg_ostream: public std::basic_ostream<Ch_T, Tr_T>\r
+{\r
+public:\r
+  basic_dbg_ostream() : std::basic_ostream<Ch_T, Tr_T>(new basic_dbg_streambuf<Ch_T, Tr_T>())\r
+    {\r
+    }\r
+\r
+  virtual ~basic_dbg_ostream()\r
+    {\r
+      // flush(); // \95s\97v\82ç\82µ\82¢\81Dhttp://www.tietew.jp/cppll/archive/607\r
+      delete rdbuf();\r
+    }\r
+};\r
+\r
+typedef basic_dbg_streambuf<wchar_t>  wdbg_streambuf;\r
+typedef basic_dbg_ostream<wchar_t> wdstream;\r
+\r
+// \82±\82ê\82ð\92è\8b`\82µ\82Ä\82¨\82­\82Æ\81C dout \82Ì\90é\8c¾\82ª\82¢\82ç\82È\82­\82È\82é\81D\r
+\r
+static wdstream wdout;\r
+#define DOUT(x) wdout << x \r
+}\r
+#else\r
+#define DOUT(x) \r
+#define wdout //\r
+//  struct dummy_wdout {\r
+//    //template <typename R>\r
+//    //inline dummy_wdout& operator<<(const R v) {return *this;};\r
+//\r
+//    //template <typename R>\r
+//    //inline dummy_wdout& operator<<(const R* v) {return *this;};\r
+//\r
+//    //template <typename R>\r
+//    //inline dummy_wdout& operator<<(const R& v) {return *this;};\r
+//\r
+//    //template <typename R>\r
+//    //inline dummy_wdout& operator<<(const R&& v) {return *this;};\r
+//\r
+//    ////template <typename R,int N>\r
+//    ////inline dummy_wdout& operator<<(const R(&a)[N]) {return *this;};\r
+//\r
+//  };\r
+//\r
+//  static dummy_wdout wdout;\r
+//}\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p,const L v) {return p;};\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p,const L& v) {return p;};\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p,const L&& v) {return p;};\r
+//\r
+////template <typename L>\r
+////inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p,const L* v) {return p;};\r
+//\r
+//template <typename L,int N>\r
+//inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p,const L(&a)[N]) {return p;};\r
+//\r
+//template <typename L>\r
+//inline L& operator<<(const L v,sf::dummy_wdout& p) {return v;};\r
+//\r
+//template <typename L>\r
+//inline L& operator<<(sf::dummy_wdout& p,L v) {return v;};\r
+//\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(const L v,sf::dummy_wdout& p) {return p;};\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(const L& v,sf::dummy_wdout& p) {return p;};\r
+//\r
+////template <typename L>\r
+////inline sf::dummy_wdout& operator<<(const L* v,sf::dummy_wdout& p) {return p;};\r
+//\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(const L&& v,sf::dummy_wdout& p) {return p;};\r
+//\r
+//\r
+//template <typename L,int N>\r
+//inline sf::dummy_wdout& operator<<(const L(&a)[N],sf::dummy_wdout& p) {return p;};\r
+////\r
+//template <typename L>\r
+//inline sf::dummy_wdout& operator<<(sf::dummy_wdout& p , const L *v) {return p;};\r
+\r
+//\r
+}\r
+#endif\r
+#endif // STDX_DSTREAM_
\ No newline at end of file
diff --git a/winwrapper/dpi.cpp b/winwrapper/dpi.cpp
new file mode 100644 (file)
index 0000000..aa18adb
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "StdAfx.h"\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+#include "sf_windows.h"\r
+#include "dpi.h"\r
+\r
+namespace sf {\r
+  void dpi::init()\r
+  {\r
+    if (!init_)\r
+    {\r
+      sf::get_dc hdc(0);\r
+      if (hdc.get())\r
+      {\r
+        dpi_x_ = GetDeviceCaps(hdc.get(), LOGPIXELSX);\r
+        dpi_y_ = GetDeviceCaps(hdc.get(), LOGPIXELSY);\r
+        ReleaseDC(NULL, hdc.get());\r
+      }\r
+      init_ = true;\r
+    }\r
+  }\r
+\r
+}
\ No newline at end of file
diff --git a/winwrapper/dpi.h b/winwrapper/dpi.h
new file mode 100644 (file)
index 0000000..b37a814
--- /dev/null
@@ -0,0 +1,86 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace sf{\r
+  template <typename T>\r
+  class dpi_t\r
+  {\r
+  public:\r
+    dpi_t() : init_(false), dpi_x_(96), dpi_y_(96) { }\r
+    // \89æ\96Ê\82Ì DPI \82ð\8eæ\93¾\82µ\82Ü\82·\81B\r
+    T dpix() { init(); return dpi_x_; }\r
+    T dpiy() { init(); return dpi_y_; }\r
+\r
+    // \90â\91Î\83s\83N\83Z\83\8b\82Æ\91\8a\91Î\83s\83N\83Z\83\8b\8aÔ\82Ì\95Ï\8a·\82ð\8ds\82¢\82Ü\82·\81B\r
+    T scale_x(T x) { init(); return MulDiv(x, dpi_x_, 96); }\r
+    T scale_y(T y) { init(); return MulDiv(y, dpi_y_, 96); }\r
+    T unscale_x(T x) { init(); return MulDiv(x, 96, dpi_x_); }\r
+    T unscale_y(T y) { init(); return MulDiv(y, 96, dpi_y_); }\r
+\r
+    // \89æ\96Ê\83T\83C\83Y (\91\8a\91Î\83s\83N\83Z\83\8b\92P\88Ê) \82ð\8b\81\82ß\82Ü\82·\81B\r
+    T scaled_screen_width() { return scaled_system_metrix_x(SM_CXSCREEN); }\r
+    T scaled_screen_height() { return scaled_system_metrix_y(SM_CYSCREEN); }\r
+\r
+    // \8el\8ap\8c`\82Ì\83T\83C\83Y\82ð\90â\91Î\83s\83N\83Z\83\8b\82©\82ç\91\8a\91Î\83s\83N\83Z\83\8b\82É\95Ï\8dX\82µ\82Ü\82·\81B\r
+    void scale_rect(RECT *rect_ptr)\r
+    {\r
+      rect_ptr->left = scale_x(rect_ptr->left);\r
+      rect_ptr->right = scale_x(rect_ptr->right);\r
+      rect_ptr->top = scale_y(rect_ptr->top);\r
+      rect_ptr->bottom = scale_y(rect_ptr->bottom);\r
+    }\r
+\r
+    // \89æ\96Ê\89ð\91\9c\93x\82ª\8dÅ\92á\92l (\91\8a\91Î\83s\83N\83Z\83\8b\92P\88Ê) \82ð\96\9e\82½\82µ\82Ä\82¢\82é\82©\82Ç\82¤\82©\82ð\r
+    // \8am\94F\82µ\82Ü\82·\81B\r
+    bool is_resolution_at_least(T xmin, T ymin) \r
+    { \r
+      return (scaled_screen_width() >= xmin) && (scaled_screen_height() >= ymin); \r
+    }\r
+    // \83|\83C\83\93\83\83T\83C\83Y (1/72 \83C\83\93\83`) \82ð\90â\91Î\83s\83N\83Z\83\8b\82É\95Ï\8a·\82µ\82Ü\82·\81B\r
+    T point_to_pixels(int pt) { return MulDiv(pt, dpi_y_, 72); }\r
+    // \83L\83\83\83b\83V\83\85\82³\82ê\82½\83\81\83g\83\8a\83b\83N\82ð\82·\82×\82Ä\96³\8cø\82É\82µ\82Ü\82·\81B\r
+    void invalidate() { init_ = false; }\r
+  private:\r
+    void init();\r
+\r
+    T scaled_system_metrix_x(int nIndex) \r
+    { \r
+      init(); \r
+      return MulDiv(GetSystemMetrics(nIndex), 96, dpi_x_); \r
+    }\r
+\r
+    T scaled_system_metrix_y(int nIndex) \r
+    { \r
+      init(); \r
+      return MulDiv(GetSystemMetrics(nIndex), 96, dpi_y_); \r
+    }\r
+\r
+  private:\r
+    bool init_;\r
+    T dpi_x_;\r
+    T dpi_y_;\r
+  };\r
+\r
+  typedef dpi_t<int> dpi;\r
+}\r
diff --git a/winwrapper/exception.cpp b/winwrapper/exception.cpp
new file mode 100644 (file)
index 0000000..104d58b
--- /dev/null
@@ -0,0 +1,124 @@
+#include "stdafx.h"\r
+#include "exception.h"\r
+#include <objbase.h>\r
+#include <wtypes.h>\r
+#include <winerror.h>\r
+#include <avrt.h>\r
+#include <strsafe.h>\r
+#include <audioclient.h>\r
+#include <audiopolicy.h>\r
+\r
+\r
+\r
+#define BOOST_ASSIGN_MAX_PARAMS 7\r
+#include <boost/assign.hpp>\r
+#include <boost/assign/ptr_list_of.hpp>\r
+#include <boost/assign/ptr_list_inserter.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_memory.h"\r
+\r
+using namespace boost;\r
+\r
+namespace sf\r
+{\r
+//typedef CComPtr<IAudioClient> IAudioClientPtr;\r
+std::map<HRESULT,std::wstring> com_error_  = boost::assign::list_of<std::pair<HRESULT,std::wstring> >\r
+    (E_POINTER,L"E_POINTER")\r
+    (E_INVALIDARG,L"E_INVALIDARG")\r
+    (DWRITE_E_FILEFORMAT,L"DWRITE_E_FILEFORMAT")\r
+    (DWRITE_E_UNEXPECTED,L"DWRITE_E_UNEXPECTED")\r
+    (DWRITE_E_NOFONT,L"DWRITE_E_NOFONT")\r
+    (DWRITE_E_FILENOTFOUND,L"DWRITE_E_FILENOTFOUND")\r
+    (DWRITE_E_FILEACCESS,L"DWRITE_E_FILEACCESS")\r
+    (DWRITE_E_FONTCOLLECTIONOBSOLETE,L"DWRITE_E_FONTCOLLECTIONOBSOLETE")\r
+    (DWRITE_E_ALREADYREGISTERED,L"DWRITE_E_ALREADYREGISTERED")\r
+       (AUDCLNT_E_NOT_INITIALIZED,L"AUDCLNT_E_NOT_INITIALIZED")\r
+       (AUDCLNT_E_ALREADY_INITIALIZED,L"AUDCLNT_E_ALREADY_INITIALIZED")\r
+    (AUDCLNT_E_WRONG_ENDPOINT_TYPE,L"AUDCLNT_E_WRONG_ENDPOINT_TYPE")\r
+       (AUDCLNT_E_DEVICE_INVALIDATED,L"AUDCLNT_E_DEVICE_INVALIDATED")\r
+       (AUDCLNT_E_NOT_STOPPED,L"AUDCLNT_E_NOT_STOPPED")\r
+       (AUDCLNT_E_BUFFER_TOO_LARGE,L"AUDCLNT_E_BUFFER_TOO_LARGE")\r
+       (AUDCLNT_E_OUT_OF_ORDER,L"AUDCLNT_E_OUT_OF_ORDER")\r
+       (AUDCLNT_E_UNSUPPORTED_FORMAT,L"AUDCLNT_E_UNSUPPORTED_FORMAT")\r
+       (AUDCLNT_E_INVALID_SIZE,L"AUDCLNT_E_INVALID_SIZE")\r
+       (AUDCLNT_E_DEVICE_IN_USE,L"AUDCLNT_E_DEVICE_IN_USE")\r
+       (AUDCLNT_E_BUFFER_OPERATION_PENDING,L"AUDCLNT_E_BUFFER_OPERATION_PENDING")\r
+       (AUDCLNT_E_THREAD_NOT_REGISTERED,L"AUDCLNT_E_THREAD_NOT_REGISTERED")\r
+       (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED,L"AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED")\r
+       (AUDCLNT_E_ENDPOINT_CREATE_FAILED,L"AUDCLNT_E_ENDPOINT_CREATE_FAILED")\r
+       (AUDCLNT_E_SERVICE_NOT_RUNNING,L"AUDCLNT_E_SERVICE_NOT_RUNNING")\r
+       (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED,L"AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED")\r
+       (AUDCLNT_E_EXCLUSIVE_MODE_ONLY,L"AUDCLNT_E_EXCLUSIVE_MODE_ONLY")\r
+       (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL,L"AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL")\r
+       (AUDCLNT_E_EVENTHANDLE_NOT_SET,L"AUDCLNT_E_EVENTHANDLE_NOT_SET")\r
+       (AUDCLNT_E_INCORRECT_BUFFER_SIZE,L"AUDCLNT_E_INCORRECT_BUFFER_SIZE")\r
+  (AUDCLNT_E_CPUUSAGE_EXCEEDED,L"AUDCLNT_E_CPUUSAGE_EXCEEDED")\r
+  (AUDCLNT_E_BUFFER_ERROR,L"AUDCLNT_E_BUFFER_ERROR")\r
+  (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED,L"AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED")\r
+  (AUDCLNT_E_BUFFER_SIZE_ERROR,L"AUDCLNT_E_BUFFER_SIZE_ERROR")\r
+  (AUDCLNT_E_INVALID_DEVICE_PERIOD,L"AUDCLNT_E_INVALID_DEVICE_PERIOD")\r
+       (AUDCLNT_S_BUFFER_EMPTY,L"AUDCLNT_S_BUFFER_EMPTY")\r
+       (AUDCLNT_S_THREAD_ALREADY_REGISTERED,L"AUDCLNT_S_THREAD_ALREADY_REGISTERED")\r
+  (AUDCLNT_S_POSITION_STALLED,L"AUDCLNT_S_POSITION_STALLED")\r
+  (DXGI_ERROR_UNSUPPORTED,L"DXGI_ERROR_UNSUPPORTED ")\r
+  (DXGI_STATUS_OCCLUDED,L"DXGI_STATUS_OCCLUDED")\r
+  (DXGI_STATUS_CLIPPED,L"DXGI_STATUS_CLIPPED")\r
+  ;\r
+       \r
+\r
+win32_error_exception::win32_error_exception(uint32_t hr)\r
+: std::exception("HRESULT ERROR"),hresult_(hr)\r
+{\r
+       local_memory<wchar_t> mem;\r
+       DWORD 結果 = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hr,0,(LPWSTR)&mem,0,0);\r
+       if(結果 != 0){\r
+               error_ = mem.get();\r
+       } else {\r
+               std::map<HRESULT,std::wstring>::iterator it = com_error_.find(hr);\r
+               if(it != com_error_.end())\r
+               {\r
+                       error_ = it->second;\r
+               } else {\r
+                       error_ = (boost::wformat(L"0x%x 不明なCOMエラー") % hr).str();\r
+               }\r
+#ifdef _DEBUG\r
+  wdout << L"#### Exception Occured ####" << error_ << std::endl; \r
+#endif\r
+       }\r
+\r
+};\r
+\r
+win32_error_exception::win32_error_exception()\r
+{\r
+       hresult_ = ::GetLastError();\r
+       local_memory<wchar_t> mem;\r
+       DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hresult_,0,(LPWSTR)&mem,0,0);\r
+       error_ = mem.get();\r
+#ifdef _DEBUG\r
+  wdout << L"#### Exception Occured ####" << error_ << std::endl; \r
+#endif\r
+\r
+  //Logger::outputDebugPrintf(L"Win32 Error %x %s",hresult_,mem.Get() );\r
+};\r
+\r
+std::wstring win32_error_exception::get_last_error_str(uint32_t err)\r
+{\r
+//     DWORD err = ::GetLastError();\r
+  std::wstring err_str;\r
+       local_memory<wchar_t> mem;\r
+       DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,err,0,(LPWSTR)&mem,0,0);\r
+       err_str = mem.get();\r
+#ifdef _DEBUG\r
+  wdout << L"#### Exception Occured ####" << err_str << std::endl; \r
+#endif\r
+  return err_str;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/winwrapper/exception.h b/winwrapper/exception.h
new file mode 100644 (file)
index 0000000..a4f6b93
--- /dev/null
@@ -0,0 +1,42 @@
+#pragma once\r
+\r
+namespace sf\r
+{\r
+///Exception\r
+       class exception : public std::exception\r
+       {\r
+       public:\r
+               explicit exception(const std::wstring& reason)\r
+               {\r
+                       m_reason = reason;\r
+               };\r
+               const wchar_t * what() {return m_reason.c_str();};\r
+               const std::wstring& what_str() { return m_reason;};\r
+       protected:\r
+               std::wstring m_reason;\r
+       };\r
+\r
+       class win32_error_exception : std::exception \r
+       {\r
+       public:\r
+               win32_error_exception(uint32_t hr);\r
+               win32_error_exception();\r
+\r
+               virtual ~win32_error_exception() {};\r
+               uint32_t hresult() {return hresult_;}\r
+               std::wstring& error() {return error_;}\r
+    static std::wstring get_last_error_str(uint32_t err = ::GetLastError());\r
+  private:\r
+               uint32_t hresult_;\r
+               std::wstring error_;\r
+       };\r
+\r
+  template <class Exc = win32_error_exception> struct throw_if_err\r
+  {\r
+    inline void operator()(HRESULT hr) {if(hr != S_OK){throw Exc(hr);}}\r
+    inline void operator()(bool v) {if(!v){throw Exc();}}\r
+  };\r
+\r
+}\r
+\r
+#define THROW_IF_ERR(x) sf::throw_if_err<>()(x)\r
diff --git a/winwrapper/icon.cpp b/winwrapper/icon.cpp
new file mode 100644 (file)
index 0000000..da0b8ea
--- /dev/null
@@ -0,0 +1,264 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "StdAfx.h"\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "icon.h"\r
+#include "application.h"\r
+\r
+namespace sf {\r
+  bitmap_holder icon::default_mono_bitmap(CreateBitmap(32,32,1,1,NULL));\r
+\r
+  icon::icon(uint32_t id) \r
+    : icon_((HICON)::LoadImageW(application::instance()->instance_handle(),MAKEINTRESOURCE(id),IMAGE_ICON,0,0,LR_DEFAULTCOLOR))\r
+  {\r
+\r
+  };\r
+\r
+  icon::icon(icon_holder& ic)\r
+  {\r
+    icon_.reset(::CopyIcon(ic.get()));\r
+    analyze();\r
+  }\r
+\r
+  icon::icon(icon_holder&& ic)\r
+  {\r
+    std::swap(ic,icon_);\r
+    analyze();\r
+  }\r
+\r
+  icon::icon(bitmap_holder& bmp_color,int width,int height) \r
+    : width_(width),height_(height)\r
+  {\r
+    BITMAP bmp;\r
+    ICONINFO ii;\r
+    ::GetObjectW(bmp_color.get(),sizeof(BITMAP),&bmp);\r
+    bits_per_pixel_ = bmp.bmBitsPixel;\r
+\r
+    ii.fIcon = TRUE;\r
+    ii.xHotspot = 0;\r
+    ii.yHotspot = 0;\r
+    ii.hbmColor = bmp_color.get();\r
+\r
+    if(width == 32 && height == 32){\r
+      ii.hbmMask = default_mono_bitmap.get();\r
+      icon_.reset(::CreateIconIndirect(&ii));\r
+    } else {\r
+      bitmap_holder hmb(::CreateBitmap(width,height,1,1,NULL));\r
+      ii.hbmMask = hmb.get();\r
+      icon_.reset(::CreateIconIndirect(&ii));\r
+    }\r
+\r
+  }\r
+\r
+  icon::icon(ID2D1BitmapPtr& ptr)\r
+  {\r
+    ID2D1FactoryPtr factory;\r
+    ptr->GetFactory(&factory);\r
+\r
+    D2D1_SIZE_U size(ptr->GetPixelSize());\r
+    // ビットマップヘッダのセットアップ\r
+    BITMAPV5HEADER bi = {0};\r
+    bi.bV5Size           = sizeof(BITMAPV5HEADER);\r
+    bi.bV5Width           = size.width;\r
+    bi.bV5Height          = size.height;\r
+    bi.bV5Planes = 1;\r
+    bi.bV5BitCount = 32;\r
+    bi.bV5Compression = BI_BITFIELDS;\r
+    bi.bV5RedMask   =  0x00FF0000;\r
+    bi.bV5GreenMask =  0x0000FF00;\r
+    bi.bV5BlueMask  =  0x000000FF;\r
+    bi.bV5AlphaMask =  0xFF000000; \r
+\r
+    // デスクトップHDCの取得\r
+    get_dc dc(NULL);\r
+    \r
+    // DIBセクションの作成\r
+    void *bits;// 得られるビットマップ\r
+    bitmap_holder bmp(\r
+      ::CreateDIBSection(\r
+        dc.get(),reinterpret_cast<BITMAPINFO *>(&bi),DIB_RGB_COLORS,&bits,NULL,0));\r
+    { \r
+      // 互換DCの作成\r
+      compatible_dc cdc(dc.get());\r
+      {\r
+        // 描画先への切り替え\r
+        select_object s(cdc.get(),bmp.get());\r
+\r
+        // DC互換レンダーターゲットのセットアップ\r
+        D2D1_RENDER_TARGET_PROPERTIES \r
+          props = D2D1::RenderTargetProperties(\r
+          D2D1_RENDER_TARGET_TYPE_DEFAULT,\r
+          D2D1::PixelFormat(\r
+              DXGI_FORMAT_B8G8R8A8_UNORM,\r
+              D2D1_ALPHA_MODE_PREMULTIPLIED),\r
+          0,\r
+          0,\r
+          D2D1_RENDER_TARGET_USAGE_NONE,\r
+          D2D1_FEATURE_LEVEL_DEFAULT\r
+        );\r
+\r
+        ID2D1DCRenderTargetPtr dcr;\r
+        throw_if_err<>()(factory->CreateDCRenderTarget(&props,&dcr));\r
+        RECT rect = {0,0,size.width,size.height};\r
+        // 互換DCへのバインド\r
+        throw_if_err<>()(dcr->BindDC(cdc.get(),&rect));\r
+        dcr->DrawBitmap(ptr);\r
+      }\r
+    }\r
+    icon(bmp,size.width,size.height);\r
+  };\r
+\r
+\r
+  icon::icon(boost::filesystem3::wpath& path)\r
+  {\r
+    icon_.reset(\r
+      reinterpret_cast<HICON>(\r
+        LoadImageW(NULL,path.native().c_str(),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_LOADFROMFILE)));\r
+  }\r
+\r
+  icon::~icon()\r
+  {\r
+\r
+  }\r
+\r
+  void icon::analyze()\r
+  {\r
+    ::ICONINFOEXW info;\r
+    ::GetIconInfoExW(icon_.get(),&info);\r
+    BITMAP bmp;\r
+    ::GetObjectW(info.hbmColor,sizeof(BITMAP),&bmp);\r
+    width_ = bmp.bmWidth;\r
+    height_ = bmp.bmHeight;\r
+    bits_per_pixel_ = bmp.bmBitsPixel;\r
+  }\r
+\r
+  icon& icon::operator= (icon& i)\r
+  {\r
+    BOOST_ASSERT(icon_ != i.icon_);\r
+    if(icon_ == i.icon_) return *this;\r
+    icon_.reset(::CopyIcon(i.icon_.get()));\r
+    width_ = i.width_;\r
+    height_ = i.height_;\r
+    bits_per_pixel_ = i.bits_per_pixel_;\r
+    return *this;\r
+  }\r
+\r
+  //icon_ptr icon::create_icon()\r
+  //{\r
\r
+  //  // ビットマップヘッダのセットアップ\r
+  //  BITMAPV5HEADER bi = {0};\r
+  //  bi.bV5Size           = sizeof(BITMAPV5HEADER);\r
+  //  bi.bV5Width           = width_;\r
+  //  bi.bV5Height          = height_;\r
+  //  bi.bV5Planes = 1;\r
+  //  bi.bV5BitCount = 32;\r
+  //  bi.bV5Compression = BI_BITFIELDS;\r
+  //  bi.bV5RedMask   =  0x00FF0000;\r
+  //  bi.bV5GreenMask =  0x0000FF00;\r
+  //  bi.bV5BlueMask  =  0x000000FF;\r
+  //  bi.bV5AlphaMask =  0xFF000000; \r
+\r
+  //  // デスクトップHDCの取得\r
+  //  get_dc dc(NULL);\r
+\r
+  //  // DIBセクションの作成\r
+  //  void *bits;// 得られるビットマップ\r
+  //  gdi_object<HBITMAP> bmp(\r
+  //    ::CreateDIBSection(\r
+  //      dc.get(),reinterpret_cast<BITMAPINFO *>(&bi),DIB_RGB_COLORS,&bits,NULL,0));\r
+  //  { \r
+  //    // 互換DCの作成\r
+  //    compatible_dc cdc(dc.get());\r
+  //    {\r
+  //      // 描画先への切り替え\r
+  //      select_object s(cdc.get(),bmp);\r
+\r
+  //      // DC互換レンダーターゲットのセットアップ\r
+  //      D2D1_RENDER_TARGET_PROPERTIES \r
+  //        props = D2D1::RenderTargetProperties(\r
+  //        D2D1_RENDER_TARGET_TYPE_DEFAULT,\r
+  //        D2D1::PixelFormat(\r
+  //            DXGI_FORMAT_B8G8R8A8_UNORM,\r
+  //            D2D1_ALPHA_MODE_PREMULTIPLIED),\r
+  //        0,\r
+  //        0,\r
+  //        D2D1_RENDER_TARGET_USAGE_NONE,\r
+  //        D2D1_FEATURE_LEVEL_DEFAULT\r
+  //      );\r
+\r
+  //      ID2D1DCRenderTargetPtr dcr;\r
+  //      throw_if_err<>()(factory_->CreateDCRenderTarget(&props,&dcr));\r
+  //      RECT rect = {0,0,w,h};\r
+  //      // 互換DCへのバインド\r
+  //      throw_if_err<>()(dcr->BindDC(cdc.get(),&rect));\r
+\r
+  //      // ブラシのセットアップ(背景の赤丸)\r
+  //      ID2D1SolidColorBrushPtr brush_e;\r
+  //      throw_if_err<>()(\r
+  //        dcr->CreateSolidColorBrush(\r
+  //          D2D1::ColorF(D2D1::ColorF::Red,0.8f), &brush_e));\r
+\r
+  //      // アイコンに描画する文字の生成\r
+  //      std::wstring t(L"S.F.\nTimer");\r
+  //      D2D1_RECT_F l = D2D1::RectF(0.0f,0.0f,width_,height_);\r
+  //      // Text Formatの作成\r
+  //      IDWriteTextFormatPtr f;\r
+  //      write_factory_->CreateTextFormat(\r
+  //      L"メイリオ",                // Font family name.\r
+  //      NULL,                       // Font collection (NULL sets it to use the system font collection).\r
+  //      DWRITE_FONT_WEIGHT_REGULAR,\r
+  //      DWRITE_FONT_STYLE_NORMAL,\r
+  //      DWRITE_FONT_STRETCH_NORMAL,\r
+  //      10.0f,\r
+  //      L"ja-jp",\r
+  //      &f\r
+  //      );\r
+  //      f->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);\r
+  //      f->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);\r
+\r
+  //      // 文字描画用ブラシのセットアップ\r
+  //      ID2D1SolidColorBrushPtr brush;\r
+  //      dcr->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &brush);\r
+  //      // 描画開始\r
+  //      dcr->BeginDraw();\r
+  //      // ビットマップクリア\r
+  //      dcr->Clear(D2D1::ColorF(D2D1::ColorF::Black,0.0f));\r
+  //      // 赤丸を描く\r
+  //      dcr->FillEllipse(D2D1::Ellipse(D2D1::Point2F(16.0f,16.0f),14,14),brush_e);\r
+  //      // テキストを表示する\r
+  //      dcr->DrawTextW(t.c_str(),t.size(),f,&l,brush);\r
+  //      // 描画終了\r
+  //      dcr->EndDraw();\r
+  //    }\r
+  //  }\r
+  //}\r
+}\r
diff --git a/winwrapper/icon.h b/winwrapper/icon.h
new file mode 100644 (file)
index 0000000..8e1d350
--- /dev/null
@@ -0,0 +1,100 @@
+#pragma once\r
+/*\r
+==============================================================================\r
+\r
+This file is part of the async\r
+Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+async can be redistributed and/or modified under the terms of the\r
+GNU General Public License, as published by the Free Software Foundation;\r
+either version 2 of the License, or (at your option) any later version.\r
+\r
+async is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with async; if not, visit www.gnu.org/licenses or write to the\r
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+Boston, MA 02111-1307 USA\r
+\r
+==============================================================================\r
+*/\r
+\r
+namespace sf {\r
+\r
+  struct icon_deleter {\r
+    typedef HICON pointer;\r
+    void operator ()(HICON handle) {\r
+      if (handle) {\r
+        ::DestroyIcon(handle);\r
+      }\r
+    }\r
+  };\r
+\r
+  /** icon\83n\83\93\83h\83\8b\82Ì\89ð\95ú\82µ\96Y\82ê\82ð\97\\96h\82·\82é */\r
+  typedef std::unique_ptr<HICON,icon_deleter> icon_holder;\r
+\r
+  /** \r
+  \81@icon\8aÇ\97\9d\83N\83\89\83X\r
+  */\r
+  struct icon\r
+  {\r
+  public:\r
+    icon(){};\r
+    explicit icon(uint32_t id);/// \83\8a\83\\81[\83XID\82©\82ç\83A\83C\83R\83\93\82ð\8dì\90¬\82·\82é\r
+    explicit icon(icon_holder& ic);/// \83A\83C\83R\83\93\83t\83H\83\8b\83_\82©\82ç\83A\83C\83R\83\93\82ð\8dì\90¬\82·\82é\r
+    explicit icon(icon_holder&& ic);/// \89E\95Ó\92l\8eQ\8fÆ\82©\82ç\83A\83C\83R\83\93\82ð\8dì\90¬\82·\82é\r
+    icon(bitmap_holder& bmp_color,int width = ::GetSystemMetrics(SM_CXICON),int height = ::GetSystemMetrics(SM_CYICON));\r
+    icon(ID2D1BitmapPtr& ptr);\r
+    icon(boost::filesystem3::wpath& path);\r
+\r
+    virtual ~icon();\r
+\r
+    HICON get() const {return icon_.get();};\r
+\r
+    icon(icon& i) : width_(i.width_),height_(i.height_),bits_per_pixel_(i.bits_per_pixel_)\r
+    {\r
+      icon_.reset(::CopyIcon(i.icon_.get()));\r
+    }\r
+\r
+    icon(icon&& i) : width_(i.width_),height_(i.height_),bits_per_pixel_(i.bits_per_pixel_)\r
+    {\r
+      std::swap(icon_,i.icon_);\r
+    }\r
+\r
+    icon& operator= (icon&& i) \r
+    {\r
+      BOOST_ASSERT(icon_ != i.icon_);\r
+      if(icon_ == i.icon_) return *this;\r
+      std::swap(icon_,i.icon_);\r
+      width_ = i.width_;\r
+      height_ = i.height_;\r
+      bits_per_pixel_ = i.bits_per_pixel_;\r
+      return *this;\r
+    }\r
+\r
+    icon& operator= (icon& i);\r
+\r
+    void swap(icon& i)\r
+    {\r
+      std::swap(icon_,i.icon_);\r
+      std::swap(width_,i.width_);\r
+      std::swap(height_,i.height_);\r
+      std::swap(bits_per_pixel_,i.bits_per_pixel_);\r
+    }\r
+\r
+  private:\r
+\r
+    void analyze();\r
+    //ID2D1DCRenderTargetPtr dcr_;\r
+    //ID2D1BitmapPtr bitmap_;\r
+    int width_;\r
+    int height_;\r
+    int bits_per_pixel_;\r
+    icon_holder icon_;\r
+    static bitmap_holder default_mono_bitmap; \r
+  };\r
+}\r
+\r
diff --git a/winwrapper/jumplist.cpp b/winwrapper/jumplist.cpp
new file mode 100644 (file)
index 0000000..2a4bf29
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+#include "StdAfx.h"\r
+#include "jumplist.h"\r
+\r
+\r
diff --git a/winwrapper/jumplist.h b/winwrapper/jumplist.h
new file mode 100644 (file)
index 0000000..647fbe7
--- /dev/null
@@ -0,0 +1,32 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+namespace sf{\r
+struct jumplist\r
+{\r
+public:\r
+  jumplist(){};\r
+  virtual ~jumplist(){};\r
+};\r
+}\r
+\r
diff --git a/winwrapper/logger.cpp b/winwrapper/logger.cpp
new file mode 100644 (file)
index 0000000..72760fd
--- /dev/null
@@ -0,0 +1,119 @@
+/*\r
+==============================================================================\r
+\r
+This file is part of the S.F.Tracker\r
+Copyright 2005-7 by Satoshi Fujiwara.\r
+\r
+S.F.Tracker can be redistributed and/or modified under the terms of the\r
+GNU General Public License, as published by the Free Software Foundation;\r
+either version 2 of the License, or (at your option) any later version.\r
+\r
+S.F.Tracker is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with S.F.Tracker; if not, visit www.gnu.org/licenses or write to the\r
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+Boston, MA 02111-1307 USA\r
+\r
+==============================================================================\r
+*/\r
+/** @file\r
+*  @author S.F. (Satoshi Fujiwara)\r
+*/\r
+\r
+#include "stdafx.h"\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+namespace sf {\r
+\r
+  struct logger::impl \r
+  {\r
+    impl() : m_log_file("sftracker.log",std::ios_base::out | std::ios_base::trunc ){};\r
+    ~impl() {m_log_file.close();}\r
+\r
+    void write(const boost::wformat & fmt)\r
+    {\r
+      write(fmt.str());\r
+    };\r
+\r
+    void write(const std::wistream & st)\r
+    {\r
+      {   \r
+        //mutex_type::scoped_lock lock_(m_mutex);\r
+        m_log_file << st << std::endl;\r
+      }\r
+      boost::gregorian::date dt = boost::gregorian::day_clock::local_day();\r
+\r
+    };\r
+\r
+    void write(const std::wstring & mes) \r
+    {   \r
+      write(mes.c_str());\r
+    }\r
+\r
+    void write(const TCHAR * mes) \r
+    {   \r
+      //mutex_type::scoped_lock lock_(m_mutex);\r
+      m_log_file << mes << std::endl;\r
+      m_log_file.flush();\r
+    }   \r
+  private:\r
+    std::wofstream m_log_file;\r
+    //mutex_type m_mutex;\r
+  };\r
+\r
+  logger::logger() : m_impl(new logger::impl())\r
+  {\r
+  }\r
+  void logger::write(const boost::wformat & fmt)\r
+  {\r
+    m_impl->write(fmt);\r
+  };\r
+\r
+  void logger::write(const std::wstring & mes) \r
+  {   \r
+    m_impl->write(mes);\r
+  }\r
+\r
+  void logger::write(const TCHAR * mes) \r
+  {   \r
+    m_impl->write(mes);\r
+  }   \r
+\r
+  void logger::write(const std::wistream & st)\r
+  {\r
+    m_impl->write(st);\r
+  }\r
+\r
+  logger::~logger()\r
+  {\r
+\r
+  }\r
+\r
+  void debug_out(const char * file_name,const int line,boost::wformat& fmt)\r
+  {\r
+    OutputDebugString((boost::wformat(_T("%s(%d) %s \n")) % std::wstring(sf::code_converter<char,wchar_t>(file_name)) % line % fmt).str().c_str());\r
+  };\r
+\r
+  void debug_out(const char * file_name,const int line,const std::wstring& str)\r
+  {\r
+    OutputDebugString((boost::wformat(_T("%s(%d) %s \n")) % std::wstring(sf::code_converter<char,wchar_t>(file_name)) % line % str).str().c_str());\r
+  };\r
+\r
+  void debug_out(const char * file_name,const int line,const char* str)\r
+  {\r
+    OutputDebugString((boost::wformat(_T("%s(%d) %s \n")) % std::wstring(sf::code_converter<char,wchar_t>(file_name)) %  line % sf::code_converter<char,wchar_t>(str)).str().c_str());\r
+  }\r
+\r
+  void debug_outW(const char * file_name,const int line,const wchar_t* str)\r
+  {\r
+    OutputDebugString((boost::wformat(_T("%s(%d) %s \n")) % std::wstring(sf::code_converter<char,wchar_t>(file_name)) % line % str).str().c_str());\r
+  };\r
+\r
+}\r
diff --git a/winwrapper/logger.h b/winwrapper/logger.h
new file mode 100644 (file)
index 0000000..13e6bcc
--- /dev/null
@@ -0,0 +1,37 @@
+#pragma once\r
+\r
+#include "boost/date_time/gregorian/gregorian.hpp"\r
+#include "boost/date_time/posix_time/posix_time.hpp"\r
+#include "singleton.h"\r
+\r
+namespace sf {\r
+\r
+  struct logger : public singleton<logger>\r
+  {\r
+  public:\r
+    logger();\r
+    ~logger();\r
+    void write(const boost::wformat & fmt);\r
+    void write(const std::wstring & mes);\r
+    void write(const TCHAR * mes);\r
+    void write(const std::wistream & st);\r
+  private:\r
+    struct impl;\r
+    std::shared_ptr<impl> m_impl;\r
+  };\r
+\r
+  void debug_out(const char * file_name,const int line,boost::wformat& fmt);\r
+  void debug_out(const char * file_name,const int line,const std::wstring& str);\r
+  void debug_out(const char * file_name,const int line,const char* str);\r
+  void debug_out(const char * file_name,const int line,const wchar_t* str);\r
+}\r
+\r
+#define WRITE_LOG(s) \\r
+  sf::logger::instance()->write(boost::wformat(_T("%s %s %6d %s")) % boost::posix_time::second_clock::local_time() % (TCHAR*)sf::ca2t(__FILE__) % __LINE__ % (s))\r
+\r
+#ifdef _DEBUG\r
+#define SFTRACE(x) sf::debug_out(__FILE__,__LINE__,(x))\r
+#else \r
+#define SFTRACE(x) \r
+#endif\r
+\r
diff --git a/winwrapper/message_loop.h b/winwrapper/message_loop.h
new file mode 100644 (file)
index 0000000..6b17d73
--- /dev/null
@@ -0,0 +1,92 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the S.F.Tracker\r
+   Copyright 2005-7 by Satoshi Fujiwara.\r
+\r
+   S.F.Tracker can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   S.F.Tracker is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with S.F.Tracker; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+/** @file\r
+ *  @brief \r
+ *  @author S.F. (Satoshi Fujiwara)\r
+ */\r
+namespace sf {\r
+       struct run_message_loop\r
+       {\r
+               run_message_loop(){};\r
+               inline WPARAM operator()()\r
+               {\r
+                       MSG msg;\r
+                       while (GetMessage(&msg, NULL, 0, 0))\r
+                       {\r
+                               TranslateMessage(&msg);\r
+                               DispatchMessage(&msg);\r
+                       }\r
+      return msg.wParam;\r
+               }\r
+\r
+               ~run_message_loop(void){};\r
+       };\r
+\r
+       struct peek_message_loop\r
+       {\r
+               typedef boost::function<void ()> func_type;\r
+               explicit peek_message_loop(func_type func)  {func_ =  func;};\r
+               inline WPARAM operator()()\r
+               {\r
+                       MSG msg = {0};\r
+                       while( WM_QUIT != msg.message )\r
+                       {\r
+                               if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )\r
+                               {\r
+                                       TranslateMessage( &msg );\r
+                                       DispatchMessage( &msg );\r
+                               }\r
+                               else\r
+                               {\r
+                                       func_();  // Do some rendering\r
+                               }\r
+                       }\r
+      return msg.wParam;\r
+               };\r
+       private:\r
+               func_type func_;\r
+       };\r
+\r
+  struct dialog_message_loop\r
+       {\r
+               dialog_message_loop(HWND dialog) : dialog_(dialog) {};\r
+               inline WPARAM operator()()\r
+               {\r
+                       MSG msg;\r
+                       while (GetMessage(&msg, NULL, 0, 0))\r
+                       {\r
+        if(IsDialogMessage(dialog_,&msg) == FALSE)\r
+        {\r
+                                 TranslateMessage(&msg);\r
+                                 DispatchMessage(&msg);\r
+        }\r
+                       }\r
+      return msg.wParam;\r
+               }\r
+               ~dialog_message_loop(){};\r
+  private:\r
+    HWND dialog_;\r
+\r
+       };\r
+}\r
diff --git a/winwrapper/sf_com.cpp b/winwrapper/sf_com.cpp
new file mode 100644 (file)
index 0000000..f42a294
--- /dev/null
@@ -0,0 +1,64 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the S.F.Tracker\r
+   Copyright 2005-7 by Satoshi Fujiwara.\r
+\r
+   S.F.Tracker can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   S.F.Tracker is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with S.F.Tracker; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+/** @file\r
+ *  @brief util\r
+ *  @author S.F. (Satoshi Fujiwara)\r
+ */\r
+\r
+#include "stdafx.h"\r
+#include <objbase.h>\r
+#include "sf_com.h"\r
+namespace sf {\r
+\r
+    struct com_initialize::impl\r
+    {\r
+               impl(void * reserved,unsigned int init) : hr(::CoInitializeEx(reserved,init))\r
+        {\r
+        }\r
+\r
+        ~impl()\r
+        {\r
+                       if(hr == S_OK){\r
+                   ::CoUninitialize();\r
+                       }\r
+        }\r
+       private:\r
+               HRESULT hr;\r
+    };\r
+\r
+    com_initialize::com_initialize(void * reserved,unsigned int  init)\r
+        : m_impl(new com_initialize::impl(reserved,init))\r
+    {\r
+    };\r
+\r
+       //template <typename ComClass,typename ComInterface> boost::intrusive_ptr<ComInterface> com_creator<ComClass,ComInterface>::create_instance()\r
+       //{\r
+       //      ComClass * com_ptr;\r
+       //      CoCreateInstance( __uuidof(ComClass), NULL,\r
+       //                       CLSCTX_ALL, __uuidof(ComInterface),\r
+       //                       (void**)&com_ptr);\r
+       //      return instrusive_ptr<ComClass>(com_ptr,false);\r
+       //};\r
+\r
+\r
+}
\ No newline at end of file
diff --git a/winwrapper/sf_com.h b/winwrapper/sf_com.h
new file mode 100644 (file)
index 0000000..225a91e
--- /dev/null
@@ -0,0 +1,111 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the Shooting3\r
+   Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+/** @file\r
+ *  @brief util\r
+ *  @author S.F. (Satoshi Fujiwara)\r
+ */\r
+#include "objbase.h"\r
+\r
+\r
+\r
+namespace sf \r
+{\r
+  template <class COM_SMART_PTR > inline void safe_release(COM_SMART_PTR& ptr)\r
+  {\r
+    if(ptr)\r
+    {\r
+      ptr.Release();\r
+    }\r
+  };\r
+    enum com_init \r
+    {\r
+        multi_threaded  = 0x0,\r
+        apartment_threaded = 0x2,\r
+        disable_ole1dde   = 0x4,\r
+        speed_over_memory = 0x8\r
+    };\r
+\r
+    struct com_initialize\r
+    {\r
+        struct impl;\r
+        com_initialize(void * reserved ,unsigned int init);\r
+        com_initialize(){com_initialize(0,multi_threaded);};\r
+        ~com_initialize() {};\r
+    private:\r
+        std::shared_ptr<impl> m_impl;\r
+    };\r
+\r
+       template <typename ComClass,typename ComInterface> \r
+                 boost::intrusive_ptr<ComInterface> create_instance()\r
+                 {\r
+                       ComInterface * com_ptr;\r
+                       CoCreateInstance( __uuidof(ComClass), NULL,\r
+                                        CLSCTX_ALL, __uuidof(ComInterface),\r
+                                        (void**)&com_ptr);\r
+                       return boost::intrusive_ptr<ComInterface>(com_ptr,false);\r
+\r
+                 };\r
+                       template <typename COMInterface> \r
+               struct IUnknownImpl : public COMInterface \r
+               {\r
+                       IUnknownImpl() : ref_(1) {}; \r
+                       virtual ~IUnknownImpl() {};\r
+                       ULONG __stdcall AddRef()\r
+                       {\r
+                               return InterlockedIncrement(&ref_);\r
+                       }\r
+\r
+                       ULONG __stdcall Release()\r
+                       {\r
+                               ULONG ref = InterlockedDecrement(&ref_);\r
+                               if (0 == ref)\r
+                               {\r
+                                       delete this;\r
+                               }\r
+                               return ref;\r
+                       }\r
+\r
+                       HRESULT __stdcall QueryInterface(REFIID riid, VOID **ppObj)\r
+                       {\r
+                               if (IID_IUnknown == riid)\r
+                               {\r
+                                       AddRef();\r
+                                       *ppObj = (IUnknown*)this;\r
+                               }\r
+                               else if (__uuidof(COMInterface) == riid)\r
+                               {\r
+                                       AddRef();\r
+                                       *ppObj = (COMInterface*)this;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *ppObj = NULL;\r
+                                       return E_NOINTERFACE;\r
+                               }\r
+                               return S_OK;\r
+                       }\r
+               private:\r
+                       LONG ref_;\r
+               };\r
+}
\ No newline at end of file
diff --git a/winwrapper/sf_memory.h b/winwrapper/sf_memory.h
new file mode 100644 (file)
index 0000000..d3a0c41
--- /dev/null
@@ -0,0 +1,115 @@
+#pragma once\r
+namespace sf {\r
+// policy class\r
+struct heap_memory_free_policy\r
+{\r
+template< typename T >\r
+void operator()( const T* AMemory ) const\r
+{\r
+if( NULL != AMemory )\r
+::HeapFree( ::GetProcessHeap(), 0, AMemory );\r
+}\r
+};\r
+// policy class\r
+struct local_memory_free_policy\r
+{\r
+template< typename T >\r
+void operator()( const T* AMemory ) const\r
+{\r
+if( NULL != AMemory )\r
+::LocalFree( AMemory );\r
+}\r
+};\r
+// policy class\r
+struct co_task_memory_free_policy\r
+{\r
+template< typename T >\r
+void operator()( const T* AMemory ) const\r
+{\r
+if( NULL != AMemory )\r
+::CoTaskMemFree( AMemory );\r
+}\r
+};\r
+// base guard class\r
+template< typename T,class TFreePolicy >\r
+class base_memory\r
+{\r
+private:\r
+T *FMemory;\r
+\r
+public:\r
+base_memory( T* AMemory = NULL )\r
+: FMemory( AMemory ) {}\r
+\r
+virtual ~base_memory( void )\r
+{ reset(); }\r
+\r
+T* release( void )\r
+{\r
+T *tmp = FMemory;\r
+FMemory = NULL;\r
+return tmp;\r
+}\r
+\r
+void reset( T* AMemory = NULL )\r
+{\r
+if( AMemory != FMemory )\r
+{\r
+if( NULL != FMemory )\r
+TFreePolicy( FMemory );\r
+\r
+FMemory = AMemory;\r
+}\r
+}\r
+\r
+T* get( void )\r
+{ return FMemory; }\r
+\r
+T* operator ->(void)\r
+{\r
+  return FMemory;\r
+}\r
+\r
+T** operator&( void )\r
+{ return &FMemory; }\r
+\r
+};\r
+template< typename T >\r
+class heap_memory : public base_memory< T, \r
+heap_memory_free_policy >\r
+{\r
+public:\r
+heap_memory( T* AMemory = NULL )\r
+: base_memory< T, heap_memory_free_policy >( AMemory )\r
+{ }\r
+};\r
+template< typename T >\r
+class local_memory : public base_memory< T, \r
+local_memory_free_policy >\r
+{\r
+public:\r
+local_memory( T* AMemory = NULL )\r
+: base_memory< T, local_memory_free_policy >( AMemory )\r
+{ }\r
+};\r
+template< typename T >\r
+class co_task_memory : public base_memory< T, co_task_memory_free_policy >\r
+{\r
+public:\r
+co_task_memory( T* AMemory = NULL )\r
+: base_memory< T, co_task_memory_free_policy >( AMemory )\r
+{ }\r
+};\r
+\r
+struct handle_deleter {\r
+  typedef HANDLE pointer;\r
+  void operator ()(HANDLE handle) {\r
+      if (handle != INVALID_HANDLE_VALUE) {\r
+          CloseHandle(handle);\r
+      }\r
+  }\r
+};\r
+\r
+typedef std::unique_ptr<HANDLE,handle_deleter> handle_holder;\r
+\r
+};\r
diff --git a/winwrapper/sf_windows.cpp b/winwrapper/sf_windows.cpp
new file mode 100644 (file)
index 0000000..837bb9e
--- /dev/null
@@ -0,0 +1,247 @@
+#include "stdafx.h"\r
+#define BOOST_ASSIGN_MAX_PARAMS 7\r
+#include <boost/assign.hpp>\r
+#include <boost/assign/ptr_list_of.hpp>\r
+#include <boost/assign/ptr_list_inserter.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "exception.h"\r
+\r
+\r
+\r
+#define THROW_IFERR(hres) \\r
+  if (FAILED(hres)) { throw sf::win32_error_exception(hres); }\r
+\r
+#ifndef HINST_THISCOMPONENT\r
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;\r
+#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)\r
+#endif\r
+using namespace std;\r
+\r
+namespace sf \r
+{\r
+  template <typename ProcType> \r
+  typename base_win32_window<ProcType>::result_t base_win32_window<ProcType>::window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)\r
+  {\r
+\r
+    switch (message)\r
+    {\r
+    case WM_NCCREATE:\r
+      return on_nccreate(reinterpret_cast<CREATESTRUCT*>(lParam));\r
+    case WM_CREATE:\r
+      return on_create(reinterpret_cast<CREATESTRUCT*>(lParam));\r
+    case WM_INITDIALOG:\r
+      return on_init_dialog(reinterpret_cast<HWND>(wParam),lParam);\r
+    case WM_SIZE:\r
+      return on_size(wParam,LOWORD(lParam),HIWORD(lParam)) ;\r
+    case WM_PAINT:\r
+      return on_paint();\r
+    case WM_DISPLAYCHANGE:\r
+      return on_display_change(wParam,LOWORD(lParam),HIWORD(lParam));\r
+    case WM_ERASEBKGND:\r
+      return on_erase_backgroud(reinterpret_cast<HDC>(wParam));\r
+    case WM_HSCROLL:\r
+      return on_hscroll(LOWORD(wParam),HIWORD(wParam),reinterpret_cast<HWND>(lParam));\r
+    case WM_VSCROLL:\r
+      return on_vscroll(LOWORD(wParam),HIWORD(wParam),reinterpret_cast<HWND>(lParam));\r
+    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
+      ;\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
+    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
+    case WM_MOUSEMOVE:\r
+      {\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
+      }\r
+    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
+    case WM_MOUSELEAVE:\r
+      return on_mouse_leave() ;\r
+    case WM_KEYDOWN:\r
+      return on_key_down(wParam,lParam & 0xffff0000,LOWORD(lParam)) ;\r
+    case WM_KEYUP:\r
+      return on_key_up(wParam,lParam & 0xffff0000,LOWORD(lParam)) ;\r
+    case WM_APPCOMMAND:\r
+      return on_app_command(GET_APPCOMMAND_LPARAM(lParam),GET_DEVICE_LPARAM(lParam),GET_KEYSTATE_LPARAM(lParam));\r
+    case WM_COMMAND:\r
+      return on_command(wParam,lParam);\r
+    case WM_DESTROY:\r
+      return on_destroy();\r
+    case WM_CLOSE:\r
+      return on_close();\r
+    case WM_TIMER:\r
+      return on_timer(wParam);\r
+    case WM_NOTIFY:\r
+      return on_notify(reinterpret_cast<NMHDR*>(lParam));\r
+    }\r
+\r
+    // 他のWindowメッセージを派生クラス側でフックできるようにする\r
+    return other_window_proc(hwnd,message,wParam,lParam);\r
+\r
+  };\r
+  \r
+   template <typename ProcType> \r
+  void base_win32_window<ProcType>::register_class (\r
+    const wchar_t * menu_name,\r
+    uint32_t        style ,\r
+    int32_t     cbClsExtra,\r
+    int32_t   cbWndExtra,\r
+    HICON       hIcon ,\r
+    HCURSOR     hCursor,\r
+    HBRUSH      hbrBackground ,\r
+    HICON       hIconSm\r
+    )          \r
+  {\r
+    wnd_class_.reset(new sf::window_class_ex(menu_name,name_,HINST_THISCOMPONENT,thunk_proc_,style,cbClsExtra,cbWndExtra,hIcon,hCursor,hbrBackground,hIconSm));\r
+  }\r
+\r
+  /** デフォルト設定 */\r
+  template <typename ProcType> \r
+  void base_win32_window<ProcType>::register_class()\r
+  {\r
+    wnd_class_.reset(new sf::window_class_ex(0,name_,HINST_THISCOMPONENT,thunk_proc_));\r
+  }\r
+\r
+  template <typename ProcType> \r
+  void base_win32_window<ProcType>::create_window()\r
+  {\r
+    // Create the application window.\r
+    //\r
+    // Because the CreateWindow function takes its size in pixels, we\r
+    // obtain the system DPI and use it to scale the window size.\r
+    //FLOAT dpiX, dpiY;\r
+    //factory_->GetDesktopDpi(&dpiX, &dpiY);\r
+\r
+\r
+    // Windowを作成する\r
+    CreateWindow(\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
+      NULL,\r
+      NULL,\r
+      HINST_THISCOMPONENT,\r
+      this\r
+      );\r
+    ::GetWindowPlacement(hwnd_,&wp_);\r
+  }\r
+\r
\r
+  //void base_win32_window::show() \r
+  //{\r
+  //  //HRESULT hr = S_OK;\r
+  //  //BOOL enable;\r
+  //  //DwmIsCompositionEnabled (&enable);\r
+  //  //if(enable){\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
+  //  //}\r
+  //  ::ShowWindow(hwnd_,SW_SHOW);\r
+  //  ::GetWindowPlacement(&wp_);\r
+  //}\r
+\r
+\r
+  template <typename ProcType> \r
+  void base_win32_window<ProcType>::update() {::UpdateWindow(hwnd_);}\r
+\r
+  template <typename ProcType> \r
+  base_win32_window<ProcType>::~base_win32_window()\r
+  {\r
+\r
+  }\r
+\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)\r
+  {\r
+    memset(&wp_,0,sizeof(wp_));\r
+    wp_.length = sizeof(WINDOWPLACEMENT);\r
+    thunk_proc_ = (WNDPROC)thunk_.getCode();\r
+    //create_device_independent_resources();\r
+  }\r
+\r
+  template struct base_win32_window<wndproc>;\r
+  template struct base_win32_window<dlgproc>;\r
+\r
+  //ID2D1FactoryPtr base_win32_window::factory() { return impl_->factory();};\r
+  //ID2D1HwndRenderTargetPtr base_win32_window::render_target() { return impl_->render_target();};\r
+  //IDWriteFactoryPtr base_win32_window::write_factory() {return impl_->write_factory();};\r
+\r
+  subclass_window::subclass_window(HWND hwnd) \r
+    : base_win32_window (\r
+      std::wstring(L""),std::wstring(L""),false,0,0\r
+    ),is_subclassed_(false)\r
+  {\r
+    attach(hwnd);\r
+  }\r
+\r
+  subclass_window::subclass_window()\r
+    : base_win32_window (\r
+      std::wstring(L""),std::wstring(L""),false,0,0\r
+    ),is_subclassed_(false)\r
+  {\r
+\r
+  }\r
+\r
+  subclass_window::~subclass_window()\r
+  {\r
+    detatch();\r
+  }\r
+\r
+  void subclass_window::attach(HWND hwnd)\r
+  {\r
+    if(is_subclassed_)\r
+      detatch();\r
+\r
+    hwnd_ = hwnd;\r
+    proc_backup_ = reinterpret_cast<WNDPROC>(::GetWindowLongPtrW(hwnd_,GWLP_WNDPROC));\r
+    SetWindowLongPtrW(hwnd_,GWLP_WNDPROC,reinterpret_cast<LONG_PTR>(thunk_proc_));\r
+    is_subclassed_ = true;\r
+  }\r
+\r
+  void subclass_window::detatch()\r
+  {\r
+    if(is_subclassed_)\r
+    {\r
+      SetWindowLongPtrW(hwnd_,GWLP_WNDPROC,reinterpret_cast<LONG_PTR>(proc_backup_));\r
+      is_subclassed_ = false;\r
+    }\r
+  }\r
+}\r
+\r
diff --git a/winwrapper/sf_windows.h b/winwrapper/sf_windows.h
new file mode 100644 (file)
index 0000000..851f73e
--- /dev/null
@@ -0,0 +1,576 @@
+#pragma once\r
+/*\r
+*/\r
+// Windows Header Files:\r
+#include "exception.h"\r
+#include "base_window.h"\r
+#include "dpi.h"\r
+#define XBYAK64\r
+#include "xbyak.h"\r
+#include "windows.h"\r
+#include "windowsx.h"\r
+#include "CommCtrl.h"\r
+#include <type_traits>\r
+//#include <boost/type_traits/is_same.hpp>\r
+// DLLのリンク\r
+#pragma comment(lib,"d2d1.lib")\r
+#pragma comment(lib,"winmm.lib")\r
+#pragma comment(lib,"dwrite.lib")\r
+#pragma comment(lib,"dwmapi.lib")\r
+\r
+//#include "input.h"\r
+\r
+// Direct Write\r
+\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFactory , __uuidof(IDWriteFactory));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteGdiInterop , __uuidof(IDWriteGdiInterop));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFontFace , __uuidof(IDWriteFontFace));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFont , __uuidof(IDWriteFont));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFontFamily , __uuidof(IDWriteFontFamily));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFontCollection , __uuidof(IDWriteFontCollection));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteLocalizedStrings , __uuidof(IDWriteLocalizedStrings));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteTextFormat, __uuidof(IDWriteTextFormat));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteTextLayout, __uuidof(IDWriteTextLayout));\r
+_COM_SMARTPTR_TYPEDEF(IDWriteFontFile,__uuidof(IDWriteTextLayout));\r
+//_COM_SMARTPTR_TYPEDEF(IDWriteFontFile,__uuidof(IDWriteTextLayout));\r
+\r
+// Direct2D\r
+\r
+_COM_SMARTPTR_TYPEDEF(ID2D1Factory,__uuidof(ID2D1Factory));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1HwndRenderTarget , __uuidof(ID2D1HwndRenderTarget));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1BitmapRenderTarget , __uuidof(ID2D1BitmapRenderTarget));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1GdiInteropRenderTarget , __uuidof(ID2D1GdiInteropRenderTarget));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1DCRenderTarget , __uuidof(ID2D1DCRenderTarget));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1PathGeometry , __uuidof(ID2D1PathGeometry));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1LinearGradientBrush , __uuidof(ID2D1LinearGradientBrush));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1GradientStopCollection , __uuidof(ID2D1GradientStopCollection));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1SolidColorBrush , __uuidof(ID2D1SolidColorBrush));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1BitmapBrush , __uuidof(ID2D1BitmapBrush));\r
+_COM_SMARTPTR_TYPEDEF(ID2D1Bitmap , __uuidof(ID2D1Bitmap));\r
+\r
+// WIC\r
+\r
+_COM_SMARTPTR_TYPEDEF(IWICImagingFactory, __uuidof(IWICImagingFactory));\r
+_COM_SMARTPTR_TYPEDEF(IWICBitmapDecoder,__uuidof(IWICBitmapDecoder));\r
+_COM_SMARTPTR_TYPEDEF(IWICBitmapFrameDecode,__uuidof(IWICBitmapFrameDecode));\r
+_COM_SMARTPTR_TYPEDEF(IWICStream,__uuidof(IWICStream));\r
+_COM_SMARTPTR_TYPEDEF(IWICFormatConverter,__uuidof(IWICFormatConverter));\r
+_COM_SMARTPTR_TYPEDEF(IWICBitmapScaler,__uuidof(IWICBitmapScaler));\r
+_COM_SMARTPTR_TYPEDEF(ITaskbarList3,__uuidof(ITaskbarList3));\r
+\r
+// DXGI \r
+\r
+_COM_SMARTPTR_TYPEDEF(IDXGISwapChain,__uuidof(IDXGISwapChain));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIFactory1,__uuidof(IDXGIFactory1));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIAdapter1,__uuidof(IDXGIAdapter1));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIDevice1,__uuidof(IDXGIDevice1));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIKeyedMutex,__uuidof(IDXGIKeyedMutex));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIObject,__uuidof(IDXGIObject));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIDeviceSubObject,__uuidof(IDXGIDeviceSubObject));\r
+_COM_SMARTPTR_TYPEDEF(IDXGISurface1,__uuidof(IDXGISurface1));\r
+_COM_SMARTPTR_TYPEDEF(IDXGIOutput,__uuidof(IDXGIOutput));\r
+//_COM_SMARTPTR_TYPEDEF(IDXGI,__uuidof(IDXGI));\r
+//_COM_SMARTPTR_TYPEDEF(IDXGI,__uuidof(IDXGI));\r
+\r
+// Direct3D\r
+\r
+_COM_SMARTPTR_TYPEDEF(ID3D11Device,__uuidof(ID3D11Device));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext,__uuidof(ID3D11DeviceContext));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11RenderTargetView,__uuidof(ID3D11RenderTargetView));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11DepthStencilView,__uuidof(ID3D11DepthStencilView));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11VertexShader,__uuidof(ID3D11VertexShader));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11PixelShader,__uuidof(ID3D11PixelShader));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11InputLayout,__uuidof(ID3D11InputLayout));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11Buffer,__uuidof(ID3D11Buffer));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11Texture2D,__uuidof(ID3D11Texture2D));\r
+_COM_SMARTPTR_TYPEDEF(ID3DBlob,__uuidof(ID3DBlob));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11ShaderResourceView,__uuidof(ID3D11ShaderResourceView));\r
+_COM_SMARTPTR_TYPEDEF(ID3D11SamplerState,__uuidof(ID3D11SamplerState));\r
+\r
+\r
+\r
+namespace sf{\r
+\r
+ /* inline template <class Exc = win32_error_exception> void throw_if_err<>()(HRESULT hr)\r
+  {\r
+    if(hr != S_OK){throw Exc(hr);}\r
+  };*/\r
+\r
+\r
+  ID2D1BitmapPtr load_bitmap_from_file(\r
+    ID2D1HwndRenderTargetPtr render_target,\r
+    IWICImagingFactoryPtr wic_factory,\r
+    std::wstring uri,\r
+    uint32_t destination_width = 0,\r
+    uint32_t destination_height = 0\r
+    );\r
+\r
+  /** WNDCLASSEXラッパクラス */\r
+  struct window_class_ex\r
+  {\r
+    window_class_ex(\r
+      const wchar_t*  menu_name ,\r
+      const std::wstring&  class_name ,\r
+      HINSTANCE   hInstance = NULL,\r
+      WNDPROC     lpfnWndProc = ::DefWindowProcW,\r
+      uint32_t        style = CS_HREDRAW | CS_VREDRAW,\r
+      int32_t     cbClsExtra  = 0,\r
+      int32_t     cbWndExtra = sizeof(LONG_PTR), \r
+      HICON       hIcon = ::LoadIcon(NULL,IDI_APPLICATION),\r
+      HCURSOR     hCursor = ::LoadCursor(NULL, IDC_ARROW),\r
+      HBRUSH      hbrBackground = ::CreateSolidBrush(0xff000000),\r
+      HICON       hIconSm = NULL\r
+      ) : is_register_(false)\r
+    {\r
+\r
+      if(::GetClassInfoExW(hInstance,class_name.c_str(),&wndclass_) == 0)\r
+      {\r
+        if(::GetLastError() == ERROR_CLASS_DOES_NOT_EXIST)\r
+        { \r
+          ::ZeroMemory(&wndclass_,sizeof(wndclass_));\r
+          wndclass_.lpszMenuName = (LPCWSTR)menu_name;\r
+          wndclass_.lpszClassName = class_name.c_str();\r
+          wndclass_.cbSize = sizeof(::WNDCLASSEXW);\r
+          wndclass_.cbWndExtra = cbWndExtra;\r
+          wndclass_.hInstance = hInstance;\r
+          wndclass_.lpfnWndProc = lpfnWndProc;\r
+          wndclass_.style = style;\r
+          wndclass_.cbClsExtra = cbClsExtra;\r
+          wndclass_.hIcon = hIcon;\r
+          wndclass_.hCursor = hCursor;\r
+          wndclass_.hbrBackground = hbrBackground;\r
+          wndclass_.hIconSm = hIconSm;\r
+          atom_ = ::RegisterClassExW(&wndclass_) ;\r
+          BOOST_ASSERT(atom_ != 0);\r
+          is_register_ = true;\r
+        } else {\r
+          throw win32_error_exception();\r
+        }\r
+      } else {\r
+        is_register_ = false;\r
+      }\r
+    };\r
+\r
+    ~window_class_ex()\r
+    {\r
+      if(is_register_){\r
+        ::UnregisterClassW(wndclass_.lpszClassName,wndclass_.hInstance);\r
+      }\r
+    }\r
+\r
+  private:\r
+    bool is_register_;\r
+    ATOM atom_;\r
+    ::WNDCLASSEXW wndclass_;\r
+  };\r
+\r
+  struct get_dc {\r
+    get_dc(HWND hwnd) : hwnd_(hwnd),hdc_(GetDC(hwnd)) {}\r
+    HDC get(){return hdc_;}\r
+    ~get_dc(){::ReleaseDC(hwnd_,hdc_);}\r
+  private:\r
+    HDC hdc_;\r
+    HWND hwnd_;\r
+  };\r
+\r
+  struct compatible_dc {\r
+    compatible_dc(HDC hdc) : hdc_(::CreateCompatibleDC(hdc)){}; \r
+    ~compatible_dc(){::DeleteDC(hdc_);};\r
+    HDC get() { return hdc_;};\r
+  private:\r
+    HDC hdc_;\r
+  };\r
+\r
+  struct ref_dc {\r
+    ref_dc(HDC& hdc) : hdc_(hdc) {};\r
+    ~ref_dc(){};\r
+    HDC get() { return hdc_;};\r
+  private:\r
+    HDC& hdc_;\r
+  };\r
+\r
+  struct d2_dc {\r
+    d2_dc(ID2D1GdiInteropRenderTargetPtr& ptr,D2D1_DC_INITIALIZE_MODE mode) :hdc_(0),ptr_(ptr)\r
+    {\r
+      hr_ = ptr->GetDC(mode,&hdc_);\r
+    };\r
+    ~d2_dc(){ptr_->ReleaseDC(NULL);};\r
+    HDC get() { return hdc_;};\r
+  private:\r
+    HRESULT hr_;\r
+    HDC hdc_;\r
+    ID2D1GdiInteropRenderTargetPtr& ptr_;\r
+  };\r
+\r
+  template <typename Holder>\r
+  struct device_context\r
+  {\r
+    explicit device_context(Holder* holder) : holder_(holder){};\r
+    ~device_context() {}\r
+    operator HDC(){return holder_->get();}\r
+  private:\r
+    std::unique_ptr<Holder> holder_;\r
+  };\r
+\r
+  //struct handle_holder : boost::noncopyable\r
+  //{\r
+  //  explicit handle_holder(HANDLE handle) : handle_(handle) {};\r
+  //  ~handle_holder(){if(handle_) ::CloseHandle(handle_);}\r
+  //  operator HANDLE(){return handle_;}\r
+  //private:\r
+  //  HANDLE handle_;\r
+  //};\r
+\r
+\r
+  struct HBITMAP_deleter {\r
+    typedef HBITMAP pointer;\r
+    void operator ()(HBITMAP handle) {\r
+        if (handle) {\r
+           ::DeleteObject(handle);\r
+        }\r
+    }\r
+  };\r
+\r
+  //template <typename Handle,typename Handle_Deleter>\r
+  //struct handle_holder {\r
+  //  typedef boost::unique_ptr<Handle,Handle_Deleter> holder_type;\r
+  //  handle_holder(Handle handle) : holder_(handle) {}\r
+  //  operator Handle(){return holder_->get();}\r
+  //private:\r
+  //  holder_type holder_;\r
+  //};\r
+\r
+  typedef std::unique_ptr<HBITMAP,HBITMAP_deleter> bitmap_holder;\r
+\r
+  typedef device_context<d2_dc> d2_dc_type;\r
+\r
+  struct paint_struct \r
+  {\r
+    paint_struct(HWND hwnd) : hwnd_(hwnd)\r
+    {\r
+      ::BeginPaint(hwnd,&paintstruct_);\r
+    }\r
+    ~paint_struct() {::EndPaint(hwnd_,&paintstruct_);}\r
+    PAINTSTRUCT* operator->(){return &paintstruct_;}\r
+  private:\r
+    HWND hwnd_;\r
+    PAINTSTRUCT paintstruct_;\r
+  };\r
+\r
+  // GDI オブジェクト管理テンプレート\r
+  template <class GdiObject> \r
+    struct gdi_object: boost::noncopyable\r
+  {\r
+    explicit gdi_object(GdiObject obj) : gdiobj_(obj) {}\r
+    ~gdi_object(){::DeleteObject(gdiobj_);}\r
+    operator GdiObject(){return gdiobj_;}\r
+  private:\r
+    GdiObject gdiobj_;\r
+  };\r
+\r
+  //\r
+  struct select_object \r
+  {\r
+    select_object(HDC dc,HGDIOBJ o) : dc_(dc),o_(::SelectObject(dc,o)) {}\r
+    ~select_object(){::SelectObject(dc_,o_);}\r
+  private:\r
+    HDC dc_;\r
+    HGDIOBJ o_;\r
+  };\r
+  \r
+  // Direct2D BeginDrawヘルパ関数\r
+  template <typename T >\r
+  struct begin_draw\r
+  {\r
+    typedef std::function<void(HRESULT hr)> err_handler_type;\r
+\r
+    begin_draw(T& render_target,err_handler_type& handler)\r
+      : render_target_(render_target) ,\r
+        is_end_(false),handler_(handler)\r
+    {render_target->BeginDraw();}\r
+\r
+    ~begin_draw(){ \r
+      HRESULT hr = S_OK;\r
+      hr = render_target_->EndDraw();\r
+      if( hr != S_OK)\r
+      {\r
+        handler_(hr);\r
+      }\r
+    }\r
+  private:\r
+    T& render_target_;\r
+    err_handler_type handler_;\r
+  };\r
+\r
+  struct mouse\r
+  {\r
+    mouse() : x_(0.0f),y_(0.0f),left_button_(false),middle_button_(false),right_button_(false){}\r
+  private:\r
+    float x_,y_;\r
+    bool left_button_,middle_button_,right_button_;\r
+  };\r
+\r
+  struct wndproc \r
+  {\r
+    typedef WNDPROC proc_type;\r
+    typedef LRESULT return_type;\r
+    static inline return_type def_wnd_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam) \r
+  {\r
+    return ::DefWindowProcW(hwnd,message,wParam,lParam);\r
+  }\r
+  };\r
+\r
+  struct dlgproc\r
+  {\r
+    typedef DLGPROC proc_type;\r
+    typedef INT_PTR return_type;\r
+    static inline return_type def_wnd_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)\r
+    {\r
+      return FALSE;\r
+    }\r
+  };\r
+\r
+  /** window ベースクラス */\r
+  template <typename ProcType = wndproc>\r
+  struct base_win32_window : public base_window \r
+  {\r
+    typedef ProcType proc_t;\r
+    typedef typename proc_t::return_type result_t;\r
+\r
+    operator HWND() const {return hwnd_;};\r
+    \r
+    virtual void * raw_handle() const {return hwnd_;};\r
+//    virtual void show(uint32_t show_flag);\r
+\r
+    virtual void show() {\r
+      ::ShowWindow(hwnd_,SW_SHOW);\r
+      ::GetWindowPlacement(hwnd_,&wp_);\r
+    }\r
+\r
+    // Window を画面から隠す\r
+    virtual bool is_show() {\r
+      return ( wp_.showCmd == SW_SHOWMAXIMIZED \r
+        || wp_.showCmd == SW_SHOWMINIMIZED\r
+        || wp_.showCmd == SW_SHOWNORMAL );\r
+    };\r
+\r
+    //\r
+    virtual void hide()\r
+    {\r
+      ::ShowWindow(hwnd_,SW_HIDE);\r
+      ::GetWindowPlacement(hwnd_,&wp_);\r
+    };\r
+\r
+    virtual void text(std::wstring& text)\r
+    {\r
+      ::SetWindowTextW(*this,text.c_str());\r
+    };\r
+\r
+    virtual void send_message(uint32_t message,uint32_t wparam,uint32_t lparam )\r
+    {\r
+      ::SendNotifyMessage(hwnd_,message,wparam,lparam);\r
+    }\r
+\r
+    virtual void post_message(uint32_t message,uint32_t wparam,uint32_t lparam )\r
+    {\r
+      ::PostMessage(hwnd_,message,wparam,lparam);\r
+    }\r
+\r
+    virtual void message_box(const std::wstring& text,const std::wstring& caption,uint32_t type = MB_OK)\r
+    {\r
+      ::MessageBox(hwnd_,text.c_str(),caption.c_str(),type);\r
+    }\r
+\r
+    \r
+    virtual void update();\r
+\r
+  protected:\r
+    \r
+    base_win32_window(\r
+      const std::wstring& title,\r
+      const std::wstring& name,bool fit_to_display,\r
+      float width,float height);\r
+\r
+   \r
+    ~base_win32_window();\r
+\r
+    void register_class (\r
+      const wchar_t* menu_name,\r
+      uint32_t style, \r
+      int32_t     cbClsExtra  = 0,\r
+      int32_t     cbWndExtra  = sizeof(LONG_PTR),\r
+      HICON       hIcon = ::LoadIcon(NULL,IDI_APPLICATION),\r
+      HCURSOR     hCursor = ::LoadCursor(NULL, IDC_ARROW),\r
+      HBRUSH      hbrBackground = ::CreateSolidBrush(0xff000000),\r
+      HICON       hIconSm = NULL\r
+      );               \r
+\r
+    /** デフォルト設定 */\r
+    void register_class();\r
+    void create_window();\r
+  public:\r
+    // SetWindowLong API\r
+    void set_long(int index,long data)\r
+    {\r
+      SetLastError(0);\r
+      if(::SetWindowLongW(hwnd_,index,data) == 0)\r
+      {\r
+        long err = 0;\r
+        if( (err = GetLastError()) != 0){\r
+          SetLastError(err);\r
+          throw sf::win32_error_exception();\r
+        }\r
+      };\r
+    }\r
+\r
+    void set_pos(\r
+      HWND hwnd_insert_after,  // 配置順序のハンドル\r
+      int x,                 // 横方向の位置\r
+      int y,                 // 縦方向の位置\r
+      int cx,                // 幅\r
+      int cy,                // 高さ\r
+      UINT flags            // ウィンドウ位置のオプション\r
+      )\r
+    {\r
+      BOOL res = SetWindowPos(hwnd_,hwnd_insert_after,x,y,cx,cy,flags);\r
+      if(!res)\r
+      {\r
+        throw win32_error_exception();\r
+      }\r
+    }\r
+\r
+    bool invalidate_rect(bool erase = false,const RECT * rect_ptr = 0)\r
+    {\r
+      return ::InvalidateRect(*this,rect_ptr,erase) == TRUE;\r
+    }\r
+\r
+    void enable_control(uint32_t id,bool enable)\r
+    {\r
+      ::EnableWindow(GetDlgItem(hwnd_,id),enable?TRUE:FALSE);\r
+    }\r
+\r
+    void enable_control(HWND hwnd,uint32_t id,bool enable)\r
+    {\r
+      ::EnableWindow(GetDlgItem(hwnd,id),enable?TRUE:FALSE);\r
+    };\r
+\r
+    virtual result_t window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam);\r
+    virtual result_t other_window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)\r
+    {\r
+      return proc_t::def_wnd_proc(hwnd,message,wParam,lParam);\r
+    };\r
+    \r
+    // デフォルトウィンドウメッセージハンドラ\r
+    virtual result_t on_nccreate(CREATESTRUCT *p) { return std::is_same<proc_t,wndproc>::value?1:FALSE;}\r
+    virtual result_t on_create(CREATESTRUCT *p) { return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_init_dialog(HWND default_focus_ctrl,LPARAM data) {return TRUE;}\r
+    virtual result_t on_size(uint32_t flag,uint32_t width,uint32_t height) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    //virtual LRESULT \r
+    virtual result_t on_paint() {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_display_change(uint32_t bpp,uint32_t h_resolution,uint32_t v_resolution) { return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_erase_backgroud(HDC dc) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_hscroll(uint32_t state,uint32_t position,HWND ctrl_hwnd) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_vscroll(uint32_t state,uint32_t position,HWND ctrl_hwnd) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_left_mouse_button_down(uint32_t mouse_key,int x,int y ) { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_left_mouse_button_up(uint32_t mouse_key,int x,int y) { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_left_mouse_button_double_click(uint32_t mouse_key,int x,int y) { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_mouse_move(uint32_t mouse_key,int x,int y) {return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_mouse_wheel(uint32_t mouse_key,int delta,int x,int y) {  return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    //virtual bool on_mouse_enter(uint32_t mouse_key,int x,int y) {  return false; }\r
+    virtual result_t on_mouse_leave() {  return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_destroy(){return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_close(){return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_set_cursor() { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_key_down(uint32_t vkey,uint32_t ext_key,uint32_t repeat) { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_key_up(uint32_t vkey,uint32_t ext_key,uint32_t repeat) { return std::is_same<proc_t,wndproc>::value?0:FALSE; }\r
+    virtual result_t on_app_command(uint32_t command,uint32_t device,uint32_t keystate) {return std::is_same<proc_t,wndproc>::value?0:FALSE;}\r
+    virtual result_t on_command(uint32_t wparam, uint32_t lparam)  { return std::is_same<proc_t,wndproc>::value?0:FALSE; } \r
+    virtual result_t on_timer(uint32_t timer_id)  { return std::is_same<proc_t,wndproc>::value?0:FALSE; } \r
+    virtual result_t on_notify(NMHDR* nmhdr)  { return std::is_same<proc_t,wndproc>::value?0:FALSE; } \r
+\r
+ protected:\r
+    static result_t CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
+    {\r
+      base_win32_window* ptr = reinterpret_cast<base_win32_window*>(hwnd);\r
+      hwnd = ptr->hwnd_;\r
+      // TODO: メッセージハンドラを拡張可能にする。\r
+      return ptr->window_proc(hwnd,message,wParam,lParam);\r
+    };\r
+\r
+    // thisとhwndをつなぐthunkクラス\r
+    struct hwnd_this_thunk : public Xbyak::CodeGenerator {\r
+      hwnd_this_thunk(base_win32_window* impl,typename proc_t::proc_type proc)\r
+      {\r
+        // rcxにhwndが格納されているので、それをimpl->hwndに保存\r
+        mov(qword[&(impl->hwnd_)],rcx);\r
+        // 代わりにthisのアドレスをrcxに格納\r
+        mov(rcx,(LONG_PTR)impl);\r
+        // r10にproc(Window プロシージャ)へのアドレスを格納\r
+        mov(r10,(LONG_PTR)proc);\r
+        // Window プロシージャへへジャンプ\r
+        jmp(r10);\r
+      }\r
+    };\r
+\r
+    HWND hwnd_;\r
+    hwnd_this_thunk thunk_;\r
+    std::wstring title_;\r
+    std::wstring name_;\r
+    float width_,height_;\r
+    bool fit_to_display_;\r
+    std::shared_ptr<sf::window_class_ex> wnd_class_;\r
+    typename proc_t::proc_type thunk_proc_;\r
+    dpi dpi_;\r
+    WINDOWPLACEMENT wp_;\r
+   };\r
+  \r
+   typedef base_win32_window<> base_win32_window_t;\r
+   typedef base_win32_window<DLGPROC> base_win32_dialog_t;\r
+\r
+  /// サブクラスウィンドウ\r
+  struct subclass_window : public base_win32_window_t\r
+  {\r
+    subclass_window(HWND hwnd);\r
+    subclass_window();\r
+    void attach(HWND hwnd);\r
+    void detatch();\r
+    ~subclass_window();\r
+    virtual result_t window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam) \r
+    {\r
+      return CallWindowProc(proc_backup_,hwnd,message,wParam,lParam);\r
+    };\r
+  protected:\r
+    bool is_subclassed_;\r
+    WNDPROC proc_backup_;\r
+  };\r
+\r
+struct av_mm_thread_characteristics\r
+{\r
+  av_mm_thread_characteristics(std::wstring& str) : task_name_(str)\r
+  {\r
+    handle_ = ::AvSetMmThreadCharacteristicsW(str.c_str(),(LPDWORD)&task_index_);\r
+  }\r
+\r
+  bool set_priority(AVRT_PRIORITY p){return (::AvSetMmThreadPriority(handle_,p) == TRUE);}\r
+\r
+  ~av_mm_thread_characteristics()\r
+  {\r
+    ::AvRevertMmThreadCharacteristics(handle_);\r
+  }\r
+\r
+private:\r
+  std::wstring task_name_;\r
+  uint32_t task_index_;\r
+  HANDLE handle_;\r
+};\r
+\r
+struct widget\r
+{\r
+  void draw();\r
+  float x_,y_;\r
+};\r
+\r
+typedef sf::begin_draw<ID2D1BitmapRenderTargetPtr> begin_draw_bitmap;\r
+typedef sf::begin_draw<ID2D1HwndRenderTargetPtr> begin_draw_hwnd;\r
+  \r
+}
\ No newline at end of file
diff --git a/winwrapper/singleton.h b/winwrapper/singleton.h
new file mode 100644 (file)
index 0000000..c9629cb
--- /dev/null
@@ -0,0 +1,55 @@
+#pragma once\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-7 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+/** @file\r
+ *  @brief \r
+ *  @author S.F. (Satoshi Fujiwara)\r
+ */\r
+#include <boost/thread.hpp>\r
+#include <boost/shared_ptr.hpp>\r
+namespace sf {\r
+    template<typename BaseClass,template <class> class PointerType = std::shared_ptr > struct singleton \r
+    {\r
+        typedef PointerType<BaseClass> ptr;\r
+        friend  BaseClass;\r
\r
+        static ptr& instance()\r
+        {\r
+            boost::call_once(init,flag_);\r
+            return instance_;\r
+        };\r
+\r
+\r
+        singleton(){};\r
+    private:\r
+        singleton(const singleton& );\r
+               static void init(){instance_.reset(new BaseClass);};\r
+        static PointerType<BaseClass> instance_;\r
+        static boost::once_flag flag_;\r
+    };\r
+\r
+    template<class BaseClass,template <class> class PointerType> boost::once_flag singleton<BaseClass,PointerType>::flag_ = BOOST_ONCE_INIT;\r
+    template<class BaseClass,template <class> class PointerType> PointerType<BaseClass> singleton<BaseClass,PointerType>::instance_;\r
+};\r
+\r
+\r
diff --git a/winwrapper/stdafx.cpp b/winwrapper/stdafx.cpp
new file mode 100644 (file)
index 0000000..f685e04
--- /dev/null
@@ -0,0 +1,7 @@
+// stdafx.cpp : 標準インクルードのみを含むソース ファイルです。\r
+// STed2.pch は、プリコンパイル済みヘッダーになります。\r
+//  stdafx.obj にはプリコンパイル型情報が含まれます。\r
+\r
+#include "stdafx.h"\r
+// TODO: このファイルではなく、STDAFX.H で必要な\r
+// 追加ヘッダーを参照してください。\r
diff --git a/winwrapper/stdafx.h b/winwrapper/stdafx.h
new file mode 100644 (file)
index 0000000..6a28507
--- /dev/null
@@ -0,0 +1,152 @@
+// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または\r
+// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル\r
+// を記述します。\r
+//\r
+\r
+\r
+#pragma once\r
+#include <SDKDDKVer.h>\r
+\r
+#ifndef UNICODE\r
+#define UNICODE\r
+#endif\r
+// STL\r
+#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers\r
+//\r
+// Modify the following defines if you have to target a platform prior to the ones specified below.\r
+// Refer to MSDN for the latest info on corresponding values for different platforms.\r
+#ifndef WINVER              // Allow use of features specific to Windows 7 or later.\r
+#define WINVER 0x0700       // Change this to the appropriate value to target other versions of Windows.\r
+#endif\r
+\r
+#ifndef _WIN32_WINNT        // Allow use of features specific to Windows 7 or later.\r
+#define _WIN32_WINNT 0x0700 // Change this to the appropriate value to target other versions of Windows.\r
+#endif\r
+#define DIRECTINPUT_VERSION 0x0800\r
+#define BOOST_THREAD_USE_LIB\r
+\r
+#include <stdint.h>\r
+#include <tchar.h>\r
+#include <iostream>\r
+#include <fstream>\r
+#include <exception>\r
+#include <memory>\r
+#include <string>\r
+#include <map>\r
+#include <locale>\r
+#include <fstream>\r
+#include <algorithm>\r
+#include <functional>\r
+\r
+// Boost\r
+#include <boost/archive/xml_woarchive.hpp>\r
+#include <boost/archive/xml_wiarchive.hpp>\r
+//#include <boost/archive/text_woarchive.hpp>\r
+//#include <boost/archive/text_wiarchive.hpp>\r
+//#include <boost/archive/text_oarchive.hpp>\r
+//#include <boost/archive/text_iarchive.hpp>\r
+//#include <boost/archive/binary_woarchive.hpp>\r
+//#include <boost/archive/binary_wiarchive.hpp>\r
+//#include <boost/archive/binary_oarchive.hpp>\r
+//#include <boost/archive/binary_iarchive.hpp>\r
+\r
+#include <boost/serialization/export.hpp>\r
+//#include <boost/serialization/is_abstract.hpp>\r
+#include <boost/serialization/version.hpp>\r
+#include <boost/serialization/serialization.hpp>\r
+#include <boost/serialization/split_member.hpp>\r
+#include <boost/serialization/string.hpp>\r
+#include <boost/serialization/shared_ptr.hpp>\r
+#include <boost/serialization/vector.hpp>\r
+#include <boost/serialization/nvp.hpp>\r
+#include <boost/serialization/void_cast.hpp>\r
+\r
+#include <boost/scoped_ptr.hpp> \r
+#include <boost/scoped_array.hpp> \r
+#include <boost/shared_ptr.hpp> \r
+#include <boost/shared_array.hpp> \r
+#include <boost/intrusive_ptr.hpp>\r
+#include <boost/format.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+#include <boost/array.hpp>\r
+#include <boost/thread.hpp>\r
+#include <boost/optional.hpp>\r
+#include <boost/bind.hpp>\r
+#include <boost/function.hpp>\r
+#include <boost/variant.hpp>\r
+#include <boost/any.hpp>\r
+#include <boost/signals2.hpp>\r
+#include <boost/tuple/tuple.hpp>\r
+#include <boost/ptr_container/ptr_container.hpp>\r
+#include <boost/thread/condition.hpp>\r
+//#include <boost/serialization/ptr_vector.hpp>\r
+#include <boost/ptr_container/ptr_array.hpp>\r
+#include <boost/ptr_container/serialize_ptr_container.hpp>\r
+//#include "serialization.h"\r
+#include <boost/filesystem/path.hpp>\r
+#include <boost/filesystem/operations.hpp>\r
+#include <boost/filesystem/convenience.hpp>\r
+#include <boost/filesystem/fstream.hpp>\r
+#include "sf_com.h"\r
+//#include <d3d10_1.h>\r
+//#include <d3d10.h>\r
+//#include <d3d11.h>\r
+//#include <d3dx10.h>\r
+//#include <d3dx11.h>\r
+#include "dinput.h"\r
+#include <wincodec.h>\r
+#include <windows.h>\r
+#include <windowsx.h>\r
+#include <wincodec.h>\r
+#include <wincodecsdk.h>\r
+\r
+#include <comdef.h>\r
+#include "avrt.h"\r
+#include "mmsystem.h"\r
+\r
+// Direct Input\r
+\r
+#include "dinput.h"\r
+\r
+\r
+// DXGI\r
+\r
+#include "dxgi.h"\r
+\r
+// Direct3D\r
+\r
+#include "d3d11.h"\r
+#include "d3dx11.h"\r
+//#include <d3dx11effect.h>\r
+//#include <d3dxGlobal.h>\r
+#include <d3dcompiler.h>\r
+#include <xnamath.h>\r
+\r
+// Direct2D\r
+\r
+#include <d2d1.h>\r
+#include <d2d1helper.h>\r
+\r
+// Direct Write\r
+\r
+#include <dwrite.h>\r
+\r
+// DWM\r
+\r
+#include "dwmapi.h" \r
+#include "Shobjidl.h"\r
+\r
+#include <wincodec.h>\r
+#include <wincodecsdk.h>\r
+\r
+//#include "exception.h"\r
+//#include "singleton.h"\r
+//#include "code_converter.h"\r
+//#include "logger.h"\r
+\r
+\r
+// TODO: プログラムに必要な追加ヘッダーをここで参照してください。\r
+#include "code_converter.h"\r
+#include "logger.h"\r
+#include "dout.h"\r
+#include "dxerr.h"\r
diff --git a/winwrapper/taskbar.cpp b/winwrapper/taskbar.cpp
new file mode 100644 (file)
index 0000000..37ec4a3
--- /dev/null
@@ -0,0 +1,98 @@
+#include "StdAfx.h"\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "taskbar.h"\r
+\r
+\r
+namespace sf {\r
+\r
+const int taskbar::none = TBPF_NOPROGRESS;\r
+const int taskbar::indeterminate = TBPF_INDETERMINATE;\r
+const int taskbar::normal = TBPF_NORMAL;\r
+const int taskbar::error = TBPF_ERROR;\r
+const int taskbar::paused = TBPF_PAUSED;\r
+\r
+long  taskbar::register_message()\r
+{\r
+  return ::RegisterWindowMessage(L"TaskbarButtonCreated");\r
+}\r
+\r
+struct taskbar::impl\r
+{\r
+  typedef throw_if_err<sf::taskbar::exception> throw_if_err_;\r
+\r
+  impl(){}\r
+  ~impl()\r
+  {\r
+    discard();\r
+  }\r
+\r
+  void create() {\r
+    throw_if_err_()(taskbar_.CreateInstance(CLSID_TaskbarList));\r
+  }\r
+  bool is_create() const \r
+  {\r
+    return (taskbar_ != 0);\r
+  }\r
+  void discard()\r
+  {\r
+    safe_release(taskbar_);\r
+  }\r
+    \r
+  void overlay_icon(const sf::base_window& w,const sf::icon& ic,const std::wstring& description)\r
+  {\r
+    throw_if_err_()(taskbar_->SetOverlayIcon(reinterpret_cast<HWND>(w.raw_handle()),ic.get(),description.c_str()));\r
+  }\r
+\r
+  void progress_state(const sf::base_window& w,TBPFLAG state)\r
+  {\r
+    throw_if_err_()(taskbar_->SetProgressState(reinterpret_cast<HWND>(w.raw_handle()),state));\r
+  }\r
+\r
+  void progress_value(const sf::base_window& w,boost::uint64_t completed, boost::uint64_t total)\r
+  {\r
+    throw_if_err_()(taskbar_->SetProgressValue(reinterpret_cast<HWND>(w.raw_handle()),completed,total));\r
+  }\r
+\r
+  void add_thumb_buttons(const sf::base_window& w,const std::vector<THUMBBUTTON>& tbs){\r
+      taskbar_->ThumbBarAddButtons(reinterpret_cast<HWND>(w.raw_handle()),tbs.size(),const_cast<LPTHUMBBUTTON>(&(tbs[0])));\r
+  };\r
+\r
+  void update_thumb_buttons(const sf::base_window& w,const std::vector<THUMBBUTTON>& tbs){\r
+      taskbar_->ThumbBarUpdateButtons(reinterpret_cast<HWND>(w.raw_handle()),tbs.size(),const_cast<LPTHUMBBUTTON>(&(tbs[0])));\r
+  };\r
+\r
+private:\r
+  _COM_SMARTPTR_TYPEDEF(ITaskbarList4,__uuidof(ITaskbarList4));\r
+  ITaskbarList4Ptr taskbar_;\r
+};\r
+\r
+   \r
+taskbar::taskbar() : impl_(new sf::taskbar::impl()) {}\r
+taskbar::~taskbar() { discard();};\r
+\r
+void taskbar::create(){impl_->create();};\r
+bool taskbar::is_create() const {return impl_->is_create();};\r
+void taskbar::discard(){impl_->discard();};\r
+void taskbar::overlay_icon(const sf::base_window& w,const icon& ic,const std::wstring& description){impl_->overlay_icon(w,ic,description);};\r
+void taskbar::progress_state(const sf::base_window& w,int state){impl_->progress_state(w,(TBPFLAG)state);};\r
+void taskbar::progress_value(const sf::base_window& w,boost::uint64_t completed, boost::uint64_t total){impl_->progress_value(w,completed,total);};\r
+void taskbar::add_thumb_buttons(const sf::base_window& w,const thumb_button_manager& tm){\r
+  BOOST_ASSERT(!tm.is_added);\r
+  impl_->add_thumb_buttons(w,tm.thumbbuttons_);\r
+  tm.is_added = true;\r
+};\r
+void taskbar::update_thumb_buttons(const sf::base_window& w,const thumb_button_manager& tm){\r
+  BOOST_ASSERT(tm.is_added);\r
+  if(tm.is_added){\r
+    impl_->update_thumb_buttons(w,tm.thumbbuttons_);\r
+  }\r
+};\r
+\r
+}
\ No newline at end of file
diff --git a/winwrapper/taskbar.h b/winwrapper/taskbar.h
new file mode 100644 (file)
index 0000000..97ccb0d
--- /dev/null
@@ -0,0 +1,161 @@
+#pragma once\r
+\r
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-10 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "exception.h"\r
+#include "icon.h"\r
+\r
+namespace sf\r
+{\r
+  \r
+  ///** インターフェース */\r
+  //struct thumb_button : boost::noncopyable\r
+  //{\r
+  //  typedef std::shared_ptr<thumb_button> ptr;\r
+  //  static ptr create_thumb_button();\r
+  //  virtual void show()  = 0;\r
+  //  virtual void hide()  = 0;\r
+  //  virtual void enable() = 0;\r
+  //  virtual void disable() = 0;\r
+  //private:\r
+  //  thumb_button();\r
+  //};\r
+\r
+  struct taskbar;\r
+\r
+  /** サムネイルボタン管理 */\r
+  struct thumb_button_manager\r
+  {\r
+    friend struct taskbar;\r
+    // Thumb Buttonは最大7個まで\r
+    static const int THUMB_BUTTON_MAX = 7;\r
+\r
+    // THUMBBUTTON構造体操作クラス\r
+    struct thumb_button {\r
+\r
+      // コンストラクタ\r
+      thumb_button(uint32_t id ,const icon& i,const std::wstring& tool_tip,THUMBBUTTON& t) : thumb_(t)\r
+      {\r
+        BOOST_ASSERT(tool_tip.size() < 259);\r
+        memset(&thumb_,0,sizeof(THUMBBUTTON));\r
+        thumb_.dwMask = THB_ICON | THB_TOOLTIP | THB_FLAGS;\r
+        thumb_.hIcon = i.get();\r
+        thumb_.iId = id;\r
+        std::copy(tool_tip.begin(),tool_tip.end(),thumb_.szTip);\r
+        //thumb_.szTip = const_cast<wchar_t*>(tool_tip_.c_str());\r
+      }\r
+      \r
+      // 今回はプロパティ・チェイニングなアクセス方法にしてみた。\r
+      /** アイコン */\r
+      thumb_button& set_icon(icon& ic) {thumb_.hIcon = ic.get(); return *this;};\r
+      /** IDのセット */\r
+      thumb_button& id(uint32_t v) {thumb_.iId = v; return *this;}\r
+      /** ツールチップ */\r
+      thumb_button& tool_tip(const std::wstring& v) {\r
+        BOOST_ASSERT(v.size() < 259);\r
+        std::copy(v.begin(),v.end(),thumb_.szTip);\r
+        thumb_.szTip[v.size()] = L'\0';\r
+        return *this;\r
+      }\r
+      /** 有効化・無効化 */\r
+      thumb_button& enable(bool v){v?(thumb_.dwFlags &= ~THBF_ENABLED):(thumb_.dwFlags |= THBF_DISABLED); return *this;}\r
+      /** クリックされたらサムネイルを閉じるか */\r
+      thumb_button& dismission_click(bool v){ v?(thumb_.dwFlags |= THBF_DISMISSONCLICK):(thumb_.dwFlags &= ~THBF_DISMISSONCLICK); return *this;}\r
+      /** ボタンの外枠を描画するかどうか */\r
+      thumb_button& no_background(bool v){v?(thumb_.dwFlags |= THBF_NOBACKGROUND):(thumb_.dwFlags &= ~THBF_NOBACKGROUND);return *this;}\r
+      /** 隠すか・表示するか */\r
+      thumb_button& hidden(bool v){v?(thumb_.dwFlags |= THBF_HIDDEN):(thumb_.dwFlags &= ~ THBF_HIDDEN);return *this;}\r
+      /** ボタンアクションを起こすかどうか。ボタンを通知目的で使用する際に用いる。*/\r
+      thumb_button& no_interacive(bool v){v?(thumb_.dwFlags |= THBF_NONINTERACTIVE):(thumb_.dwFlags &= ~THBF_NONINTERACTIVE);return *this;}\r
+\r
+    private:\r
+      THUMBBUTTON& thumb_;\r
+    };\r
+    \r
+    thumb_button_manager() : is_added(false) {}\r
+\r
+    // Thumb Buttonは7個までに制限されている\r
+    thumb_button&  add_thumb_button(uint32_t id,const icon& i,const std::wstring& str)\r
+    {\r
+      // 事前条件\r
+      BOOST_ASSERT(thumb_buttons_.size() < 7 && is_added == false);\r
+      if(!is_added){\r
+        thumbbuttons_.push_back(THUMBBUTTON());\r
+        thumb_buttons_.push_back(thumb_button(id,i,str, (thumbbuttons_.at(thumbbuttons_.size() - 1))));\r
+      }\r
+      return thumb_buttons_.at(thumb_buttons_.size() - 1);\r
+    }\r
+\r
+    thumb_button& at(uint32_t i){\r
+      BOOST_ASSERT(i < thumb_buttons_.size());\r
+      return thumb_buttons_.at(i);\r
+    }\r
+\r
+    size_t size() const {return thumb_buttons_.size();}\r
+  private:\r
+    mutable bool is_added;\r
+    // メモリ配列を合わせるためにこうした。\r
+    std::vector<THUMBBUTTON> thumbbuttons_;\r
+    std::vector<thumb_button> thumb_buttons_;\r
+    //typedef boost::ptr_vector<thumb_button> thumb_buttons;\r
+  };\r
+\r
+  /** タスクバーAPIのラップクラス。本来であればインターフェースにする方が良いかもしれないけれど */\r
+  struct taskbar : boost::noncopyable\r
+  {\r
+    struct exception\r
+     : public sf::win32_error_exception \r
+    {\r
+      exception(uint32_t hr) : win32_error_exception(hr) {};\r
+      exception() : win32_error_exception() {} ;\r
+    };\r
+\r
+     taskbar();\r
+    ~taskbar();\r
+    void create();\r
+    void discard();\r
+    void overlay_icon(const sf::base_window& w,const icon& ic,const std::wstring& description);\r
+    void progress_state(const sf::base_window& w,int state);\r
+    void progress_value(const sf::base_window& w,boost::uint64_t completed, boost::uint64_t total);\r
+\r
+    void add_thumb_buttons(const sf::base_window& w,const thumb_button_manager& tm);\r
+    void update_thumb_buttons(const sf::base_window& w,const thumb_button_manager& tm);\r
+    bool is_create() const;\r
+\r
+    static long register_message();\r
+\r
+    static const int none;\r
+    static const int indeterminate;\r
+    static const int normal;\r
+    static const int error;\r
+    static const int paused;\r
+\r
+  private:\r
+    struct impl;\r
+    std::shared_ptr<impl> impl_;\r
+    friend struct impl;\r
+  };\r
+\r
+}\r
+\r
diff --git a/winwrapper/test_window.cpp b/winwrapper/test_window.cpp
new file mode 100644 (file)
index 0000000..23ed1f4
--- /dev/null
@@ -0,0 +1,259 @@
+#include "StdAfx.h"\r
+#include "test_window.h"\r
+\r
+#define BOOST_ASSIGN_MAX_PARAMS 7\r
+#include <boost/assign.hpp>\r
+#include <boost/assign/ptr_list_of.hpp>\r
+#include <boost/assign/ptr_list_inserter.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "toplevel_window.h"\r
+#include "CommDlg.h"\r
+#include "icon.h"\r
+#include "timer.h"\r
+#include "exception.h"\r
+#include "application.h"\r
+\r
+#pragma comment( lib, "dxguid.lib" )\r
+#pragma comment( lib, "d3d11.lib" )\r
+#pragma comment( lib, "d3dx11.lib" )\r
+#pragma comment( lib, "dxgi.lib" )\r
+#pragma comment( lib, "d3dx9.lib" )   \r
+#pragma comment( lib, "Shlwapi.lib" ) \r
+\r
+#define THROW_IFERR(hres) \\r
+  if (FAILED(hres)) { throw sf::win32_error_exception(hres); }\r
+\r
+#ifndef HINST_THISCOMPONENT\r
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;\r
+#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)\r
+#endif\r
+\r
+namespace sf \r
+{\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
+    }\r
+    return hr;\r
+  }\r
+\r
+  // \94Ä\97p\8fî\95ñ\8ai\94[\97p\r
+  struct mode_info \r
+  {\r
+    mode_info(const std::wstring& n,const std::wstring& d) : name(n),description(d) {}\r
+    std::wstring name;\r
+    std::wstring description;\r
+  };\r
+\r
+  // \83f\83B\83X\83v\83\8c\83C\83\82\81[\83h\r
+  struct display_mode \r
+  {\r
+    display_mode(const std::wstring& n,const std::wstring& d) : name(n),description(d) {}\r
+    std::wstring name;\r
+    std::wstring description;\r
+  };\r
+\r
+  std::vector<mode_info> display_modes = \r
+    boost::assign::list_of<mode_info>\r
+    (L"DXGI_FORMAT_UNKNOWN",L"\83t\83H\81[\83}\83b\83g\82ª\95s\96¾")\r
+    (L"DXGI_FORMAT_R32G32B32A32_TYPELESS",L"4 \90¬\95ª\81A128 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_FLOAT",L"4 \90¬\95ª\81A128 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_UINT",L"4 \90¬\95ª\81A128 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_SINT",L"4 \90¬\95ª\81A128 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g 1")\r
+    (L"DXGI_FORMAT_R32G32B32_TYPELESS",L"3 \90¬\95ª\81A96 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32B32_FLOAT",L"3 \90¬\95ª\81A96 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32B32_UINT",L"3 \90¬\95ª\81A96 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32B32_SINT",L"3 \90¬\95ª\81A96 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_TYPELESS",L"4 \90¬\95ª\81A64 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_FLOAT",L"4 \90¬\95ª\81A64 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_UNORM",L"4 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_UINT",L"4 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_SNORM",L"4 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16B16A16_SINT",L"4 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32_TYPELESS",L"2 \90¬\95ª\81A64 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32_FLOAT",L"2 \90¬\95ª\81A64 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32_UINT",L"2 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G32_SINT",L"2 \90¬\95ª\81A64 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32G8X24_TYPELESS",L"2 \90¬\95ª\81A64 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_D32_FLOAT_S8X24_UINT",L"32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\90¬\95ª\81A\82¨\82æ\82Ñ 2 \82Â\82Ì\95\84\8d\86\82È\82µ\90®\90\94\90¬\95ª\82Å\82· (\92Ç\89Á\82Ì 32 \83r\83b\83g\82ð\8aÜ\82Þ)\81B")\r
+    (L"DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS",L"32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\90¬\95ª\81A\82¨\82æ\82Ñ 2 \82Â\82Ì\8c^\82È\82µ\90¬\95ª\82Å\82· (\92Ç\89Á\82Ì 32 \83r\83b\83g\82ð\8aÜ\82Þ)\81B")\r
+    (L"DXGI_FORMAT_X32_TYPELESS_G8X24_UINT",L"32 \83r\83b\83g\8c^\82È\82µ\90¬\95ª\81A\82¨\82æ\82Ñ 2 \82Â\82Ì\95\84\8d\86\82È\82µ\90®\90\94\90¬\95ª\82Å\82· (\92Ç\89Á\82Ì 32 \83r\83b\83g\82ð\8aÜ\82Þ)\81B")\r
+    (L"DXGI_FORMAT_R10G10B10A2_TYPELESS",L"4 \90¬\95ª\81A32 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R10G10B10A2_UNORM",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R10G10B10A2_UINT",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R11G11B10_FLOAT",L"3 \90¬\95ª\81A32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_TYPELESS",L"3 \90¬\95ª\81A32 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UNORM",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94 sRGB \83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UINT",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_SNORM",L"3 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8B8A8_SINT",L"3 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_TYPELESS",L"2 \90¬\95ª\81A32 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_FLOAT",L"2 \90¬\95ª\81A32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_UNORM",L"2 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_UINT",L"2 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_SNORM",L"2 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16G16_SINT",L"2 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32_TYPELESS",L"1 \90¬\95ª\81A32 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_D32_FLOAT",L"1 \90¬\95ª\81A32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32_FLOAT",L"1 \90¬\95ª\81A32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32_UINT",L"1 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R32_SINT",L"1 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R24G8_TYPELESS",L"2 \90¬\95ª\81A32 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_D24_UNORM_S8_UINT",L"\90[\93x\83`\83\83\83\93\83l\83\8b\82É 24 \83r\83b\83g\81A\83X\83e\83\93\83V\83\8b \83`\83\83\83\93\83l\83\8b\82É 8 \83r\83b\83g\82ð\8eg\97p\82·\82é 32 \83r\83b\83g Z \83o\83b\83t\83@\81\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R24_UNORM_X8_TYPELESS",L"1 \90¬\95ª\81A24 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\82Æ\92Ç\89Á\82Ì\8c^\82È\82µ 8 \83r\83b\83g\82ð\8aÜ\82Þ\81A32 \83r\83b\83\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_X24_TYPELESS_G8_UINT",L"1 \90¬\95ª\81A24 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g\82Æ\92Ç\89Á\82Ì 8 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\90¬\95ª\82ð\8aÜ\82Þ\81A32 \83r\83b\83\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8_TYPELESS",L"2 \90¬\95ª\81A16 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8_UNORM",L"2 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8_UINT",L"2 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8_SNORM",L"2 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8G8_SINT",L"2 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_TYPELESS",L"1 \90¬\95ª\81A16 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_FLOAT",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_D16_UNORM",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_UNORM",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_UINT",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_SNORM",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R16_SINT",L"1 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8_TYPELESS",L"1 \90¬\95ª\81A8 \83r\83b\83g\8c^\82È\82µ\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8_UNORM",L"1 \90¬\95ª\81A8 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8_UINT",L"1 \90¬\95ª\81A8 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8_SNORM",L"1 \90¬\95ª\81A8 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R8_SINT",L"1 \90¬\95ª\81A8 \83r\83b\83g\95\84\8d\86\95t\82«\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_A8_UNORM",L"1 \90¬\95ª\81A8 \83r\83b\83g\95\84\8d\86\82È\82µ\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_R1_UNORM",L"1 \90¬\95ª\81A1 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g 2.")\r
+    (L"DXGI_FORMAT_R9G9B9E5_SHAREDEXP",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\82\93®\8f¬\90\94\93_\83t\83H\81[\83}\83b\83g 2.")\r
+    (L"DXGI_FORMAT_R8G8_B8G8_UNORM",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g 3")\r
+    (L"DXGI_FORMAT_G8R8_G8B8_UNORM",L"4 \90¬\95ª\81A32 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g 3")\r
+    (L"DXGI_FORMAT_BC1_TYPELESS",L"4 \90¬\95ª\81A\8c^\82È\82µ\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC1_UNORM",L"4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC1_UNORM_SRGB",L"sRGB \83f\81[\83^\97p\82Ì 4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC2_TYPELESS",L"4 \90¬\95ª\81A\8c^\82È\82µ\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC2_UNORM",L"4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC2_UNORM_SRGB",L"sRGB \83f\81[\83^\97p\82Ì 4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC3_TYPELESS",L"4 \90¬\95ª\81A\8c^\82È\82µ\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC3_UNORM",L"4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC3_UNORM_SRGB",L"sRGB \83f\81[\83^\97p\82Ì 4 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC4_TYPELESS",L"1 \90¬\95ª\81A\8c^\82È\82µ\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC4_UNORM",L"1 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC4_SNORM",L"1 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC5_TYPELESS",L"2 \90¬\95ª\81A\8c^\82È\82µ\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC5_UNORM",L"2 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_BC5_SNORM",L"2 \90¬\95ª\81A\83u\83\8d\83b\83N\88³\8fk\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_B5G6R5_UNORM",L"3 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_B5G5R5A1_UNORM",L"1 \83r\83b\83\83A\83\8b\83t\83@\82ð\83T\83|\81[\83g\82·\82é 4 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_B8G8R8A8_UNORM",L"8 \83r\83b\83\83A\83\8b\83t\83@\82ð\83T\83|\81[\83g\82·\82é 4 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_B8G8R8X8_UNORM",L"4 \90¬\95ª\81A16 \83r\83b\83g\95\84\8d\86\82È\82µ\90³\8bK\89»\90®\90\94\83t\83H\81[\83}\83b\83g")\r
+    (L"DXGI_FORMAT_FORCE_UINT",L"\83R\83\93\83p\83C\83\8b\8e\9e\82É\81A\82±\82Ì\97ñ\8b\93\8c^\82Ì\83T\83C\83Y\82ð 32 \83r\83b\83g\82É\82·\82é\82½\82ß\82É\92è\8b`\82³\82ê\82Ä\82¢\82Ü\82·\81B\82±\82Ì\92l\82ð\8ew\92è\82µ\82È\82¢\8fê\8d\87\81A\88ê\95\94\82Ì\83R\83\93\83p\83C\83\89\82Å\82Í\97ñ\8b\93\8c^\82ð 32 \83r\83b\83g\88È\8aO\82Ì\83T\83C\83Y\82Å\83R\83\93\83p\83C\83\8b\89Â\94\\82±\82Ì\92è\90\94\82ª\8eg\97p\82³\82ê\82é\82±\82Æ\82Í\82 \82è\82Ü\82¹\82ñ\81B");\r
+\r
+  // \83X\83L\83\83\83\93\83\89\83C\83\93\8fî\95ñ\r
+\r
+  std::vector<mode_info> scanline_orders = \r
+    boost::assign::list_of<mode_info>\r
+    (L"DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED",L"\91\96\8d¸\90ü\82Ì\8f\87\8f\98\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE",L"\83C\83\81\81[\83W\82Í\90æ\93ª\82Ì\91\96\8d¸\90ü\81`\8dÅ\8cã\82Ì\91\96\8d¸\90ü\82©\82ç\8dì\90¬\82³\82ê\81A\83X\83L\83b\83v\82³\82ê\82é\91\96\8d¸\90ü\82Í\82 \82è\82Ü\82¹\82ñ\81B")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST",L"\83C\83\81\81[\83W\82ª\8fã\95\94\82Ì\83t\83B\81[\83\8b\83h\82©\82ç\8dì\90¬\82³\82ê\82Ü\82·\81B")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST",L"\83C\83\81\81[\83W\82ª\89º\95\94\82Ì\83t\83B\81[\83\8b\83h\82©\82ç\8dì\90¬\82³\82ê\82Ü\82·\81B");\r
+\r
+  // \83X\83P\81[\83\8a\83\93\83O\83p\83\89\83\81\81[\83^\r
+  std::vector<mode_info> scalings = boost::assign::list_of<mode_info>\r
+    (L"DXGI_MODE_SCALING_UNSPECIFIED",L"\83X\83P\81[\83\8a\83\93\83O\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")\r
+    (L"DXGI_MODE_SCALING_CENTERED",L"\83X\83P\81[\83\8a\83\93\83O\82È\82µ\82ð\8ew\92è\82µ\82Ü\82·\81B\83C\83\81\81[\83W\82Í\83f\83B\83X\83v\83\8c\83C\82Ì\92\86\89\9b\82É\94z\92u\82³\82ê\82Ü\82·\81B\92Ê\8fí\81A\82±\82Ì\83t\83\89\83O\82Í\8cÅ\92è\83h\83b\83g\83s\83b\83\83f\83B\83X\83v\83\8c\83C (LED \83f\83B\83X\83v\83\8c\83C\82È\82Ç) \82É\8eg\97p\82µ\82Ü\82·\81B")\r
+    (L"DXGI_MODE_SCALING_STRETCHED",L"\8ag\91å\83X\83P\81[\83\8a\83\93\83O\82ð\8ew\92è\82µ\82Ü\82·\81B");\r
+\r
+  struct simple_vertex\r
+  {\r
+    XMFLOAT3 pos;\r
+    XMFLOAT3 norm;\r
+    XMFLOAT2 tex;\r
+  };\r
+\r
+  struct cb_never_changes\r
+  {\r
+    XMMATRIX mView;\r
+    XMFLOAT4 vLightDir;\r
+  };\r
+\r
+  struct cb_change_on_resize\r
+  {\r
+    XMMATRIX mProjection;\r
+  };\r
+\r
+  struct cb_changes_every_frame\r
+  {\r
+    XMMATRIX mWorld;\r
+    XMFLOAT4 vLightColor;\r
+\r
+    //    XMFLOAT4 vMeshColor;\r
+  };\r
+\r
+  test_window::test_window(\r
+    const std::wstring& title,\r
+    const std::wstring& name,bool fit_to_display,\r
+    float width,float height) : base_win32_window_t(title,name,fit_to_display,width,height)\r
+\r
+  {\r
+    register_class();\r
+    create();\r
+    show();\r
+    update();\r
+  }\r
+\r
+\r
+  test_window::~test_window()\r
+  {\r
+  }\r
+\r
+  void test_window::create()\r
+  {\r
+    create_window();\r
+  }\r
+\r
+  void test_window::create_window()\r
+  {\r
+\r
+    // Window\82ð\8dì\90¬\82·\82é\r
+    CreateWindowEx(\r
+      WS_EX_APPWINDOW,\r
+      name_.c_str(),\r
+      title_.c_str(),\r
+      WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,\r
+      CW_USEDEFAULT,\r
+      CW_USEDEFAULT,\r
+      static_cast<uint32_t>(dpi_.scale_x(width_)),\r
+      static_cast<uint32_t>(dpi_.scale_x(height_)),\r
+      NULL,\r
+      NULL,\r
+      HINST_THISCOMPONENT,\r
+      this\r
+      );\r
+  };\r
+\r
+  base_win32_window_t::result_t test_window::on_create(CREATESTRUCT *p)\r
+  {\r
+    return 0;\r
+  }\r
+\r
+}\r
diff --git a/winwrapper/test_window.h b/winwrapper/test_window.h
new file mode 100644 (file)
index 0000000..494aa98
--- /dev/null
@@ -0,0 +1,35 @@
+#pragma once\r
+\r
+#include "sf_windows.h"\r
+\r
+namespace sf {\r
+  struct test_window : public base_win32_window_t\r
+  {\r
+    test_window(\r
+      const std::wstring& title,\r
+      const std::wstring& name,bool fit_to_display,\r
+      float width,float height);\r
+    virtual ~test_window();\r
+    virtual void create();\r
+    virtual void create_window();\r
+\r
+    result_t on_destroy()\r
+    {\r
+      ::PostQuitMessage(0);\r
+      return FALSE;\r
+    }\r
+\r
+    result_t on_close()\r
+    {\r
+      // Window\82Ì\94j\8aü\r
+      BOOL ret(::DestroyWindow(hwnd_));\r
+      BOOST_ASSERT(ret != 0);\r
+      return TRUE;\r
+    }\r
+\r
+   virtual result_t on_create(CREATESTRUCT *p);\r
+  private:\r
+    test_window();\r
+  };\r
+}\r
+\r
diff --git a/winwrapper/timer.cpp b/winwrapper/timer.cpp
new file mode 100644 (file)
index 0000000..c41afbc
--- /dev/null
@@ -0,0 +1,55 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "StdAfx.h"\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "timer.h"\r
+\r
+namespace sf {\r
+timer::timer(sf::base_window& window,uint32_t timeout) : window_(window),timeout_(timeout),timer_id_(0)\r
+{\r
+\r
+}\r
+void timer::start(){\r
+  if(!::SetTimer(reinterpret_cast<HWND>(window_.raw_handle()),(UINT_PTR)&timer_id_,timeout_,NULL)){\r
+    throw timer::exception();\r
+  };\r
+};\r
+\r
+void timer::reader_stop()\r
+{\r
+  if(timer_id_)\r
+  {\r
+    ::KillTimer(reinterpret_cast<HWND>(window_.raw_handle()),(UINT_PTR)&timer_id_);\r
+    timer_id_ = 0;\r
+  }\r
+};\r
+\r
+}\r
diff --git a/winwrapper/timer.h b/winwrapper/timer.h
new file mode 100644 (file)
index 0000000..b81839e
--- /dev/null
@@ -0,0 +1,65 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the async\r
+   Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+   async can be redistributed and/or modified under the terms of the\r
+   GNU General Public License, as published by the Free Software Foundation;\r
+   either version 2 of the License, or (at your option) any later version.\r
+\r
+   async is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+   GNU General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with async; if not, visit www.gnu.org/licenses or write to the\r
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+   Boston, MA 02111-1307 USA\r
+\r
+  ==============================================================================\r
+*/\r
+#pragma once\r
+#include "exception.h"\r
+#include "base_window.h"\r
+namespace sf{\r
+struct timer\r
+{\r
+  struct exception\r
+    : public sf::win32_error_exception \r
+  {\r
+    exception(uint32_t hr) : win32_error_exception(hr) {};\r
+    exception() : win32_error_exception() {} ;\r
+  };\r
+\r
+  timer(sf::base_window& window,uint32_t timeout);\r
+  void start();\r
+  void reader_stop();\r
+  ~timer(){reader_stop();};\r
+private:\r
+  sf::base_window& window_;\r
+  uint32_t timer_id_;\r
+  uint32_t timeout_;\r
+};\r
+\r
+struct timer_period\r
+{\r
+  timer_period(uint32_t value) : value_(value)\r
+  {\r
+    ::timeBeginPeriod(value);\r
+  }\r
+\r
+  ~timer_period()\r
+  {\r
+    ::timeEndPeriod(value_);\r
+  }\r
+\r
+private:\r
+\r
+  uint32_t value_;\r
+\r
+};\r
+\r
+}\r
+\r
diff --git a/winwrapper/toplevel_window.cpp b/winwrapper/toplevel_window.cpp
new file mode 100644 (file)
index 0000000..622d93c
--- /dev/null
@@ -0,0 +1,1121 @@
+/*\r
+==============================================================================\r
+\r
+Copyright 2005-11 by Satoshi Fujiwara.\r
+\r
+async can be redistributed and/or modified under the terms of the\r
+GNU General Public License, as published by the Free Software Foundation;\r
+either version 2 of the License, or (at your option) any later version.\r
+\r
+async is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with async; if not, visit www.gnu.org/licenses or write to the\r
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
+Boston, MA 02111-1307 USA\r
+\r
+==============================================================================\r
+*/\r
+/* ToDo\r
+\r
+TODO: リサイズに対応する\r
+\r
+*/\r
+\r
+#include "stdafx.h"\r
+#include "resource.h"\r
+#define BOOST_ASSIGN_MAX_PARAMS 7\r
+#include <boost/assign.hpp>\r
+#include <boost/assign/ptr_list_of.hpp>\r
+#include <boost/assign/ptr_list_inserter.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#if _DEBUG\r
+#define _CRTDBG_MAP_ALLOC\r
+#include <crtdbg.h>\r
+#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
+#endif\r
+\r
+#include "sf_windows.h"\r
+#include "toplevel_window.h"\r
+#include "CommDlg.h"\r
+#include "icon.h"\r
+#include "timer.h"\r
+#include "exception.h"\r
+#include "application.h"\r
+#include "config_tab_dialog.h"\r
+#include "info_tab_dialog.h"\r
+#include "seq_tab_dialog.h"\r
+\r
+//#pragma comment( lib, "dxguid.lib" )\r
+//#pragma comment( lib, "d3d11.lib" )\r
+//#pragma comment( lib, "d3dx11.lib" )\r
+//#pragma comment( lib, "dxgi.lib" )\r
+//#pragma comment( lib, "d3dx9.lib" )   \r
+#pragma comment( lib, "Shlwapi.lib" ) \r
+\r
+#define THROW_IFERR(hres) \\r
+  if (FAILED(hres)) { throw sf::win32_error_exception(hres); }\r
+\r
+#ifndef HINST_THISCOMPONENT\r
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;\r
+#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)\r
+#endif\r
+\r
+namespace sf \r
+{\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
+    }\r
+    return hr;\r
+  }\r
+\r
+  // 汎用情報格納用\r
+  struct mode_info \r
+  {\r
+    mode_info(const std::wstring& n,const std::wstring& d) : name(n),description(d) {}\r
+    std::wstring name;\r
+    std::wstring description;\r
+  };\r
+\r
+  // ディスプレイモード\r
+  struct display_mode \r
+  {\r
+    display_mode(const std::wstring& n,const std::wstring& d) : name(n),description(d) {}\r
+    std::wstring name;\r
+    std::wstring description;\r
+  };\r
+\r
+  std::vector<mode_info> display_modes = \r
+    boost::assign::list_of<mode_info>\r
+    (L"DXGI_FORMAT_UNKNOWN",L"フォーマットが不明")\r
+    (L"DXGI_FORMAT_R32G32B32A32_TYPELESS",L"4 成分、128 ビット型なしフォーマット 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_FLOAT",L"4 成分、128 ビット浮動小数点フォーマット 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_UINT",L"4 成分、128 ビット符号なし整数フォーマット 1")\r
+    (L"DXGI_FORMAT_R32G32B32A32_SINT",L"4 成分、128 ビット符号付き整数フォーマット 1")\r
+    (L"DXGI_FORMAT_R32G32B32_TYPELESS",L"3 成分、96 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R32G32B32_FLOAT",L"3 成分、96 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R32G32B32_UINT",L"3 成分、96 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R32G32B32_SINT",L"3 成分、96 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_TYPELESS",L"4 成分、64 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_FLOAT",L"4 成分、64 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_UNORM",L"4 成分、64 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_UINT",L"4 成分、64 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_SNORM",L"4 成分、64 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16B16A16_SINT",L"4 成分、64 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R32G32_TYPELESS",L"2 成分、64 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R32G32_FLOAT",L"2 成分、64 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R32G32_UINT",L"2 成分、64 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R32G32_SINT",L"2 成分、64 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R32G8X24_TYPELESS",L"2 成分、64 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_D32_FLOAT_S8X24_UINT",L"32 ビット浮動小数点成分、および 2 つの符号なし整数成分です (追加の 32 ビットを含む)。")\r
+    (L"DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS",L"32 ビット浮動小数点成分、および 2 つの型なし成分です (追加の 32 ビットを含む)。")\r
+    (L"DXGI_FORMAT_X32_TYPELESS_G8X24_UINT",L"32 ビット型なし成分、および 2 つの符号なし整数成分です (追加の 32 ビットを含む)。")\r
+    (L"DXGI_FORMAT_R10G10B10A2_TYPELESS",L"4 成分、32 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R10G10B10A2_UNORM",L"4 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R10G10B10A2_UINT",L"4 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R11G11B10_FLOAT",L"3 成分、32 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_TYPELESS",L"3 成分、32 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UNORM",L"4 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",L"4 成分、32 ビット符号なし正規化整数 sRGB フォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_UINT",L"4 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_SNORM",L"3 成分、32 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8B8A8_SINT",L"3 成分、32 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16_TYPELESS",L"2 成分、32 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R16G16_FLOAT",L"2 成分、32 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R16G16_UNORM",L"2 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16_UINT",L"2 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16_SNORM",L"2 成分、32 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16G16_SINT",L"2 成分、32 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R32_TYPELESS",L"1 成分、32 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_D32_FLOAT",L"1 成分、32 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R32_FLOAT",L"1 成分、32 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_R32_UINT",L"1 成分、32 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R32_SINT",L"1 成分、32 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R24G8_TYPELESS",L"2 成分、32 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_D24_UNORM_S8_UINT",L"深度チャンネルに 24 ビット、ステンシル チャンネルに 8 ビットを使用する 32 ビット Z バッファー フォーマット")\r
+    (L"DXGI_FORMAT_R24_UNORM_X8_TYPELESS",L"1 成分、24 ビット符号なし正規化整数と追加の型なし 8 ビットを含む、32 ビット フォーマット")\r
+    (L"DXGI_FORMAT_X24_TYPELESS_G8_UINT",L"1 成分、24 ビット型なしフォーマットと追加の 8 ビット符号なし整数成分を含む、32 ビット フォーマット")\r
+    (L"DXGI_FORMAT_R8G8_TYPELESS",L"2 成分、16 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R8G8_UNORM",L"2 成分、16 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8_UINT",L"2 成分、16 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8_SNORM",L"2 成分、16 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R8G8_SINT",L"2 成分、16 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16_TYPELESS",L"1 成分、16 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R16_FLOAT",L"1 成分、16 ビット浮動小数点フォーマット")\r
+    (L"DXGI_FORMAT_D16_UNORM",L"1 成分、16 ビット符号なし正規化整数フォーマット")\r
+    (L"DXGI_FORMAT_R16_UNORM",L"1 成分、16 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16_UINT",L"1 成分、16 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R16_SNORM",L"1 成分、16 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R16_SINT",L"1 成分、16 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R8_TYPELESS",L"1 成分、8 ビット型なしフォーマット")\r
+    (L"DXGI_FORMAT_R8_UNORM",L"1 成分、8 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8_UINT",L"1 成分、8 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R8_SNORM",L"1 成分、8 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_R8_SINT",L"1 成分、8 ビット符号付き整数フォーマット")\r
+    (L"DXGI_FORMAT_A8_UNORM",L"1 成分、8 ビット符号なし整数フォーマット")\r
+    (L"DXGI_FORMAT_R1_UNORM",L"1 成分、1 ビット符号なし正規化整数フォーマット 2.")\r
+    (L"DXGI_FORMAT_R9G9B9E5_SHAREDEXP",L"4 成分、32 ビット浮動小数点フォーマット 2.")\r
+    (L"DXGI_FORMAT_R8G8_B8G8_UNORM",L"4 成分、32 ビット符号なし正規化整数フォーマット 3")\r
+    (L"DXGI_FORMAT_G8R8_G8B8_UNORM",L"4 成分、32 ビット符号なし正規化整数フォーマット 3")\r
+    (L"DXGI_FORMAT_BC1_TYPELESS",L"4 成分、型なしブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC1_UNORM",L"4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC1_UNORM_SRGB",L"sRGB データ用の 4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC2_TYPELESS",L"4 成分、型なしブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC2_UNORM",L"4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC2_UNORM_SRGB",L"sRGB データ用の 4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC3_TYPELESS",L"4 成分、型なしブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC3_UNORM",L"4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC3_UNORM_SRGB",L"sRGB データ用の 4 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC4_TYPELESS",L"1 成分、型なしブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC4_UNORM",L"1 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC4_SNORM",L"1 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC5_TYPELESS",L"2 成分、型なしブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC5_UNORM",L"2 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_BC5_SNORM",L"2 成分、ブロック圧縮フォーマット")\r
+    (L"DXGI_FORMAT_B5G6R5_UNORM",L"3 成分、16 ビット符号なし正規化整数フォーマット")\r
+    (L"DXGI_FORMAT_B5G5R5A1_UNORM",L"1 ビット アルファをサポートする 4 成分、16 ビット符号なし正規化整数フォーマット")\r
+    (L"DXGI_FORMAT_B8G8R8A8_UNORM",L"8 ビット アルファをサポートする 4 成分、16 ビット符号なし正規化整数フォーマット")\r
+    (L"DXGI_FORMAT_B8G8R8X8_UNORM",L"4 成分、16 ビット符号なし正規化整数フォーマット")\r
+    (L"DXGI_FORMAT_FORCE_UINT",L"コンパイル時に、この列挙型のサイズを 32 ビットにするために定義されています。この値を指定しない場合、一部のコンパイラでは列挙型を 32 ビット以外のサイズでコンパイル可能この定数が使用されることはありません。");\r
+\r
+  // スキャンライン情報\r
+\r
+  std::vector<mode_info> scanline_orders = \r
+    boost::assign::list_of<mode_info>\r
+    (L"DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED",L"走査線の順序が指定されていません。")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE",L"イメージは先頭の走査線~最後の走査線から作成され、スキップされる走査線はありません。")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST",L"イメージが上部のフィールドから作成されます。")\r
+    (L"DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST",L"イメージが下部のフィールドから作成されます。");\r
+\r
+  // スケーリングパラメータ\r
+  std::vector<mode_info> scalings = boost::assign::list_of<mode_info>\r
+    (L"DXGI_MODE_SCALING_UNSPECIFIED",L"スケーリングが指定されていません。")\r
+    (L"DXGI_MODE_SCALING_CENTERED",L"スケーリングなしを指定します。イメージはディスプレイの中央に配置されます。通常、このフラグは固定ドットピッチ ディスプレイ (LED ディスプレイなど) に使用します。")\r
+    (L"DXGI_MODE_SCALING_STRETCHED",L"拡大スケーリングを指定します。");\r
+\r
+  struct simple_vertex\r
+  {\r
+    XMFLOAT3 pos;\r
+    XMFLOAT3 norm;\r
+    XMFLOAT2 tex;\r
+  };\r
+\r
+  struct cb_never_changes\r
+  {\r
+    XMMATRIX mView;\r
+    XMFLOAT4 vLightDir;\r
+  };\r
+\r
+  struct cb_change_on_resize\r
+  {\r
+    XMMATRIX mProjection;\r
+  };\r
+\r
+  struct cb_changes_every_frame\r
+  {\r
+    XMMATRIX mWorld;\r
+    XMFLOAT4 vLightColor;\r
+\r
+    //    XMFLOAT4 vMeshColor;\r
+  };\r
+\r
+  struct slider : public subclass_window\r
+  {\r
+    slider() : subclass_window() {};\r
+    void create() {};\r
+    virtual LRESULT window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam) \r
+    {\r
+      //switch(message){\r
+      //case WM_HSCROLL :\r
+      //  {\r
+      //    switch(wParam)\r
+      //    {\r
+      //    case TB_THUMBTRACK : \r
+      //       DWORD dwPos = SendMessage(GetDlgItem(hwnd_,IDC_SLIDER), TBM_GETPOS, 0, 0); \r
+      //       break; \r
+      //    }\r
+      //  }\r
+      /*   }*/\r
+      return CallWindowProc(proc_backup_,hwnd,message,wParam,lParam);\r
+    };\r
+  };\r
+\r
+  struct toplevel_window::impl : public base_win32_dialog_t\r
+  {\r
+\r
+    static const uint32_t SLIDER_MAX = 30000;\r
+    static const int TAB_INFO = 0;\r
+    static const int TAB_CONFIG = 1;\r
+    static const int TAB_SEQ = 2;\r
+\r
+    impl(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width = 160,float height = 100) \r
+      : base_win32_dialog_t(menu_name,name,fit_to_display,width,height) \r
+      , timer_(*this,100)\r
+      , icon_(IDI_ICON1)\r
+      /*,mesh_color_(0.7f, 0.7f, 0.7f, 1.0f)*/\r
+      ,init_(false)\r
+      ,thumb_start_(false)\r
+    {\r
+\r
+      file_name_.reserve(MAX_PATH + 1);\r
+      dir_name_.reserve(MAX_PATH + 1);\r
+      on_render.connect(boost::bind(&impl::render,this));\r
+    };\r
+\r
+    ~impl(){\r
+      //safe_release(dxgi_factory_);\r
+    };\r
+\r
+\r
+    // -------------------------------------------------------------------\r
+    // ウィンドウプロシージャ\r
+    // -------------------------------------------------------------------\r
+\r
+    void init_control()\r
+    {\r
+      SendMessage(GetDlgItem(hwnd_,IDC_SLIDER), TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, SLIDER_MAX));\r
+\r
+      DWORD dwDlgBase = GetDialogBaseUnits();\r
+      int cxMargin = LOWORD(dwDlgBase) / 4; \r
+      int cyMargin = HIWORD(dwDlgBase) / 8;\r
+\r
+      //タブの初期設定\r
+      TCITEM tie; \r
+      tie.mask = TCIF_TEXT | TCIF_IMAGE; \r
+      tie.iImage = -1; \r
+      HWND tab = GetDlgItem(hwnd_,IDC_TAB);\r
+      // 情報タブの挿入\r
+      tie.pszText = L"情報";\r
+      TabCtrl_InsertItem(tab,TAB_INFO,&tie);\r
+      tab_dialogs_.push_back(\r
+        new info_tab_dialog(*this,tab,TAB_INFO,L"info",L"info",HINST_THISCOMPONENT,MAKEINTRESOURCEW(IDD_INFO))\r
+        );\r
+      tab_dialogs_[TAB_INFO].show();\r
+\r
+      // 設定タブの挿入\r
+      tie.pszText = L"設定";\r
+      TabCtrl_InsertItem(tab,TAB_CONFIG,&tie);\r
+      tab_dialogs_.push_back(\r
+        new config_tab_dialog(*this,tab,TAB_CONFIG,L"config",L"config",HINST_THISCOMPONENT,MAKEINTRESOURCEW(IDD_CONFIG)) \r
+        );\r
+      //TabCtrl_SetCurSel(tab,0);\r
+      //RECT rci;\r
+      //TabCtrl_GetItemRect(tab,0,&rci);\r
+      //RECT r;\r
+      ////TabCtrl_GetItemRect(tab,0,&r);\r
+      //GetClientRect(tab,&r);\r
+      //RECT rw;\r
+      //GetWindowRect(tab,&rw);\r
+      //POINT pt = {rw.left,rw.top + rci.bottom};\r
+      //ScreenToClient(hwnd_,&pt);\r
+\r
+      // シーケンサタブの挿入\r
+      tie.pszText = L"シーケンサ";\r
+      TabCtrl_InsertItem(tab,TAB_SEQ,&tie);\r
+      tab_dialogs_.push_back(\r
+        new seq_tab_dialog(application::instance()->sequencer(),*this,tab,TAB_SEQ,L"sequencer",L"sequencer",HINST_THISCOMPONENT,MAKEINTRESOURCEW(IDD_SEQ))\r
+        );\r
+\r
+      //GetRect(\r
+\r
+      //情報表示ダイアログの作成・表示\r
+      //hwnd_info_ = CreateDialogW(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDD_INFO),hwnd_,proc_info_);\r
+      //SetWindowPos(hwnd_info_,HWND_TOP,pt.x + cxMargin,pt.y + cyMargin,r.right - cxMargin * 2 - 1,r.bottom - rci.bottom - cyMargin * 2 - 1,SWP_NOZORDER | SWP_SHOWWINDOW);\r
+\r
+      //TODO: 設定ダイアログの作成・表示\r
+      //hwnd_config_ = CreateDialogW(HINST_THISCOMPONENT,MAKEINTRESOURCEW(IDD_CONFIG),hwnd_,proc_config_);\r
+      //SetWindowPos(hwnd_config_,HWND_TOP,pt.x + cxMargin,pt.y + cyMargin,r.right - cxMargin * 2 - 1,r.bottom - rci.bottom - cyMargin * 2 - 1,SWP_NOZORDER | SWP_SHOWWINDOW);\r
+      ////MapDialogRect(hwnd_config_,&r);\r
+      //ShowWindow(hwnd_config_,FALSE);\r
+      //config_dialog_.reset();\r
+\r
+      // 背景色の設定\r
+      //get_dc tab_dc(tab);\r
+      //get_dc info_dc(hwnd_info_);\r
+      //get_dc config_dc(hwnd_config_);\r
+      //SetBkMode(info_dc.get(),GetBkMode(tab_dc.get()));\r
+      //SetBkMode(config_dc.get(),GetBkMode(tab_dc.get()));\r
+      //SetBkColor(info_dc.get(),GetBkColor(tab_dc.get()));\r
+      //SetBkColor(config_dc.get(),GetBkColor(tab_dc.get()));\r
+\r
+      tab_page_ = 0;\r
+      //slider_.attach(GetDlgItem(hwnd_,IDC_SLIDER));\r
+    }\r
+\r
+    void reader_ready()\r
+    {\r
+      // プレイボタンは有効化\r
+      enable_control(IDC_PLAY,true);\r
+      focus(IDC_PLAY);\r
+      // highlight(IDC_PLAY);\r
+      // その他のボタンは無効化\r
+      enable_control(IDC_REPEAT_CHECK,true);\r
+      enable_control(IDC_PAUSE,false);\r
+      enable_control(IDC_SLIDER,true);\r
+      enable_control(IDC_STOP,false);\r
+      //    enable_control(hwnd_config_,IDC_EXC_MODE,true);\r
+    }\r
+\r
+    void reader_read_file()\r
+    {\r
+      post_message(WM_PLAY_PLAY,0,0);\r
+    }\r
+\r
+    void play_()\r
+    {\r
+      enable_control(IDC_PLAY,false);\r
+      enable_control(IDC_STOP,true);\r
+      focus(IDC_STOP);\r
+      //highlight(IDC_STOP);\r
+      enable_control(IDC_REPEAT_CHECK,true);\r
+      enable_control(IDC_PAUSE,true);\r
+      ::SetWindowText(GetDlgItem(hwnd_,IDC_PAUSE),L"一時停止");\r
+      enable_control(IDC_SLIDER,true);\r
+      enable_control(IDC_FILE,false);\r
+\r
+      // 設定ダイアログ\r
+      // EnableWindow(hwnd_config_,FALSE);\r
+      tab_dialogs_[TAB_CONFIG].disable();\r
+      //    enable_config_dialog(false);\r
+\r
+    }\r
+\r
+    void reader_stop()\r
+    {\r
+      post_message(WM_PLAY_STOP,0,0);\r
+    }\r
+\r
+    void stop_()\r
+    {\r
+      enable_control(IDC_PLAY,true);\r
+      focus(IDC_PLAY);\r
+      //highlight(IDC_PLAY);\r
+      enable_control(IDC_REPEAT_CHECK,true);\r
+      enable_control(IDC_STOP,false);\r
+      enable_control(IDC_PAUSE,false);\r
+      enable_control(IDC_SLIDER,true);\r
+      ::SendMessage(GetDlgItem(hwnd_,IDC_SLIDER), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)0);\r
+      enable_control(IDC_FILE,true);\r
+\r
+      // 設定ダイアログ\r
+      // EnableWindow(hwnd_config_,TRUE);\r
+      tab_dialogs_[TAB_CONFIG].enable();\r
+      //    enable_config_dialog(true);\r
+\r
+    }\r
+\r
+\r
+    void reader_pause()\r
+    {\r
+      send_message(WM_PLAY_PAUSE,0,0);\r
+    }\r
+\r
+    void pause_()\r
+    {\r
+      enable_control(IDC_PLAY,false);\r
+      enable_control(IDC_STOP,false);\r
+      enable_control(IDC_PAUSE,true);\r
+      enable_control(IDC_REPEAT_CHECK,true);\r
+      focus(IDC_PAUSE);\r
+      //highlight(IDC_PAUSE);\r
+      ::SetWindowText(GetDlgItem(hwnd_,IDC_PAUSE),L"再開");\r
+      enable_control(IDC_SLIDER,true);\r
+      enable_control(IDC_FILE,false);\r
+\r
+      // 設定ダイアログ\r
+      tab_dialogs_[TAB_CONFIG].disable();\r
+      //    enable_config_dialog(false);\r
+    }\r
+\r
+    virtual void create(){\r
+      create_device_independent_resources();\r
+      //    icon_ = ::LoadIconW(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDI_ICON1));\r
+      register_class(this->name_.c_str(),CS_HREDRAW | CS_VREDRAW ,0,DLGWINDOWEXTRA,icon_.get());\r
+      create_dialog();\r
+\r
+      // 半透明ウィンドウを有効にする。\r
+      //BOOL dwmEnable;\r
+      //DwmIsCompositionEnabled (&dwmEnable); \r
+      //if (dwmEnable) EnableBlurBehind(*this);\r
+\r
+    }\r
+\r
+    void create_dialog()\r
+    {\r
+      hwnd_ = ::CreateDialog(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDD_MAINDIALOG),::GetDesktopWindow(),thunk_proc_);\r
+      // ::DialogBox(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDD_MAINDIALOG),0,thunk_proc_);\r
+    }\r
+\r
+    virtual void discard_device()\r
+    {}\r
+\r
+    void calc_client_size()\r
+    {\r
+      //クライアント領域の現在の幅、高さを求める\r
+      RECT rc;\r
+      GetClientRect( hwnd_, &rc );\r
+      client_width_ = rc.right - rc.left;\r
+      client_height_ = rc.bottom - rc.top;\r
+    }\r
+\r
+    virtual void create_device()\r
+    {\r
+      calc_client_size();\r
+      //HRESULT hr = S_OK;\r
+      init_ = false;\r
+      init_ = true;// 初期化完了\r
+    }\r
+\r
+\r
+    virtual void create_device_independent_resources()\r
+    {\r
+\r
+    }\r
+\r
+    void render(){\r
+\r
+    }\r
+\r
+\r
+    void create_window()\r
+    {\r
+\r
+      // Windowを作成する\r
+      CreateWindowEx(\r
+        WS_EX_APPWINDOW | WS_EX_TOPMOST,\r
+        name_.c_str(),\r
+        title_.c_str(),\r
+        WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,\r
+        CW_USEDEFAULT,\r
+        CW_USEDEFAULT,\r
+        static_cast<uint32_t>(dpi_.scale_x(width_)),\r
+        static_cast<uint32_t>(dpi_.scale_x(height_)),\r
+        NULL,\r
+        NULL,\r
+        HINST_THISCOMPONENT,\r
+        this\r
+        );\r
+    };\r
+\r
+    void get_dxgi_information()\r
+    {\r
+      //    int i = 0;\r
+      //\r
+      //    while(1){\r
+      //      IDXGIAdapter1Ptr adapter;\r
+      //      HRESULT hr = dxgi_factory_->EnumAdapters1(i,&adapter);\r
+      //      if(hr == DXGI_ERROR_NOT_FOUND)\r
+      //      {\r
+      //        break;\r
+      //      }\r
+      //      DXGI_ADAPTER_DESC1 desc;\r
+      //      adapter->GetDesc1(&desc);\r
+      //      //adapter->CheckInterfaceSupport();\r
+      //      \r
+      //      wdout << desc.Description << std::endl;\r
+      //      wdout << desc.DedicatedVideoMemory << std::endl;\r
+      //      IDXGIDevice1Ptr device;\r
+      //\r
+      //      uint32_t oi = 0;\r
+      //\r
+      //\r
+      //      while(1)\r
+      //      {\r
+      //        IDXGIOutputPtr output;        \r
+      //        if(adapter->EnumOutputs(oi,&output) == DXGI_ERROR_NOT_FOUND){\r
+      //          break;\r
+      //        }\r
+      //        DXGI_OUTPUT_DESC output_desc;\r
+      //        output->GetDesc(&output_desc); \r
+      //        UINT num = 0;\r
+      //        DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;\r
+      //        UINT flags         = DXGI_ENUM_MODES_INTERLACED | DXGI_ENUM_MODES_SCALING;\r
+      //\r
+      //        output->GetDisplayModeList(format,flags,&num,0);\r
+      //        boost::shared_array<DXGI_MODE_DESC> disp_modes(new DXGI_MODE_DESC[num]);\r
+      //        output->GetDisplayModeList(format,flags,&num,&disp_modes[0]);\r
+      //        //output->GetFrameStatistics\r
+      //        for(uint32_t mode_index = 0;mode_index < num;++mode_index)\r
+      //        {\r
+      //          DXGI_MODE_DESC& mode(disp_modes[mode_index]);\r
+      //          wdout << boost::wformat(L"Format: %s %s \n Width: %d Height: %d RefleshRate: %d/%d Scaling:%s %s \n Scanline: %s %s ")\r
+      //            %  display_modes[mode.Format].name % display_modes[mode.Format].description\r
+      //            %  mode.Width % mode.Height \r
+      //            %  mode.RefreshRate.Numerator % mode.RefreshRate.Denominator\r
+      //            %  scalings[mode.Scaling].name %  scalings[mode.Scaling].description\r
+      //            %  scanline_orders[mode.ScanlineOrdering].name\r
+      //            %  scanline_orders[mode.ScanlineOrdering].description\r
+      //            << std::endl;\r
+      //        }\r
+      ////        output->\r
+      //        wdout << output_desc.DeviceName << std::endl; \r
+      //        oi++;\r
+      //      }\r
+      //\r
+      //      adapter.Release();\r
+      //      ++i;\r
+      //    }\r
+    }\r
+\r
+    // コントロールにフォーカスを移動する\r
+    // id ... コントロールID\r
+    void focus(uint32_t id)\r
+    {\r
+      // 間違い\r
+      // ::SetFocus(GetDlgItem(hwnd_,id));\r
+\r
+      // 正解\r
+      post_message(WM_NEXTDLGCTL,(WPARAM)GetDlgItem(hwnd_,id),TRUE);\r
+    }\r
+\r
+    void highlight(uint32_t id)\r
+    {\r
+      Button_SetState(GetDlgItem(hwnd_,id),TRUE);\r
+    }\r
+\r
+  LRESULT other_window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)\r
+\r
+  {\r
+    switch (message)\r
+    {\r
+    case WM_PLAY_PLAY:\r
+      play_();\r
+      return TRUE;\r
+    case WM_PLAY_STOP:\r
+      stop_();\r
+      return TRUE;\r
+    case WM_PLAY_PAUSE:\r
+      pause_();\r
+      return TRUE;\r
+      //::SetTimer(hwnd_,(UINT_PTR)&timer_id_,1000,NULL);\r
+    }\r
+\r
+    return FALSE;\r
+  };\r
+\r
+  LRESULT on_init_dialog(HWND default_focus_ctrl,LPARAM data)\r
+  {\r
+    init_control();\r
+    create_device();\r
+    timer_.start();\r
+    //MARGINS mgn = {-1};//left,right,top,bottom\r
+    //HRESULT hr = DwmExtendFrameIntoClientArea(hwnd_, &mgn);\r
+    return TRUE;\r
+  }\r
+\r
+  LRESULT on_size(uint32_t flag,uint32_t width,uint32_t height)\r
+  {\r
+    // バックバッファなどに関係するインターフェースを解放する\r
+    // バックバッファを解放する\r
+    if(init_)\r
+    {\r
+      int height = client_height_;\r
+      int width = client_width_;\r
+\r
+      calc_client_size();\r
+\r
+      int delta_height = client_height_ - height; \r
+\r
+      HWND hwnd_tab = GetDlgItem(hwnd_,IDC_TAB);\r
+      RECT rect_tab;\r
+      GetWindowRect(hwnd_tab,&rect_tab);\r
+\r
+\r
+      int tab_width(rect_tab.right - rect_tab.left),\r
+        tab_height(rect_tab.bottom - rect_tab.top);\r
+      int delta_width = width - tab_width; \r
+\r
+      SetWindowPos(hwnd_tab,0,0,0,client_width_ - delta_width,tab_height + delta_height,SWP_NOZORDER | SWP_NOMOVE);\r
+\r
+      for(int i = 0;i < tab_dialogs_.size();++i)\r
+      {\r
+        tab_dialogs_[i].resize();\r
+      }\r
+\r
+      //client_width_\r
+    }\r
+    // バックバッファなどに関係するインターフェースを再作成する\r
+\r
+    //if (render_target_)\r
+    //{\r
+    // D2D1_SIZE_U size;\r
+    // size.width = lParam & 0xFFFF;\r
+    // size.height = (lParam >> 16) & 0xFFFF; ;\r
+\r
+    // // Note: This method can fail, but it's okay to ignore the\r
+    // // error here -- it will be repeated on the next call to\r
+    // // EndDraw.\r
+    // render_target_->Resize(size);\r
+    //}\r
+    return TRUE;\r
+  }\r
+\r
+  LRESULT on_paint()\r
+  {\r
+    //create_device();\r
+\r
+    { \r
+      paint_struct begin_paint(hwnd_);\r
+      //CloseHandle(cb);\r
+      // 描画コードの呼び出し\r
+      /*render();*/\r
+\r
+    }\r
+    return FALSE;\r
+    //        ::ShowWindow(hwnd_,SW_MINIMIZE);\r
+\r
+  }\r
+\r
+  LRESULT on_display_change(uint32_t bpp,uint32_t h_resolution,uint32_t v_resolution)\r
+  {\r
+    invalidate_rect();\r
+    return TRUE;\r
+  }\r
+\r
+  LRESULT on_erase_backgroud(HDC dc)\r
+  {\r
+    return FALSE;\r
+  }\r
+\r
+  LRESULT on_hscroll(uint32_t state,uint32_t position,HWND ctrl_hwnd)\r
+  {\r
+    switch(state)\r
+    {\r
+    case TB_THUMBTRACK :\r
+\r
+#ifdef _DEBUG\r
+      wdout << L"TB_THUMBTRACK" << std::endl;\r
+#endif\r
+      thumb_start_ = true;\r
+      break;\r
+    case TB_ENDTRACK :\r
+#ifdef _DEBUG\r
+      wdout << L"TB_ENDTRACK" << std::endl;\r
+#endif\r
+      application::instance()->reader_position(SendMessage(GetDlgItem(hwnd_,IDC_SLIDER), TBM_GETPOS, 0, 0) * application::instance()->reader_data_size() / SLIDER_MAX); \r
+\r
+      thumb_start_ = false;\r
+      break;\r
+    case TB_PAGEUP:\r
+      thumb_start_ = true;\r
+      break;\r
+    case TB_PAGEDOWN:\r
+      thumb_start_ = true;\r
+      break;\r
+    default:\r
+#ifdef _DEBUG\r
+      wdout << boost::wformat(L"LOWORD(wParam):%d") % state << std::endl;\r
+#endif\r
+      break;\r
+    }\r
+    return FALSE;\r
+  }\r
+\r
+  LRESULT on_destroy()\r
+  {\r
+    ::PostQuitMessage(0);\r
+    return FALSE;\r
+  }\r
+\r
+  LRESULT on_close()\r
+  {\r
+    //slider_.detatch();\r
+    timer_.reader_stop();\r
+    // 後始末\r
+    discard_device();\r
+    // レンダーターゲットのリリース\r
+    //safe_release(dcr_);\r
+    //      safe_release(render_target_);\r
+    // Windowの破棄\r
+    BOOL ret(::DestroyWindow(hwnd_));\r
+    BOOST_ASSERT(ret != 0);\r
+    return TRUE;\r
+  }\r
+\r
+  LRESULT on_command(uint32_t wparam, uint32_t lparam)\r
+  {\r
+    switch(LOWORD(wparam)){\r
+    case IDC_FILE:\r
+      {\r
+        return get_file_path();\r
+      }\r
+    case IDC_SLIDER:\r
+      //::MessageBox( hwnd_,L"SLIDERが動作しました。",L"IDC_SLIDER",MB_OK);\r
+      return TRUE;\r
+    case IDC_PLAY:\r
+      //         ::MessageBox( hwnd_,L"reader_read_fileボタンが押されました。",L"IDC_PLAY",MB_OK);\r
+      application::instance()->reader_read_file();\r
+      return TRUE;\r
+    case IDC_STOP:\r
+      //::MessageBox( hwnd_,L"reader_stopボタンが押されました。",L"IDC_STOP",MB_OK);\r
+      application::instance()->reader_stop();\r
+      return TRUE;\r
+    case IDC_PAUSE:\r
+      //::MessageBox( hwnd_,L"reader_pauseボタンが押されました。",L"IDC_PAUSE",MB_OK);\r
+      application::instance()->reader_pause();\r
+      return TRUE;\r
+    case IDC_REPEAT_CHECK:\r
+      application::instance()->reader_repeat_mode(::SendMessage(GetDlgItem(hwnd_,IDC_REPEAT_CHECK),BM_GETCHECK,0,0) == BST_CHECKED);\r
+      return TRUE;\r
+    }\r
+\r
+    //if(HIWORD(wParam) == THBN_CLICKED ){\r
+    //  switch(LOWORD(wParam)){\r
+    //  case THUMB_START:\r
+    //    {\r
+    //      if(status_ != reader_stop)\r
+    //      {\r
+    //        update_status(reader_stop);\r
+    //      } else {\r
+    //        update_status(active);\r
+    //      }\r
+    //    }\r
+    //    break;\r
+    //  }\r
+    //}\r
+    return FALSE;\r
+  }\r
+\r
+  LRESULT on_timer(uint32_t timer_id)\r
+  {\r
+    // TODO:スレッドのエラーチェックも入れておく\r
+    if(!thumb_start_){\r
+      int status = application::instance()->reader_status(boost::memory_order_relaxed);\r
+      if( status == reader_thread_t::status_play_ok || status == reader_thread_t::status_end_ok)\r
+      {\r
+        uint64_t pos = application::instance()->reader_position() * SLIDER_MAX / application::instance()->reader_data_size(); \r
+        SendMessage(GetDlgItem(hwnd_,IDC_SLIDER), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos);\r
+      }\r
+    }\r
+    return TRUE;\r
+\r
+  }\r
+\r
+  LRESULT on_notify(NMHDR* nmhdr)\r
+  {\r
+    switch (nmhdr->code)\r
+    {\r
+    case TCN_SELCHANGE:\r
+      {\r
+        tab_page_ = TabCtrl_GetCurSel(nmhdr->hwndFrom);\r
+        for(int i = 0;i < tab_dialogs_.size();++ i)\r
+        {\r
+          if( i == tab_page_)\r
+          {\r
+            tab_dialogs_[i].show();\r
+          } else {\r
+            tab_dialogs_[i].hide();\r
+          }\r
+        }\r
+        return TRUE;\r
+        break;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+\r
+  private:\r
+\r
+    void read_start() {};\r
+    BOOL get_file_path ()\r
+    {\r
+      WCHAR file_name[MAX_PATH]  = L"";  // ファイル名\r
+      WCHAR dir_name[MAX_PATH]   = L"";  // ディレクトリ\r
+\r
+      WCHAR file_title[MAX_PATH] = L"";  // ダイアログのタイトル\r
+      OPENFILENAME ofn;              \r
+\r
+      if (dir_name_.empty())\r
+      {\r
+        GetWindowsDirectory(dir_name, MAX_PATH);\r
+        dir_name_.assign(dir_name);\r
+      }\r
+\r
+      if(!file_name_.empty())\r
+      {\r
+        wcscpy_s(file_name,MAX_PATH,dir_name_.c_str());\r
+      }\r
+\r
+      // Set up structure for file dialog\r
+      ZeroMemory(&ofn, sizeof(ofn));\r
+      ofn.lStructSize = sizeof(OPENFILENAME);\r
+      ofn.hwndOwner = ::GetDesktopWindow();\r
+      ofn.lpstrFilter = L"Wave File (*.wav)\0*.WAV\0";\r
+      ofn.lpstrCustomFilter = NULL;\r
+      ofn.nFilterIndex = 1;\r
+      ofn.lpstrFile = file_name;\r
+      ofn.nMaxFile = MAX_PATH;\r
+      ofn.lpstrFileTitle = file_title;\r
+      ofn.nMaxFileTitle = MAX_PATH;\r
+      ofn.lpstrInitialDir = dir_name;\r
+      ofn.lpstrTitle = L".WAVファイルを指定してください。";\r
+      ofn.lpstrDefExt = L"wav";\r
+      ofn.Flags = OFN_SHAREAWARE | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\r
+\r
+      // Put up Open File dialog to get file name.\r
+      if (GetOpenFileName(&ofn))\r
+      {\r
+        file_name_.assign(file_name);\r
+        sf::application::instance()->reader_setup(file_name);\r
+      }\r
+      return TRUE;\r
+    }\r
+\r
+    //long wm_task_bar_create_;\r
+    //sf::taskbar taskbar_;\r
+\r
+    timer timer_;\r
+    bool thumb_start_;\r
+    //slider slider_;\r
+\r
+    //IDXGIFactory1Ptr dxgi_factory_;\r
+    //IDXGIAdapter1Ptr adapter_;\r
+    //IDXGIOutputPtr output_;\r
+    //ID3D11DevicePtr d3d_device_;\r
+    //ID3D11DeviceContextPtr d3d_context_;\r
+    //ID3D11Texture2DPtr texture_;\r
+    //ID3D11RenderTargetViewPtr view_;\r
+    //ID3D11Texture2DPtr depth_texture_;\r
+    //ID3D11DepthStencilViewPtr depth_view_;\r
+    //ID3D11VertexShaderPtr v_shader_;\r
+    //ID3D11InputLayoutPtr input_layout_;\r
+    //ID3D11PixelShaderPtr p_shader_;\r
+    //ID3D11BufferPtr v_buffer_;\r
+    //ID3D11BufferPtr i_buffer_;\r
+    //ID3D11BufferPtr cb_never_changes_;\r
+    //ID3D11BufferPtr cb_change_on_resize_;\r
+    //ID3D11BufferPtr cb_changes_every_frame_;\r
+    //ID3D11ShaderResourceViewPtr shader_res_view_;\r
+    //ID3D11SamplerStatePtr sampler_state_;\r
+\r
+    //XMMATRIX                            mat_world_;\r
+    //XMMATRIX                            mat_view_;\r
+    //XMMATRIX                            mat_projection_;\r
+    //XMFLOAT4                            mesh_color_;\r
+\r
+    float client_width_,client_height_;\r
+\r
+    //IDXGISwapChainPtr; \r
+    //IDXGISwapChainPtr swap_chain_;\r
+    // std::wstring dxgi_info_;\r
+\r
+    std::wstring file_name_;\r
+    std::wstring dir_name_;\r
+    icon icon_;\r
+    bool init_;\r
+\r
+    D2D1_SIZE_U icon_size_;\r
+\r
+    //  HWND hwnd_config_;\r
+    // HWND hwnd_info_;\r
+\r
+    boost::ptr_vector<tab_dialog_base> tab_dialogs_;\r
+    //tab_dialog_ptr config_dialog_;\r
+\r
+    int tab_page_;\r
+\r
+\r
+    // thisとhwndをつなぐthunkクラス\r
+    // メンバー関数を直接呼び出す。\r
+    struct hwnd_this_thunk2 : public Xbyak::CodeGenerator {\r
+      hwnd_this_thunk2(LONG_PTR this_addr,const void * proc)\r
+      {\r
+        // 引数の位置をひとつ後ろにずらす\r
+        mov(r10,r9);\r
+        mov(r9,r8);\r
+        mov(r8,rdx);\r
+        mov(rdx,rcx);\r
+        // thisのアドレスをrcxに格納する\r
+        mov(rcx,(LONG_PTR)this_addr);\r
+        // 第5引数をスタックに格納\r
+        push(r10);\r
+        sub(rsp,32);\r
+        mov(r10,(LONG_PTR)proc);\r
+        // メンバ関数呼び出し\r
+        call(r10);\r
+        add(rsp,40);\r
+        ret(0);\r
+      }\r
+    };\r
+\r
+    //hwnd_this_thunk2 thunk_info_;\r
+    //  hwnd_this_thunk2 thunk_config_;\r
+    //proc_t proc_info_;\r
+    //  proc_t proc_config_;\r
+\r
+  };\r
+\r
+  //\r
+  // Creates a Direct2D bitmap from the specified\r
+  // file name.\r
+  //\r
+  ID2D1BitmapPtr load_bitmap_from_file(\r
+    ID2D1HwndRenderTargetPtr render_target,\r
+    IWICImagingFactoryPtr wic_factory,\r
+    std::wstring uri,\r
+    uint32_t destination_width,\r
+    uint32_t destination_height\r
+    )\r
+  {\r
+    HRESULT hr = S_OK;\r
+\r
+    IWICBitmapDecoderPtr decoder;\r
+    IWICBitmapFrameDecodePtr decoder_source;\r
+    IWICStreamPtr stream;\r
+    IWICFormatConverterPtr converter;\r
+    IWICBitmapScalerPtr scaler;\r
+    ID2D1BitmapPtr bitmap;\r
+\r
+    THROW_IFERR(wic_factory->CreateDecoderFromFilename(\r
+      uri.c_str(),\r
+      NULL,\r
+      GENERIC_READ,\r
+      WICDecodeMetadataCacheOnLoad,\r
+      &decoder\r
+      ));\r
+\r
+    // Create the initial frame.\r
+    THROW_IFERR(decoder->GetFrame(0, &decoder_source));\r
+\r
+    // Convert the image format to 32bppPBGRA\r
+    // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).\r
+    THROW_IFERR(hr = wic_factory->CreateFormatConverter(&converter));\r
+\r
+    // If a new width or height was specified, create an\r
+    // IWICBitmapScaler and use it to resize the image.\r
+    if (destination_width != 0 || destination_height != 0)\r
+    {\r
+      uint32_t originalWidth, originalHeight;\r
+      THROW_IFERR(decoder_source->GetSize((UINT*)&originalWidth, (UINT*)&originalHeight));\r
+      if (destination_width == 0)\r
+      {\r
+        FLOAT scalar = static_cast<FLOAT>(destination_height) / static_cast<FLOAT>(originalHeight);\r
+        destination_width = static_cast<uint32_t>(scalar * static_cast<FLOAT>(originalWidth));\r
+      }\r
+      else if (destination_height == 0)\r
+      {\r
+        FLOAT scalar = static_cast<FLOAT>(destination_width) / static_cast<FLOAT>(originalWidth);\r
+        destination_height = static_cast<uint32_t>(scalar * static_cast<FLOAT>(originalHeight));\r
+      }\r
+\r
+      THROW_IFERR(wic_factory->CreateBitmapScaler(&scaler));\r
+      THROW_IFERR(scaler->Initialize(\r
+        decoder_source,\r
+        destination_width,\r
+        destination_height,\r
+        WICBitmapInterpolationModeCubic\r
+        ));\r
+      THROW_IFERR(converter->Initialize(\r
+        scaler.GetInterfacePtr(),\r
+        GUID_WICPixelFormat32bppPBGRA,\r
+        WICBitmapDitherTypeNone,\r
+        NULL,\r
+        0.f,\r
+        WICBitmapPaletteTypeMedianCut\r
+        ));\r
+    }\r
+    else // Don't scale the image.\r
+    {\r
+      THROW_IFERR(converter->Initialize(\r
+        decoder_source.GetInterfacePtr(),\r
+        GUID_WICPixelFormat32bppPBGRA,\r
+        WICBitmapDitherTypeNone,\r
+        NULL,\r
+        0.f,\r
+        WICBitmapPaletteTypeMedianCut\r
+        ));\r
+    }\r
+\r
+    // Create a Direct2D bitmap from the WIC bitmap.\r
+    THROW_IFERR(render_target->CreateBitmapFromWicBitmap(\r
+      converter.GetInterfacePtr(),\r
+      NULL,\r
+      &bitmap\r
+      ));\r
+\r
+    return bitmap;\r
+  }\r
+\r
+\r
+  toplevel_window::toplevel_window(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width ,float height)\r
+    : impl_(new impl(menu_name,name,fit_to_display,width,height))\r
+  {\r
+\r
+  };\r
+\r
+  void * toplevel_window::raw_handle() const {return impl_->raw_handle();};\r
+  void toplevel_window::create(){impl_->create();};\r
+  void toplevel_window::show(){impl_->show();};\r
+  void toplevel_window::hide(){impl_->hide();};\r
+  bool toplevel_window::is_show(){return impl_->is_show();};\r
+  void toplevel_window::text(std::wstring& text){impl_->text(text);};\r
+  void toplevel_window::message_box(const std::wstring& text,const std::wstring& caption,uint32_t type )\r
+  {\r
+    impl_->message_box(text,caption,type);\r
+  };\r
+  void toplevel_window::update(){impl_->update();};\r
+  void toplevel_window::render(){impl_->render();};\r
+  void toplevel_window::reader_ready(){impl_->reader_ready();};\r
+  void toplevel_window::reader_read_file(){impl_->reader_read_file();};\r
+  void toplevel_window::reader_pause(){impl_->reader_pause();};\r
+  void toplevel_window::reader_stop(){impl_->reader_stop();};\r
+\r
+  void toplevel_window::enable_control(uint32_t id,bool enable)\r
+  {\r
+    impl_->enable_control(id,enable);\r
+  };\r
+\r
+\r
+  toplevel_window_ptr create_toplevel_window\r
+    (\r
+    const std::wstring& menu_name,\r
+    const std::wstring& name,\r
+    const uint32_t show_flag,\r
+    bool fit_to_display,\r
+    float width,\r
+    float height\r
+    )\r
+  {\r
+    // クライアント領域のサイズからウィンドウサイズを設定\r
+    RECT    rect    = { 0, 0, width, height };\r
+    ::AdjustWindowRectEx( &rect, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, FALSE, 0 );\r
+    toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,rect.right - rect.left,rect.bottom - rect.top);\r
+    p->create();\r
+    p->show();\r
+    p->update();\r
+    return toplevel_window_ptr(p);\r
+  }\r
+  void dialogbox\r
+    (\r
+    const std::wstring& menu_name,\r
+    const std::wstring& name\r
+    )\r
+  {\r
+    toplevel_window_ptr p(new toplevel_window(menu_name,name,false));\r
+    p->create();\r
+  }\r
+\r
+\r
+\r
+\r
+}\r
+\r
diff --git a/winwrapper/toplevel_window.h b/winwrapper/toplevel_window.h
new file mode 100644 (file)
index 0000000..5f2c55d
--- /dev/null
@@ -0,0 +1,80 @@
+#pragma once\r
+/*\r
+*/\r
+// Windows Header Files:\r
+#include "sf_windows.h"\r
+#include "icon.h"\r
+#include "base_window.h"\r
+#include "taskbar.h"\r
+\r
+#define WM_PLAY_STOP WM_USER + 1\r
+#define WM_PLAY_PAUSE WM_USER + 2\r
+#define WM_PLAY_PLAY WM_USER + 3\r
+\r
+namespace sf\r
+{\r
+\r
+  struct toplevel_window;\r
+  typedef std::shared_ptr<toplevel_window> toplevel_window_ptr;\r
+\r
+  /** toplevel_window を生成する関数 */\r
+  toplevel_window_ptr create_toplevel_window (\r
+    const std::wstring& menu_name,\r
+    const std::wstring& name,\r
+    const uint32_t show_flag = SW_SHOW,\r
+    bool fit_to_display = false,\r
+    float width = 640,\r
+    float height = 480\r
+    );\r
+  /** toplevel_window を生成する関数 */\r
+  void dialogbox (\r
+    const std::wstring& menu_name,\r
+    const std::wstring& name\r
+    );\r
+\r
+  /** toplevel ウィンドウクラス */\r
+  /* このクラスは、create_toplevel_window 関数からのみ生成可能 */\r
+  struct toplevel_window : public base_window\r
+  {\r
+\r
+    friend   toplevel_window_ptr create_toplevel_window\r
+      (\r
+      const std::wstring& menu_name,\r
+      const std::wstring& name,\r
+      const uint32_t show_flag,\r
+      bool fit_to_display,\r
+      float width ,\r
+      float height\r
+      );\r
+\r
+    friend void dialogbox (\r
+      const std::wstring& menu_name,\r
+      const std::wstring& name\r
+    );\r
+\r
+    ~toplevel_window(){};\r
\r
+    void * raw_handle() const;\r
+    void create();\r
+    void toplevel_window::show();\r
+    bool toplevel_window::is_show();\r
+    void toplevel_window::hide();\r
+    void message_box(const std::wstring& text,const std::wstring& caption,uint32_t type = MB_OK);\r
+    void text(std::wstring& text);\r
+    void update();\r
+    void render();\r
+\r
+    void reader_ready();\r
+    void reader_read_file();\r
+    void reader_pause();\r
+    void reader_stop();\r
+   \r
+    void enable_control(uint32_t id,bool enable);\r
+\r
+  private:\r
+    struct impl;\r
+    toplevel_window(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width = 800 ,float height = 600);\r
+    // 実装部\r
+    std::shared_ptr<impl> impl_;\r
+  };\r
+}
\ No newline at end of file
diff --git a/winwrapper/winmain.cpp b/winwrapper/winmain.cpp
new file mode 100644 (file)
index 0000000..90d23a7
--- /dev/null
@@ -0,0 +1,15 @@
+#include "stdafx.h"\r
+#include "application.h"\r
+\r
+\r
+//#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")\r
+/** WinMain */\r
+int APIENTRY _tWinMain(HINSTANCE hInstance,\r
+                     HINSTANCE hPrevInstance,\r
+                     LPTSTR    lpCmdLine,\r
+                     int       nCmdShow)\r
+{\r
+       \r
+  return sf::application::instance()\r
+    ->execute( hInstance,hPrevInstance,lpCmdLine,nCmdShow);\r
+}\r
index fc5dbdd..e28a31b 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
   <ItemGroup Label="ProjectConfigurations">\r
-    <ProjectConfiguration Include="Debug|Win32">\r
+    <ProjectConfiguration Include="Debug|x64">\r
       <Configuration>Debug</Configuration>\r
-      <Platform>Win32</Platform>\r
+      <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Release|Win32">\r
+    <ProjectConfiguration Include="Release|x64">\r
       <Configuration>Release</Configuration>\r
-      <Platform>Win32</Platform>\r
+      <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
   </ItemGroup>\r
   <PropertyGroup Label="Globals">\r
     <RootNamespace>winwrapper</RootNamespace>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseDebugLibraries>true</UseDebugLibraries>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Windows7.1SDK</PlatformToolset>\r
   </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseDebugLibraries>false</UseDebugLibraries>\r
     <WholeProgramOptimization>true</WholeProgramOptimization>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Windows7.1SDK</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
   <ImportGroup Label="ExtensionSettings">\r
   </ImportGroup>\r
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="..\SF.props" />\r
   </ImportGroup>\r
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="..\SF.props" />\r
   </ImportGroup>\r
   <PropertyGroup Label="UserMacros" />\r
   <PropertyGroup />\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
     <ClCompile>\r
       <WarningLevel>Level3</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <FloatingPointModel>Precise</FloatingPointModel>\r
+      <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>\r
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
+      <PreprocessorDefinitions>_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
     </ClCompile>\r
     <Link>\r
       <GenerateDebugInformation>true</GenerateDebugInformation>\r
     </Link>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
     <ClCompile>\r
       <WarningLevel>Level3</WarningLevel>\r
       <Optimization>MaxSpeed</Optimization>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <FloatingPointModel>Fast</FloatingPointModel>\r
     </ClCompile>\r
     <Link>\r
       <GenerateDebugInformation>true</GenerateDebugInformation>\r
     </Link>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="application.cpp" />\r
+    <ClCompile Include="base_window.cpp" />\r
+    <ClCompile Include="code_converter.cpp" />\r
+    <ClCompile Include="dpi.cpp" />\r
+    <ClCompile Include="exception.cpp" />\r
+    <ClCompile Include="icon.cpp" />\r
+    <ClCompile Include="jumplist.cpp" />\r
+    <ClCompile Include="logger.cpp" />\r
+    <ClCompile Include="sf_com.cpp" />\r
+    <ClCompile Include="sf_windows.cpp" />\r
+    <ClCompile Include="stdafx.cpp">\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>\r
+    </ClCompile>\r
+    <ClCompile Include="taskbar.cpp" />\r
+    <ClCompile Include="test_window.cpp" />\r
+    <ClCompile Include="timer.cpp" />\r
+    <ClCompile Include="winmain.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="application.h" />\r
+    <ClInclude Include="base_window.h" />\r
+    <ClInclude Include="code_converter.h" />\r
+    <ClInclude Include="dout.h" />\r
+    <ClInclude Include="dpi.h" />\r
+    <ClInclude Include="exception.h" />\r
+    <ClInclude Include="icon.h" />\r
+    <ClInclude Include="jumplist.h" />\r
+    <ClInclude Include="logger.h" />\r
+    <ClInclude Include="message_loop.h" />\r
+    <ClInclude Include="sf_com.h" />\r
+    <ClInclude Include="sf_memory.h" />\r
+    <ClInclude Include="sf_windows.h" />\r
+    <ClInclude Include="singleton.h" />\r
+    <ClInclude Include="stdafx.h" />\r
+    <ClInclude Include="taskbar.h" />\r
+    <ClInclude Include="test_window.h" />\r
+    <ClInclude Include="timer.h" />\r
   </ItemGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r