From 4933d1f2bc402119e26fa0d49f6edb27ad72471f Mon Sep 17 00:00:00 2001 From: jiajia_deng <2894220@gmail.com> Date: Fri, 20 Sep 2019 16:27:58 +0800 Subject: [PATCH] Remove dependency on shared Signed-off-by: jiajia_deng <2894220@gmail.com> --- README.md | 14 +- README_en-US.md | 16 +- {tool_kits/base => base}/base.h | 0 {tool_kits/base => base}/base.vcxproj | 16 +- {tool_kits/base => base}/base.vcxproj.filters | 0 {tool_kits/base => base}/base_config.h | 0 {tool_kits/base => base}/base_export.h | 0 {tool_kits/base => base}/base_types.h | 0 {tool_kits/base => base}/callback/callback.h | 0 {tool_kits/base => base}/compiler_specific.h | 0 {tool_kits/base => base}/encrypt/des.cpp | 0 {tool_kits/base => base}/encrypt/des.h | 0 {tool_kits/base => base}/encrypt/encrypt.h | 0 .../base => base}/encrypt/encrypt_impl.h | 0 {tool_kits/base => base}/error.h | 0 {tool_kits/base => base}/file/file_path.h | 0 {tool_kits/base => base}/file/file_util.cpp | 0 {tool_kits/base => base}/file/file_util.h | 0 .../base => base}/file/file_util_posix.cpp | 0 .../base => base}/file/file_util_win.cpp | 0 .../framework/default_message_pump.cpp | 0 .../framework/default_message_pump.h | 0 .../base => base}/framework/message_loop.cpp | 0 .../base => base}/framework/message_loop.h | 0 .../framework/message_loop_proxy.cpp | 0 .../framework/message_loop_proxy.h | 0 .../base => base}/framework/message_pump.cpp | 0 .../base => base}/framework/message_pump.h | 0 .../base => base}/framework/observer_list.h | 0 {tool_kits/base => base}/framework/readme.txt | 0 {tool_kits/base => base}/framework/task.h | 0 .../framework/win_io_message_pump.cpp | 0 .../framework/win_io_message_pump.h | 0 .../framework/win_message_pump.cpp | 0 .../framework/win_message_pump.h | 0 .../framework/win_ui_message_pump.cpp | 0 .../framework/win_ui_message_pump.h | 0 {tool_kits/base => base}/hardware/cpu.cpp | 0 {tool_kits/base => base}/hardware/cpu.h | 0 {tool_kits/base => base}/macros.h | 0 {tool_kits/base => base}/memory/blockbuffer.h | 0 {tool_kits/base => base}/memory/deleter.h | 0 .../base => base}/memory/lazy_instance.h | 0 {tool_kits/base => base}/memory/singleton.h | 0 .../base => base}/network/network_util.cpp | 0 .../base => base}/network/network_util.h | 0 {tool_kits/base => base}/network/nio_base.h | 0 {tool_kits/base => base}/port.h | 0 .../base => base}/synchronization/lock.h | 0 .../synchronization/lock_posix.cpp | 0 .../synchronization/lock_win.cpp | 0 .../base => base}/synchronization/semaphore.h | 0 .../synchronization/semaphore_posix.cpp | 0 .../synchronization/semaphore_win.cpp | 0 .../synchronization/waitable_event.h | 0 .../synchronization/waitable_event_posix.cpp | 0 .../synchronization/waitable_event_win.cpp | 0 .../third_party/chrome/atomicops.h | 0 .../chrome/atomicops_internals_arm_gcc.h | 0 .../atomicops_internals_atomicword_compat.h | 0 .../chrome/atomicops_internals_x86_gcc.cc | 0 .../chrome/atomicops_internals_x86_gcc.h | 0 .../chrome/atomicops_internals_x86_macosx.h | 0 .../chrome/atomicops_internals_x86_msvc.h | 0 .../third_party/convert_utf/ConvertUTF.c | 0 .../third_party/convert_utf/ConvertUTF.h | 0 .../third_party/convert_utf/readme.txt | 0 .../third_party/modp_b64/Readme.txt | 0 .../third_party/modp_b64/modp_b64.cc | 0 .../third_party/modp_b64/modp_b64.h | 0 .../third_party/modp_b64/modp_b64_data.h | 0 .../base => base}/thread/framework_thread.cpp | 0 .../base => base}/thread/framework_thread.h | 0 {tool_kits/base => base}/thread/thread.h | 0 .../base => base}/thread/thread_local.h | 0 .../thread/thread_local_posix.cpp | 0 .../base => base}/thread/thread_local_win.cpp | 0 .../base => base}/thread/thread_manager.cpp | 0 .../base => base}/thread/thread_manager.h | 10 + .../base => base}/thread/thread_posix.cpp | 0 .../base => base}/thread/thread_win.cpp | 0 {tool_kits/base => base}/time/time.cpp | 0 {tool_kits/base => base}/time/time.h | 0 {tool_kits/base => base}/time/time_posix.cpp | 0 {tool_kits/base => base}/time/time_win.cpp | 0 {tool_kits/base => base}/util/at_exit.cpp | 0 {tool_kits/base => base}/util/at_exit.h | 0 {tool_kits/base => base}/util/base64.cpp | 0 {tool_kits/base => base}/util/base64.h | 0 .../base => base}/util/callback_unittest.cpp | 0 .../base => base}/util/cmd_line_args.cpp | 0 {tool_kits/base => base}/util/cmd_line_args.h | 0 .../util/string_number_conversions.cpp | 0 .../util/string_number_conversions.h | 0 {tool_kits/base => base}/util/string_util.cpp | 0 {tool_kits/base => base}/util/string_util.h | 0 .../base => base}/util/stringize_macros.h | 0 {tool_kits/base => base}/util/template_util.h | 0 {tool_kits/base => base}/util/unicode.h | 0 {tool_kits/base => base}/util/valuemap.h | 0 .../base => base}/win32/object_watcher.cpp | 0 .../base => base}/win32/object_watcher.h | 0 {tool_kits/base => base}/win32/path_util.cpp | 0 {tool_kits/base => base}/win32/path_util.h | 0 .../win32/platform_string_util.cpp | 0 .../win32/platform_string_util.h | 0 .../base => base}/win32/scoped_win_handle.h | 0 .../base => base}/win32/security_util.cpp | 0 .../base => base}/win32/security_util.h | 0 .../base => base}/win32/shared_memory.cpp | 0 .../base => base}/win32/shared_memory.h | 0 {tool_kits/base => base}/win32/win_util.cpp | 0 {tool_kits/base => base}/win32/win_util.h | 0 {tool_kits/build => build}/build_config.h | 0 {tool_kits/build => build}/stdafx.cpp | 0 {tool_kits/build => build}/stdafx.h | 0 .../uac_require_admin_win.manifest | 0 {tool_kits/build => build}/winsdk_config.h | 0 .../build => build}/xp_style_manifest_win.h | 0 docs/PREVIEW.gif | Bin 92566 -> 201727 bytes .../Animation/AnimationManager.cpp | 0 .../Animation/AnimationManager.h | 0 .../Animation/AnimationPlayer.cpp | 0 .../Animation/AnimationPlayer.h | 0 {tool_kits/duilib => duilib}/Box/ChildBox.cpp | 0 {tool_kits/duilib => duilib}/Box/ChildBox.h | 0 {tool_kits/duilib => duilib}/Box/HBox.cpp | 0 {tool_kits/duilib => duilib}/Box/HBox.h | 0 {tool_kits/duilib => duilib}/Box/TabBox.cpp | 0 {tool_kits/duilib => duilib}/Box/TabBox.h | 0 {tool_kits/duilib => duilib}/Box/TileBox.cpp | 0 {tool_kits/duilib => duilib}/Box/TileBox.h | 0 {tool_kits/duilib => duilib}/Box/VBox.cpp | 0 {tool_kits/duilib => duilib}/Box/VBox.h | 0 {tool_kits/duilib => duilib}/Control/Button.h | 0 .../duilib => duilib}/Control/CheckBox.h | 0 .../Control/CircleProgress.cpp | 410 +++--- .../Control/CircleProgress.h | 178 +-- .../duilib => duilib}/Control/Combo.cpp | 0 {tool_kits/duilib => duilib}/Control/Combo.h | 0 {tool_kits/duilib => duilib}/Control/Label.h | 0 {tool_kits/duilib => duilib}/Control/List.cpp | 0 {tool_kits/duilib => duilib}/Control/List.h | 0 {tool_kits/duilib => duilib}/Control/Option.h | 0 .../duilib => duilib}/Control/Progress.cpp | 0 .../duilib => duilib}/Control/Progress.h | 0 .../duilib => duilib}/Control/RichEdit.cpp | 0 .../duilib => duilib}/Control/RichEdit.h | 0 .../duilib => duilib}/Control/ScrollBar.cpp | 0 .../duilib => duilib}/Control/ScrollBar.h | 0 .../duilib => duilib}/Control/Slider.cpp | 0 {tool_kits/duilib => duilib}/Control/Slider.h | 0 .../duilib => duilib}/Control/TreeView.cpp | 0 .../duilib => duilib}/Control/TreeView.h | 0 .../Control/VirtualListBox.cpp | 0 .../Control/VirtualListBox.h | 0 {tool_kits/duilib => duilib}/Core/Box.cpp | 0 {tool_kits/duilib => duilib}/Core/Box.h | 0 {tool_kits/duilib => duilib}/Core/Control.cpp | 0 {tool_kits/duilib => duilib}/Core/Control.h | 0 {tool_kits/duilib => duilib}/Core/Define.cpp | 0 {tool_kits/duilib => duilib}/Core/Define.h | 0 .../duilib => duilib}/Core/GlobalManager.cpp | 0 .../duilib => duilib}/Core/GlobalManager.h | 0 {tool_kits/duilib => duilib}/Core/Image.cpp | 0 {tool_kits/duilib => duilib}/Core/Image.h | 0 {tool_kits/duilib => duilib}/Core/Markup.cpp | 0 {tool_kits/duilib => duilib}/Core/Markup.h | 0 .../duilib => duilib}/Core/Placeholder.cpp | 0 .../duilib => duilib}/Core/Placeholder.h | 0 {tool_kits/duilib => duilib}/Core/Window.cpp | 0 {tool_kits/duilib => duilib}/Core/Window.h | 0 .../duilib => duilib}/Core/WindowBuilder.cpp | 0 .../duilib => duilib}/Core/WindowBuilder.h | 0 .../duilib => duilib}/Render/Bitmap.cpp | 0 {tool_kits/duilib => duilib}/Render/Bitmap.h | 0 {tool_kits/duilib => duilib}/Render/Brush.cpp | 0 {tool_kits/duilib => duilib}/Render/Brush.h | 0 {tool_kits/duilib => duilib}/Render/Clip.cpp | 0 {tool_kits/duilib => duilib}/Render/Clip.h | 0 .../duilib => duilib}/Render/Factory.cpp | 0 {tool_kits/duilib => duilib}/Render/Factory.h | 0 .../duilib => duilib}/Render/IRender.cpp | 0 {tool_kits/duilib => duilib}/Render/IRender.h | 0 .../duilib => duilib}/Render/Matrix.cpp | 0 {tool_kits/duilib => duilib}/Render/Matrix.h | 0 {tool_kits/duilib => duilib}/Render/Path.cpp | 0 {tool_kits/duilib => duilib}/Render/Path.h | 0 {tool_kits/duilib => duilib}/Render/Pen.cpp | 0 {tool_kits/duilib => duilib}/Render/Pen.h | 0 .../duilib => duilib}/Render/Render.cpp | 1252 ++++++++--------- {tool_kits/duilib => duilib}/Render/Render.h | 0 {tool_kits/duilib => duilib}/StdAfx.cpp | 0 {tool_kits/duilib => duilib}/StdAfx.h | 0 {tool_kits/duilib => duilib}/UIlib.cpp | 0 {tool_kits/duilib => duilib}/UIlib.h | 0 .../duilib => duilib}/Utils/ApiWrapper.cpp | 0 .../duilib => duilib}/Utils/ApiWrapper.h | 0 {tool_kits/duilib => duilib}/Utils/Delegate.h | 0 .../duilib => duilib}/Utils/DpiManager.cpp | 0 .../duilib => duilib}/Utils/DpiManager.h | 0 {tool_kits/duilib => duilib}/Utils/Macros.h | 0 .../Utils/MultiLangSupport.cpp | 0 .../Utils/MultiLangSupport.h | 0 .../Utils/OnScreenKeyboardManager.cpp | 0 .../Utils/OnScreenKeyboardManager.h | 0 {tool_kits/duilib => duilib}/Utils/Shadow.cpp | 0 {tool_kits/duilib => duilib}/Utils/Shadow.h | 0 .../duilib => duilib}/Utils/StringUtil.cpp | 0 .../duilib => duilib}/Utils/StringUtil.h | 0 .../duilib => duilib}/Utils/TimerManager.cpp | 0 .../duilib => duilib}/Utils/TimerManager.h | 0 {tool_kits/duilib => duilib}/Utils/UnZip.cpp | 0 {tool_kits/duilib => duilib}/Utils/UnZip.h | 0 {tool_kits/duilib => duilib}/Utils/Utils.h | 0 .../duilib => duilib}/Utils/VersionHelpers.h | 0 .../duilib => duilib}/Utils/WinImplBase.cpp | 0 .../duilib => duilib}/Utils/WinImplBase.h | 0 .../duilib => duilib}/Utils/flash11.tlh | 0 {tool_kits/duilib => duilib}/duilib.sln | 0 {tool_kits/duilib => duilib}/duilib.vcxproj | 842 +++++------ .../duilib => duilib}/duilib.vcxproj.filters | 692 ++++----- {samples => examples}/README.md | 2 +- {samples => examples}/basic/basic.ico | Bin {samples => examples}/basic/basic.rc | Bin {samples => examples}/basic/basic.vcxproj | 27 +- .../basic/basic.vcxproj.filters | 0 {samples => examples}/basic/basic_form.cpp | 0 {samples => examples}/basic/basic_form.h | 0 {samples => examples}/basic/main.cpp | 4 +- {samples => examples}/basic/main.h | 0 {samples => examples}/basic/resource.h | 0 {samples => examples}/basic/small.ico | Bin {samples => examples}/basic/stdafx.cpp | 0 {samples/layouts => examples/basic}/stdafx.h | 3 - {samples => examples}/basic/targetver.h | 0 {samples => examples}/cef/cef.ico | Bin {samples => examples}/cef/cef.rc | Bin {samples => examples}/cef/cef.vcxproj | 17 +- {samples => examples}/cef/cef.vcxproj.filters | 0 {samples => examples}/cef/cef_form.cpp | 2 +- {samples => examples}/cef/cef_form.h | 0 {samples => examples}/cef/main.cpp | 6 +- {samples => examples}/cef/main.h | 0 {samples => examples}/cef/resource.h | 0 {samples => examples}/cef/small.ico | Bin {samples => examples}/cef/stdafx.cpp | 0 {samples => examples}/cef/stdafx.h | 3 - {samples => examples}/cef/targetver.h | 0 {samples => examples}/controls/controls.ico | Bin {samples => examples}/controls/controls.rc | Bin .../controls/controls.vcxproj | 17 +- .../controls/controls.vcxproj.filters | 0 .../controls/controls_form.cpp | 10 +- .../controls/controls_form.h | 0 {samples => examples}/controls/main.cpp | 14 +- {samples => examples}/controls/main.h | 32 +- {samples => examples}/controls/resource.h | 0 {samples => examples}/controls/small.ico | Bin {samples => examples}/controls/stdafx.cpp | 0 {samples => examples}/controls/stdafx.h | 3 - {samples => examples}/controls/targetver.h | 0 samples/samples.sln => examples/examples.sln | 84 +- {samples => examples}/layouts/layouts.ico | Bin {samples => examples}/layouts/layouts.rc | Bin {samples => examples}/layouts/layouts.vcxproj | 17 +- .../layouts/layouts.vcxproj.filters | 0 .../layouts/layouts_form.cpp | 0 {samples => examples}/layouts/layouts_form.h | 0 {samples => examples}/layouts/main.cpp | 4 +- {samples => examples}/layouts/main.h | 0 {samples => examples}/layouts/resource.h | 0 {samples => examples}/layouts/small.ico | Bin {samples => examples}/layouts/stdafx.cpp | 0 {samples/basic => examples/layouts}/stdafx.h | 3 - {samples => examples}/layouts/targetver.h | 0 .../multi_browser/Resource.h | 0 .../multi_browser/browser/browser_box.cpp | 2 +- .../multi_browser/browser/browser_box.h | 0 .../multi_browser/browser/custom_layout.cpp | 0 .../multi_browser/browser/custom_layout.h | 0 .../browser/multi_browser_form.cpp | 18 +- .../browser/multi_browser_form.h | 0 .../browser/multi_browser_form_dragdrop.cpp | 17 +- .../browser/multi_browser_manager.cpp | 0 .../browser/multi_browser_manager.h | 0 .../control/browser_tab_item.cpp | 0 .../multi_browser/control/browser_tab_item.h | 0 .../multi_browser/dragdrop/bitmap_control.cpp | 0 .../multi_browser/dragdrop/bitmap_control.h | 0 .../multi_browser/dragdrop/drag_drop.cpp | 0 .../multi_browser/dragdrop/drag_drop.h | 0 .../multi_browser/dragdrop/drag_form.cpp | 0 .../multi_browser/dragdrop/drag_form.h | 0 {samples => examples}/multi_browser/main.cpp | 10 +- {samples => examples}/multi_browser/main.h | 0 .../multi_browser/multi_browser.ico | Bin .../multi_browser/multi_browser.rc | Bin .../multi_browser/multi_browser.vcxproj | 17 +- .../multi_browser.vcxproj.filters | 0 {samples => examples}/multi_browser/small.ico | Bin .../multi_browser/stdafx.cpp | 0 {samples => examples}/multi_browser/stdafx.h | 3 - .../multi_browser/targetver.h | 0 .../multi_browser/taskbar/dwm_util.cpp | 0 .../multi_browser/taskbar/dwm_util.h | 0 .../multi_browser/taskbar/taskbar_manager.cpp | 1 - .../multi_browser/taskbar/taskbar_manager.h | 0 {samples => examples}/richlist/item.cpp | 8 +- {samples => examples}/richlist/item.h | 0 {samples => examples}/richlist/main.cpp | 4 +- {samples => examples}/richlist/main.h | 0 {samples => examples}/richlist/resource.h | 0 {samples => examples}/richlist/richlist.ico | Bin {samples => examples}/richlist/richlist.rc | Bin .../richlist/richlist.vcxproj | 17 +- .../richlist/richlist.vcxproj.filters | 0 .../richlist/richlist_form.cpp | 0 .../richlist/richlist_form.h | 0 {samples => examples}/richlist/small.ico | Bin {samples => examples}/richlist/stdafx.cpp | 0 {samples => examples}/richlist/stdafx.h | 3 - {samples => examples}/richlist/targetver.h | 0 {samples => examples}/virtualbox/Resource.h | 0 .../virtualbox/VirtualTileBox.cpp | 0 .../virtualbox/VirtualTileBox.h | 4 +- {samples => examples}/virtualbox/item.cpp | 8 +- {samples => examples}/virtualbox/item.h | 0 {samples => examples}/virtualbox/main.cpp | 4 +- {samples => examples}/virtualbox/main.h | 0 .../virtualbox/main_form.cpp | 0 {samples => examples}/virtualbox/main_form.h | 0 {samples => examples}/virtualbox/provider.cpp | 4 +- {samples => examples}/virtualbox/provider.h | 4 +- {samples => examples}/virtualbox/small.ico | Bin {samples => examples}/virtualbox/stdafx.cpp | 0 {samples => examples}/virtualbox/stdafx.h | 6 +- {samples => examples}/virtualbox/targetver.h | 0 .../virtualbox/virtualbox.filters | 0 .../virtualbox/virtualbox.ico | Bin .../virtualbox/virtualbox.rc | Bin .../virtualbox/virtualbox.vcxproj | 11 +- tool_kits/shared/base.h | 4 - tool_kits/shared/closure.cpp | 19 - tool_kits/shared/closure.h | 12 - tool_kits/shared/cmd_line.cpp | 74 - tool_kits/shared/cmd_line.h | 29 - tool_kits/shared/db_helper.cpp | 61 - tool_kits/shared/db_helper.h | 107 -- tool_kits/shared/image_ole_i.c | 94 -- tool_kits/shared/image_ole_i.h | 729 ---------- tool_kits/shared/ipc_manager.cpp | 81 -- tool_kits/shared/ipc_manager.h | 27 - tool_kits/shared/log.cpp | 251 ---- tool_kits/shared/log.h | 64 - tool_kits/shared/misc_thread.cpp | 24 - tool_kits/shared/misc_thread.h | 30 - tool_kits/shared/pin_yin_helper.cpp | 149 -- tool_kits/shared/pin_yin_helper.h | 34 - tool_kits/shared/ring.cpp | 114 -- tool_kits/shared/ring.h | 72 - tool_kits/shared/shared.h | 17 - tool_kits/shared/shared.vcxproj | 215 --- tool_kits/shared/shared.vcxproj.filters | 43 - tool_kits/shared/stdafx.cpp | 4 - tool_kits/shared/stdafx.h | 23 - tool_kits/shared/templated_object_factory.h | 114 -- tool_kits/shared/threads.h | 18 - tool_kits/shared/tool.cpp | 653 --------- tool_kits/shared/tool.h | 94 -- tool_kits/shared/utf8_file_util.cpp | 226 --- tool_kits/shared/utf8_file_util.h | 70 - tool_kits/shared/util.cpp | 65 - tool_kits/shared/util.h | 38 - tool_kits/shared/xml_util.cpp | 34 - tool_kits/shared/xml_util.h | 22 - tool_kits/shared/zoom_image.cpp | 455 ------ tool_kits/shared/zoom_image.h | 86 -- .../cef_control/app/cef_js_bridge.cpp | 6 +- .../cef_control/app/cef_js_bridge.h | 0 .../cef_control/app/client_app.cpp | 0 .../cef_control/app/client_app.h | 0 .../cef_control/app/client_app_browser.cpp | 0 .../cef_control/app/client_app_render.cpp | 0 .../cef_control/app/ipc_string_define.h | 0 .../cef_control/app/js_handler.cpp | 0 .../cef_control/app/js_handler.h | 0 .../cef_control/control/cef_control.cpp | 0 .../cef_control/control/cef_control.h | 0 .../cef_control/control/cef_control_base.cpp | 0 .../cef_control/control/cef_control_base.h | 0 .../control/cef_control_base_ui.cpp | 2 - .../cef_control/control/cef_control_event.h | 0 .../cef_control/control/cef_control_ui.cpp | 2 +- .../control/cef_native_control.cpp | 2 +- .../cef_control/control/cef_native_control.h | 0 .../cef_control/handler/browser_handler.cpp | 24 +- .../cef_control/handler/browser_handler.h | 2 +- .../cef_control/manager/cef_manager.cpp | 9 +- .../cef_control/manager/cef_manager.h | 0 .../cef_control/util}/auto_unregister.h | 0 .../cef_control/util/memory_dc.cpp | 0 .../cef_control/util/memory_dc.h | 0 .../cef_control/util/util.h | 0 .../menu/ui_menu.cpp | 0 .../menu/ui_menu.h | 0 .../modal_wnd/async_do_modal.cpp | 0 .../modal_wnd/async_do_modal.h | 0 .../modal_wnd/async_modal_runner.cpp | 6 +- .../modal_wnd/async_modal_runner.h | 0 .../modal_wnd/file_dialog_ex.cpp | 9 +- .../modal_wnd/file_dialog_ex.h | 3 +- .../modal_wnd/modal_wnd_base.h | 0 .../msgbox/msgbox.cpp | 2 +- .../msgbox/msgbox.h | 0 .../shadow_wnd/shadow_wnd.cpp | 0 .../shadow_wnd/shadow_wnd.h | 0 .../stdafx.cpp | 0 .../ui_components => ui_components}/stdafx.h | 3 - .../targetver.h | 0 .../toast/toast.cpp | 2 +- .../toast/toast.h | 0 .../ui_cef_control.h | 0 .../ui_components.h | 0 .../ui_components.vcxproj | 35 +- .../ui_components.vcxproj.filters | 3 + .../windows_manager/window_ex.cpp | 0 .../windows_manager/window_ex.h | 0 .../windows_manager/windows_manager.cpp | 5 - .../windows_manager/windows_manager.h | 0 430 files changed, 1956 insertions(+), 6130 deletions(-) rename {tool_kits/base => base}/base.h (100%) rename {tool_kits/base => base}/base.vcxproj (96%) rename {tool_kits/base => base}/base.vcxproj.filters (100%) rename {tool_kits/base => base}/base_config.h (100%) rename {tool_kits/base => base}/base_export.h (100%) rename {tool_kits/base => base}/base_types.h (100%) rename {tool_kits/base => base}/callback/callback.h (100%) rename {tool_kits/base => base}/compiler_specific.h (100%) rename {tool_kits/base => base}/encrypt/des.cpp (100%) rename {tool_kits/base => base}/encrypt/des.h (100%) rename {tool_kits/base => base}/encrypt/encrypt.h (100%) rename {tool_kits/base => base}/encrypt/encrypt_impl.h (100%) rename {tool_kits/base => base}/error.h (100%) rename {tool_kits/base => base}/file/file_path.h (100%) rename {tool_kits/base => base}/file/file_util.cpp (100%) rename {tool_kits/base => base}/file/file_util.h (100%) rename {tool_kits/base => base}/file/file_util_posix.cpp (100%) rename {tool_kits/base => base}/file/file_util_win.cpp (100%) rename {tool_kits/base => base}/framework/default_message_pump.cpp (100%) rename {tool_kits/base => base}/framework/default_message_pump.h (100%) rename {tool_kits/base => base}/framework/message_loop.cpp (100%) rename {tool_kits/base => base}/framework/message_loop.h (100%) rename {tool_kits/base => base}/framework/message_loop_proxy.cpp (100%) rename {tool_kits/base => base}/framework/message_loop_proxy.h (100%) rename {tool_kits/base => base}/framework/message_pump.cpp (100%) rename {tool_kits/base => base}/framework/message_pump.h (100%) rename {tool_kits/base => base}/framework/observer_list.h (100%) rename {tool_kits/base => base}/framework/readme.txt (100%) rename {tool_kits/base => base}/framework/task.h (100%) rename {tool_kits/base => base}/framework/win_io_message_pump.cpp (100%) rename {tool_kits/base => base}/framework/win_io_message_pump.h (100%) rename {tool_kits/base => base}/framework/win_message_pump.cpp (100%) rename {tool_kits/base => base}/framework/win_message_pump.h (100%) rename {tool_kits/base => base}/framework/win_ui_message_pump.cpp (100%) rename {tool_kits/base => base}/framework/win_ui_message_pump.h (100%) rename {tool_kits/base => base}/hardware/cpu.cpp (100%) rename {tool_kits/base => base}/hardware/cpu.h (100%) rename {tool_kits/base => base}/macros.h (100%) rename {tool_kits/base => base}/memory/blockbuffer.h (100%) rename {tool_kits/base => base}/memory/deleter.h (100%) rename {tool_kits/base => base}/memory/lazy_instance.h (100%) rename {tool_kits/base => base}/memory/singleton.h (100%) rename {tool_kits/base => base}/network/network_util.cpp (100%) rename {tool_kits/base => base}/network/network_util.h (100%) rename {tool_kits/base => base}/network/nio_base.h (100%) rename {tool_kits/base => base}/port.h (100%) rename {tool_kits/base => base}/synchronization/lock.h (100%) rename {tool_kits/base => base}/synchronization/lock_posix.cpp (100%) rename {tool_kits/base => base}/synchronization/lock_win.cpp (100%) rename {tool_kits/base => base}/synchronization/semaphore.h (100%) rename {tool_kits/base => base}/synchronization/semaphore_posix.cpp (100%) rename {tool_kits/base => base}/synchronization/semaphore_win.cpp (100%) rename {tool_kits/base => base}/synchronization/waitable_event.h (100%) rename {tool_kits/base => base}/synchronization/waitable_event_posix.cpp (100%) rename {tool_kits/base => base}/synchronization/waitable_event_win.cpp (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops.h (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_arm_gcc.h (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_atomicword_compat.h (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_x86_gcc.cc (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_x86_gcc.h (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_x86_macosx.h (100%) rename {tool_kits/base => base}/third_party/chrome/atomicops_internals_x86_msvc.h (100%) rename {tool_kits/base => base}/third_party/convert_utf/ConvertUTF.c (100%) rename {tool_kits/base => base}/third_party/convert_utf/ConvertUTF.h (100%) rename {tool_kits/base => base}/third_party/convert_utf/readme.txt (100%) rename {tool_kits/base => base}/third_party/modp_b64/Readme.txt (100%) rename {tool_kits/base => base}/third_party/modp_b64/modp_b64.cc (100%) rename {tool_kits/base => base}/third_party/modp_b64/modp_b64.h (100%) rename {tool_kits/base => base}/third_party/modp_b64/modp_b64_data.h (100%) rename {tool_kits/base => base}/thread/framework_thread.cpp (100%) rename {tool_kits/base => base}/thread/framework_thread.h (100%) rename {tool_kits/base => base}/thread/thread.h (100%) rename {tool_kits/base => base}/thread/thread_local.h (100%) rename {tool_kits/base => base}/thread/thread_local_posix.cpp (100%) rename {tool_kits/base => base}/thread/thread_local_win.cpp (100%) rename {tool_kits/base => base}/thread/thread_manager.cpp (100%) rename {tool_kits/base => base}/thread/thread_manager.h (95%) rename {tool_kits/base => base}/thread/thread_posix.cpp (100%) rename {tool_kits/base => base}/thread/thread_win.cpp (100%) rename {tool_kits/base => base}/time/time.cpp (100%) rename {tool_kits/base => base}/time/time.h (100%) rename {tool_kits/base => base}/time/time_posix.cpp (100%) rename {tool_kits/base => base}/time/time_win.cpp (100%) rename {tool_kits/base => base}/util/at_exit.cpp (100%) rename {tool_kits/base => base}/util/at_exit.h (100%) rename {tool_kits/base => base}/util/base64.cpp (100%) rename {tool_kits/base => base}/util/base64.h (100%) rename {tool_kits/base => base}/util/callback_unittest.cpp (100%) rename {tool_kits/base => base}/util/cmd_line_args.cpp (100%) rename {tool_kits/base => base}/util/cmd_line_args.h (100%) rename {tool_kits/base => base}/util/string_number_conversions.cpp (100%) rename {tool_kits/base => base}/util/string_number_conversions.h (100%) rename {tool_kits/base => base}/util/string_util.cpp (100%) rename {tool_kits/base => base}/util/string_util.h (100%) rename {tool_kits/base => base}/util/stringize_macros.h (100%) rename {tool_kits/base => base}/util/template_util.h (100%) rename {tool_kits/base => base}/util/unicode.h (100%) rename {tool_kits/base => base}/util/valuemap.h (100%) rename {tool_kits/base => base}/win32/object_watcher.cpp (100%) rename {tool_kits/base => base}/win32/object_watcher.h (100%) rename {tool_kits/base => base}/win32/path_util.cpp (100%) rename {tool_kits/base => base}/win32/path_util.h (100%) rename {tool_kits/base => base}/win32/platform_string_util.cpp (100%) rename {tool_kits/base => base}/win32/platform_string_util.h (100%) rename {tool_kits/base => base}/win32/scoped_win_handle.h (100%) rename {tool_kits/base => base}/win32/security_util.cpp (100%) rename {tool_kits/base => base}/win32/security_util.h (100%) rename {tool_kits/base => base}/win32/shared_memory.cpp (100%) rename {tool_kits/base => base}/win32/shared_memory.h (100%) rename {tool_kits/base => base}/win32/win_util.cpp (100%) rename {tool_kits/base => base}/win32/win_util.h (100%) rename {tool_kits/build => build}/build_config.h (100%) rename {tool_kits/build => build}/stdafx.cpp (100%) rename {tool_kits/build => build}/stdafx.h (100%) rename {tool_kits/build => build}/uac_require_admin_win.manifest (100%) rename {tool_kits/build => build}/winsdk_config.h (100%) rename {tool_kits/build => build}/xp_style_manifest_win.h (100%) rename {tool_kits/duilib => duilib}/Animation/AnimationManager.cpp (100%) rename {tool_kits/duilib => duilib}/Animation/AnimationManager.h (100%) rename {tool_kits/duilib => duilib}/Animation/AnimationPlayer.cpp (100%) rename {tool_kits/duilib => duilib}/Animation/AnimationPlayer.h (100%) rename {tool_kits/duilib => duilib}/Box/ChildBox.cpp (100%) rename {tool_kits/duilib => duilib}/Box/ChildBox.h (100%) rename {tool_kits/duilib => duilib}/Box/HBox.cpp (100%) rename {tool_kits/duilib => duilib}/Box/HBox.h (100%) rename {tool_kits/duilib => duilib}/Box/TabBox.cpp (100%) rename {tool_kits/duilib => duilib}/Box/TabBox.h (100%) rename {tool_kits/duilib => duilib}/Box/TileBox.cpp (100%) rename {tool_kits/duilib => duilib}/Box/TileBox.h (100%) rename {tool_kits/duilib => duilib}/Box/VBox.cpp (100%) rename {tool_kits/duilib => duilib}/Box/VBox.h (100%) rename {tool_kits/duilib => duilib}/Control/Button.h (100%) rename {tool_kits/duilib => duilib}/Control/CheckBox.h (100%) rename {tool_kits/duilib => duilib}/Control/CircleProgress.cpp (96%) rename {tool_kits/duilib => duilib}/Control/CircleProgress.h (96%) rename {tool_kits/duilib => duilib}/Control/Combo.cpp (100%) rename {tool_kits/duilib => duilib}/Control/Combo.h (100%) rename {tool_kits/duilib => duilib}/Control/Label.h (100%) rename {tool_kits/duilib => duilib}/Control/List.cpp (100%) rename {tool_kits/duilib => duilib}/Control/List.h (100%) rename {tool_kits/duilib => duilib}/Control/Option.h (100%) rename {tool_kits/duilib => duilib}/Control/Progress.cpp (100%) rename {tool_kits/duilib => duilib}/Control/Progress.h (100%) rename {tool_kits/duilib => duilib}/Control/RichEdit.cpp (100%) rename {tool_kits/duilib => duilib}/Control/RichEdit.h (100%) rename {tool_kits/duilib => duilib}/Control/ScrollBar.cpp (100%) rename {tool_kits/duilib => duilib}/Control/ScrollBar.h (100%) rename {tool_kits/duilib => duilib}/Control/Slider.cpp (100%) rename {tool_kits/duilib => duilib}/Control/Slider.h (100%) rename {tool_kits/duilib => duilib}/Control/TreeView.cpp (100%) rename {tool_kits/duilib => duilib}/Control/TreeView.h (100%) rename {tool_kits/duilib => duilib}/Control/VirtualListBox.cpp (100%) rename {tool_kits/duilib => duilib}/Control/VirtualListBox.h (100%) rename {tool_kits/duilib => duilib}/Core/Box.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Box.h (100%) rename {tool_kits/duilib => duilib}/Core/Control.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Control.h (100%) rename {tool_kits/duilib => duilib}/Core/Define.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Define.h (100%) rename {tool_kits/duilib => duilib}/Core/GlobalManager.cpp (100%) rename {tool_kits/duilib => duilib}/Core/GlobalManager.h (100%) rename {tool_kits/duilib => duilib}/Core/Image.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Image.h (100%) rename {tool_kits/duilib => duilib}/Core/Markup.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Markup.h (100%) rename {tool_kits/duilib => duilib}/Core/Placeholder.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Placeholder.h (100%) rename {tool_kits/duilib => duilib}/Core/Window.cpp (100%) rename {tool_kits/duilib => duilib}/Core/Window.h (100%) rename {tool_kits/duilib => duilib}/Core/WindowBuilder.cpp (100%) rename {tool_kits/duilib => duilib}/Core/WindowBuilder.h (100%) rename {tool_kits/duilib => duilib}/Render/Bitmap.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Bitmap.h (100%) rename {tool_kits/duilib => duilib}/Render/Brush.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Brush.h (100%) rename {tool_kits/duilib => duilib}/Render/Clip.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Clip.h (100%) rename {tool_kits/duilib => duilib}/Render/Factory.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Factory.h (100%) rename {tool_kits/duilib => duilib}/Render/IRender.cpp (100%) rename {tool_kits/duilib => duilib}/Render/IRender.h (100%) rename {tool_kits/duilib => duilib}/Render/Matrix.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Matrix.h (100%) rename {tool_kits/duilib => duilib}/Render/Path.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Path.h (100%) rename {tool_kits/duilib => duilib}/Render/Pen.cpp (100%) rename {tool_kits/duilib => duilib}/Render/Pen.h (100%) rename {tool_kits/duilib => duilib}/Render/Render.cpp (97%) rename {tool_kits/duilib => duilib}/Render/Render.h (100%) rename {tool_kits/duilib => duilib}/StdAfx.cpp (100%) rename {tool_kits/duilib => duilib}/StdAfx.h (100%) rename {tool_kits/duilib => duilib}/UIlib.cpp (100%) rename {tool_kits/duilib => duilib}/UIlib.h (100%) rename {tool_kits/duilib => duilib}/Utils/ApiWrapper.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/ApiWrapper.h (100%) rename {tool_kits/duilib => duilib}/Utils/Delegate.h (100%) rename {tool_kits/duilib => duilib}/Utils/DpiManager.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/DpiManager.h (100%) rename {tool_kits/duilib => duilib}/Utils/Macros.h (100%) rename {tool_kits/duilib => duilib}/Utils/MultiLangSupport.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/MultiLangSupport.h (100%) rename {tool_kits/duilib => duilib}/Utils/OnScreenKeyboardManager.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/OnScreenKeyboardManager.h (100%) rename {tool_kits/duilib => duilib}/Utils/Shadow.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/Shadow.h (100%) rename {tool_kits/duilib => duilib}/Utils/StringUtil.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/StringUtil.h (100%) rename {tool_kits/duilib => duilib}/Utils/TimerManager.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/TimerManager.h (100%) rename {tool_kits/duilib => duilib}/Utils/UnZip.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/UnZip.h (100%) rename {tool_kits/duilib => duilib}/Utils/Utils.h (100%) rename {tool_kits/duilib => duilib}/Utils/VersionHelpers.h (100%) rename {tool_kits/duilib => duilib}/Utils/WinImplBase.cpp (100%) rename {tool_kits/duilib => duilib}/Utils/WinImplBase.h (100%) rename {tool_kits/duilib => duilib}/Utils/flash11.tlh (100%) rename {tool_kits/duilib => duilib}/duilib.sln (100%) rename {tool_kits/duilib => duilib}/duilib.vcxproj (96%) rename {tool_kits/duilib => duilib}/duilib.vcxproj.filters (97%) rename {samples => examples}/README.md (95%) rename {samples => examples}/basic/basic.ico (100%) rename {samples => examples}/basic/basic.rc (100%) rename {samples => examples}/basic/basic.vcxproj (94%) rename {samples => examples}/basic/basic.vcxproj.filters (100%) rename {samples => examples}/basic/basic_form.cpp (100%) rename {samples => examples}/basic/basic_form.h (100%) rename {samples => examples}/basic/main.cpp (93%) rename {samples => examples}/basic/main.h (100%) rename {samples => examples}/basic/resource.h (100%) rename {samples => examples}/basic/small.ico (100%) rename {samples => examples}/basic/stdafx.cpp (100%) rename {samples/layouts => examples/basic}/stdafx.h (88%) rename {samples => examples}/basic/targetver.h (100%) rename {samples => examples}/cef/cef.ico (100%) rename {samples => examples}/cef/cef.rc (100%) rename {samples => examples}/cef/cef.vcxproj (92%) rename {samples => examples}/cef/cef.vcxproj.filters (100%) rename {samples => examples}/cef/cef_form.cpp (96%) rename {samples => examples}/cef/cef_form.h (100%) rename {samples => examples}/cef/main.cpp (87%) rename {samples => examples}/cef/main.h (100%) rename {samples => examples}/cef/resource.h (100%) rename {samples => examples}/cef/small.ico (100%) rename {samples => examples}/cef/stdafx.cpp (100%) rename {samples => examples}/cef/stdafx.h (90%) rename {samples => examples}/cef/targetver.h (100%) rename {samples => examples}/controls/controls.ico (100%) rename {samples => examples}/controls/controls.rc (100%) rename {samples => examples}/controls/controls.vcxproj (93%) rename {samples => examples}/controls/controls.vcxproj.filters (100%) rename {samples => examples}/controls/controls_form.cpp (90%) rename {samples => examples}/controls/controls_form.h (100%) rename {samples => examples}/controls/main.cpp (81%) rename {samples => examples}/controls/main.h (51%) rename {samples => examples}/controls/resource.h (100%) rename {samples => examples}/controls/small.ico (100%) rename {samples => examples}/controls/stdafx.cpp (100%) rename {samples => examples}/controls/stdafx.h (89%) rename {samples => examples}/controls/targetver.h (100%) rename samples/samples.sln => examples/examples.sln (84%) rename {samples => examples}/layouts/layouts.ico (100%) rename {samples => examples}/layouts/layouts.rc (100%) rename {samples => examples}/layouts/layouts.vcxproj (94%) rename {samples => examples}/layouts/layouts.vcxproj.filters (100%) rename {samples => examples}/layouts/layouts_form.cpp (100%) rename {samples => examples}/layouts/layouts_form.h (100%) rename {samples => examples}/layouts/main.cpp (91%) rename {samples => examples}/layouts/main.h (100%) rename {samples => examples}/layouts/resource.h (100%) rename {samples => examples}/layouts/small.ico (100%) rename {samples => examples}/layouts/stdafx.cpp (100%) rename {samples/basic => examples/layouts}/stdafx.h (88%) rename {samples => examples}/layouts/targetver.h (100%) rename {samples => examples}/multi_browser/Resource.h (100%) rename {samples => examples}/multi_browser/browser/browser_box.cpp (97%) rename {samples => examples}/multi_browser/browser/browser_box.h (100%) rename {samples => examples}/multi_browser/browser/custom_layout.cpp (100%) rename {samples => examples}/multi_browser/browser/custom_layout.h (100%) rename {samples => examples}/multi_browser/browser/multi_browser_form.cpp (96%) rename {samples => examples}/multi_browser/browser/multi_browser_form.h (100%) rename {samples => examples}/multi_browser/browser/multi_browser_form_dragdrop.cpp (92%) rename {samples => examples}/multi_browser/browser/multi_browser_manager.cpp (100%) rename {samples => examples}/multi_browser/browser/multi_browser_manager.h (100%) rename {samples => examples}/multi_browser/control/browser_tab_item.cpp (100%) rename {samples => examples}/multi_browser/control/browser_tab_item.h (100%) rename {samples => examples}/multi_browser/dragdrop/bitmap_control.cpp (100%) rename {samples => examples}/multi_browser/dragdrop/bitmap_control.h (100%) rename {samples => examples}/multi_browser/dragdrop/drag_drop.cpp (100%) rename {samples => examples}/multi_browser/dragdrop/drag_drop.h (100%) rename {samples => examples}/multi_browser/dragdrop/drag_form.cpp (100%) rename {samples => examples}/multi_browser/dragdrop/drag_form.h (100%) rename {samples => examples}/multi_browser/main.cpp (74%) rename {samples => examples}/multi_browser/main.h (100%) rename {samples => examples}/multi_browser/multi_browser.ico (100%) rename {samples => examples}/multi_browser/multi_browser.rc (100%) rename {samples => examples}/multi_browser/multi_browser.vcxproj (90%) rename {samples => examples}/multi_browser/multi_browser.vcxproj.filters (100%) rename {samples => examples}/multi_browser/small.ico (100%) rename {samples => examples}/multi_browser/stdafx.cpp (100%) rename {samples => examples}/multi_browser/stdafx.h (89%) rename {samples => examples}/multi_browser/targetver.h (100%) rename {samples => examples}/multi_browser/taskbar/dwm_util.cpp (100%) rename {samples => examples}/multi_browser/taskbar/dwm_util.h (100%) rename {samples => examples}/multi_browser/taskbar/taskbar_manager.cpp (99%) rename {samples => examples}/multi_browser/taskbar/taskbar_manager.h (100%) rename {samples => examples}/richlist/item.cpp (80%) rename {samples => examples}/richlist/item.h (100%) rename {samples => examples}/richlist/main.cpp (90%) rename {samples => examples}/richlist/main.h (100%) rename {samples => examples}/richlist/resource.h (100%) rename {samples => examples}/richlist/richlist.ico (100%) rename {samples => examples}/richlist/richlist.rc (100%) rename {samples => examples}/richlist/richlist.vcxproj (93%) rename {samples => examples}/richlist/richlist.vcxproj.filters (100%) rename {samples => examples}/richlist/richlist_form.cpp (100%) rename {samples => examples}/richlist/richlist_form.h (100%) rename {samples => examples}/richlist/small.ico (100%) rename {samples => examples}/richlist/stdafx.cpp (100%) rename {samples => examples}/richlist/stdafx.h (89%) rename {samples => examples}/richlist/targetver.h (100%) rename {samples => examples}/virtualbox/Resource.h (100%) rename {samples => examples}/virtualbox/VirtualTileBox.cpp (100%) rename {samples => examples}/virtualbox/VirtualTileBox.h (97%) rename {samples => examples}/virtualbox/item.cpp (84%) rename {samples => examples}/virtualbox/item.h (100%) rename {samples => examples}/virtualbox/main.cpp (90%) rename {samples => examples}/virtualbox/main.h (100%) rename {samples => examples}/virtualbox/main_form.cpp (100%) rename {samples => examples}/virtualbox/main_form.h (100%) rename {samples => examples}/virtualbox/provider.cpp (91%) rename {samples => examples}/virtualbox/provider.h (89%) rename {samples => examples}/virtualbox/small.ico (100%) rename {samples => examples}/virtualbox/stdafx.cpp (100%) rename {samples => examples}/virtualbox/stdafx.h (90%) rename {samples => examples}/virtualbox/targetver.h (100%) rename {samples => examples}/virtualbox/virtualbox.filters (100%) rename {samples => examples}/virtualbox/virtualbox.ico (100%) rename {samples => examples}/virtualbox/virtualbox.rc (100%) rename {samples => examples}/virtualbox/virtualbox.vcxproj (92%) delete mode 100644 tool_kits/shared/base.h delete mode 100644 tool_kits/shared/closure.cpp delete mode 100644 tool_kits/shared/closure.h delete mode 100644 tool_kits/shared/cmd_line.cpp delete mode 100644 tool_kits/shared/cmd_line.h delete mode 100644 tool_kits/shared/db_helper.cpp delete mode 100644 tool_kits/shared/db_helper.h delete mode 100644 tool_kits/shared/image_ole_i.c delete mode 100644 tool_kits/shared/image_ole_i.h delete mode 100644 tool_kits/shared/ipc_manager.cpp delete mode 100644 tool_kits/shared/ipc_manager.h delete mode 100644 tool_kits/shared/log.cpp delete mode 100644 tool_kits/shared/log.h delete mode 100644 tool_kits/shared/misc_thread.cpp delete mode 100644 tool_kits/shared/misc_thread.h delete mode 100644 tool_kits/shared/pin_yin_helper.cpp delete mode 100644 tool_kits/shared/pin_yin_helper.h delete mode 100644 tool_kits/shared/ring.cpp delete mode 100644 tool_kits/shared/ring.h delete mode 100644 tool_kits/shared/shared.h delete mode 100644 tool_kits/shared/shared.vcxproj delete mode 100644 tool_kits/shared/shared.vcxproj.filters delete mode 100644 tool_kits/shared/stdafx.cpp delete mode 100644 tool_kits/shared/stdafx.h delete mode 100644 tool_kits/shared/templated_object_factory.h delete mode 100644 tool_kits/shared/threads.h delete mode 100644 tool_kits/shared/tool.cpp delete mode 100644 tool_kits/shared/tool.h delete mode 100644 tool_kits/shared/utf8_file_util.cpp delete mode 100644 tool_kits/shared/utf8_file_util.h delete mode 100644 tool_kits/shared/util.cpp delete mode 100644 tool_kits/shared/util.h delete mode 100644 tool_kits/shared/xml_util.cpp delete mode 100644 tool_kits/shared/xml_util.h delete mode 100644 tool_kits/shared/zoom_image.cpp delete mode 100644 tool_kits/shared/zoom_image.h rename {tool_kits/ui_components => ui_components}/cef_control/app/cef_js_bridge.cpp (98%) rename {tool_kits/ui_components => ui_components}/cef_control/app/cef_js_bridge.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/client_app.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/client_app.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/client_app_browser.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/client_app_render.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/ipc_string_define.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/js_handler.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/app/js_handler.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control_base.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control_base.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control_base_ui.cpp (97%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control_event.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_control_ui.cpp (99%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_native_control.cpp (98%) rename {tool_kits/ui_components => ui_components}/cef_control/control/cef_native_control.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/handler/browser_handler.cpp (89%) rename {tool_kits/ui_components => ui_components}/cef_control/handler/browser_handler.h (99%) rename {tool_kits/ui_components => ui_components}/cef_control/manager/cef_manager.cpp (96%) rename {tool_kits/ui_components => ui_components}/cef_control/manager/cef_manager.h (100%) rename {tool_kits/shared => ui_components/cef_control/util}/auto_unregister.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/util/memory_dc.cpp (100%) rename {tool_kits/ui_components => ui_components}/cef_control/util/memory_dc.h (100%) rename {tool_kits/ui_components => ui_components}/cef_control/util/util.h (100%) rename {tool_kits/ui_components => ui_components}/menu/ui_menu.cpp (100%) rename {tool_kits/ui_components => ui_components}/menu/ui_menu.h (100%) rename {tool_kits/ui_components => ui_components}/modal_wnd/async_do_modal.cpp (100%) rename {tool_kits/ui_components => ui_components}/modal_wnd/async_do_modal.h (100%) rename {tool_kits/ui_components => ui_components}/modal_wnd/async_modal_runner.cpp (95%) rename {tool_kits/ui_components => ui_components}/modal_wnd/async_modal_runner.h (100%) rename {tool_kits/ui_components => ui_components}/modal_wnd/file_dialog_ex.cpp (96%) rename {tool_kits/ui_components => ui_components}/modal_wnd/file_dialog_ex.h (99%) rename {tool_kits/ui_components => ui_components}/modal_wnd/modal_wnd_base.h (100%) rename {tool_kits/ui_components => ui_components}/msgbox/msgbox.cpp (97%) rename {tool_kits/ui_components => ui_components}/msgbox/msgbox.h (100%) rename {tool_kits/ui_components => ui_components}/shadow_wnd/shadow_wnd.cpp (100%) rename {tool_kits/ui_components => ui_components}/shadow_wnd/shadow_wnd.h (100%) rename {tool_kits/ui_components => ui_components}/stdafx.cpp (100%) rename {tool_kits/ui_components => ui_components}/stdafx.h (92%) rename {tool_kits/ui_components => ui_components}/targetver.h (100%) rename {tool_kits/ui_components => ui_components}/toast/toast.cpp (97%) rename {tool_kits/ui_components => ui_components}/toast/toast.h (100%) rename {tool_kits/ui_components => ui_components}/ui_cef_control.h (100%) rename {tool_kits/ui_components => ui_components}/ui_components.h (100%) rename {tool_kits/ui_components => ui_components}/ui_components.vcxproj (87%) rename {tool_kits/ui_components => ui_components}/ui_components.vcxproj.filters (98%) rename {tool_kits/ui_components => ui_components}/windows_manager/window_ex.cpp (100%) rename {tool_kits/ui_components => ui_components}/windows_manager/window_ex.h (100%) rename {tool_kits/ui_components => ui_components}/windows_manager/windows_manager.cpp (94%) rename {tool_kits/ui_components => ui_components}/windows_manager/windows_manager.h (100%) diff --git a/README.md b/README.md index a9201c8a..ba113804 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ NIM Duilib 包含了一整套桌面软件的开发部件,与其说这是一个 git clone https://github.com/netease-im/NIM_Duilib_Framework ``` -进入 `NIM_Duilib_Framework/samples` 目录,使用 Visual Studio 2013 Update 5 以上版本 IDE 打开 `samples.sln`,按下 F7 即可编译所有示例程序 +进入 `NIM_Duilib_Framework/examples` 目录,使用 Visual Studio 2013 Update 5 以上版本 IDE 打开 `examples.sln`,按下 F7 即可编译所有示例程序 ## 文档 @@ -38,19 +38,17 @@ git clone https://github.com/netease-im/NIM_Duilib_Framework ## 目录 +├─`base` 基础类库 ├─`bin` 各个示例程序输出目录,包含预设的皮肤和语言文件以及 CEF 依赖 ├─`docs` duilib 接口的说明文档 +├─`duilib` duilib 核心代码,依赖 base 但不依赖 shared ├─`libs` 静态库编译后的输出目录,包含预设的一些 CEF 组件静态库 -├─`samples` 各类示例程序 +├─`examples` 各类示例程序源代码 ├─`third_party` 第三方库,目前仅有 cef_control 有依赖 -├─`toolkits` -│ ├─`base` 基础类库 -│ ├─`duilib` duilib 核心代码,依赖 base 但不依赖 shared -│ ├─`shared` 包含一些工具的封装,如命令行解析、日志、路径处理等 -│ ├─`ui_components` 基于 duilib 封装的常用组件库如 `msgbox`、`toast`、`cef_control` 等 +├─`ui_components` 基于 duilib 封装的常用组件库如 `msgbox`、`toast`、`cef_control` 等 ## 交流 - - 遇到问题:欢迎查看我们整理过的[中文文档](docs/SUMMARY.md)参考[示例程序](samples/README.md)来帮助你解决疑惑 + - 遇到问题:欢迎查看我们整理过的[中文文档](docs/SUMMARY.md)参考[示例程序](examples/README.md)来帮助你解决疑惑 - 提交缺陷:在确保使用最新版本依然存在问题时请尽量以简洁的语言描述清楚复现该问题的步骤并提交 issue - 功能建议:如果你有什么好的想法或者提案,欢迎提交 issue 与我们交流 diff --git a/README_en-US.md b/README_en-US.md index 66bd5587..9169f4f2 100644 --- a/README_en-US.md +++ b/README_en-US.md @@ -29,7 +29,7 @@ Clone the repo into your disk. git clone https://github.com/netease-im/NIM_Duilib_Framework ``` -Enter the `NIM_Duilib_Framework/samples` directory,Open `samples.sln` with Visual Studio 2013 Update 5 or higher ,press `F7` to compile all projects. +Enter the `NIM_Duilib_Framework/examples` directory,Open `examples.sln` with Visual Studio 2013 Update 5 or higher ,press `F7` to compile all projects. ## Documentation @@ -38,19 +38,17 @@ Enter the `NIM_Duilib_Framework/samples` directory,Open `samples.sln` with Vis ## Structure -├─`bin` Samples output directories,include skin and language files and CEF dependencies. +├─`base` Base libraries. +├─`bin` Examples output directories,include skin and language files and CEF dependencies. ├─`docs` Documentation of Duilib. +├─`duilib` Duilib core, depend on base project. ├─`libs` Static library output directories, include CEF static library. -├─`samples` Samples of Duilib. +├─`examples` Examples of Duilib. ├─`third_party` Third party for CEF. -├─`toolkits` -│ ├─`base` Base libraries. -│ ├─`duilib` Duilib core, depend on base project. -│ ├─`shared` Utils, such as logs/string/path utils. -│ ├─`ui_components` UI components based on Duilib, such as `msgbox`,`toast`,`cef_control` +├─`ui_components` UI components based on Duilib, such as `msgbox`,`toast`,`cef_control` ## Communication - - Question: Read the [Documentation](docs/SUMMARY.md) and [Samples code](samples/README.md) to help you. + - Question: Read the [Documentation](docs/SUMMARY.md) and [Examples code](examples/README.md) to help you. - Report: File a bug in GitHub issues. - Suggestion: Request a new feature in Github issues. diff --git a/tool_kits/base/base.h b/base/base.h similarity index 100% rename from tool_kits/base/base.h rename to base/base.h diff --git a/tool_kits/base/base.vcxproj b/base/base.vcxproj similarity index 96% rename from tool_kits/base/base.vcxproj rename to base/base.vcxproj index 8d25f940..54673877 100644 --- a/tool_kits/base/base.vcxproj +++ b/base/base.vcxproj @@ -175,28 +175,28 @@ - ..\..\libs\ + $(ProjectDir)..\libs\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d $(ProjectName)_d - ..\..\libs\x64\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\ + $(ProjectDir)..\libs\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\x64\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ diff --git a/tool_kits/base/base.vcxproj.filters b/base/base.vcxproj.filters similarity index 100% rename from tool_kits/base/base.vcxproj.filters rename to base/base.vcxproj.filters diff --git a/tool_kits/base/base_config.h b/base/base_config.h similarity index 100% rename from tool_kits/base/base_config.h rename to base/base_config.h diff --git a/tool_kits/base/base_export.h b/base/base_export.h similarity index 100% rename from tool_kits/base/base_export.h rename to base/base_export.h diff --git a/tool_kits/base/base_types.h b/base/base_types.h similarity index 100% rename from tool_kits/base/base_types.h rename to base/base_types.h diff --git a/tool_kits/base/callback/callback.h b/base/callback/callback.h similarity index 100% rename from tool_kits/base/callback/callback.h rename to base/callback/callback.h diff --git a/tool_kits/base/compiler_specific.h b/base/compiler_specific.h similarity index 100% rename from tool_kits/base/compiler_specific.h rename to base/compiler_specific.h diff --git a/tool_kits/base/encrypt/des.cpp b/base/encrypt/des.cpp similarity index 100% rename from tool_kits/base/encrypt/des.cpp rename to base/encrypt/des.cpp diff --git a/tool_kits/base/encrypt/des.h b/base/encrypt/des.h similarity index 100% rename from tool_kits/base/encrypt/des.h rename to base/encrypt/des.h diff --git a/tool_kits/base/encrypt/encrypt.h b/base/encrypt/encrypt.h similarity index 100% rename from tool_kits/base/encrypt/encrypt.h rename to base/encrypt/encrypt.h diff --git a/tool_kits/base/encrypt/encrypt_impl.h b/base/encrypt/encrypt_impl.h similarity index 100% rename from tool_kits/base/encrypt/encrypt_impl.h rename to base/encrypt/encrypt_impl.h diff --git a/tool_kits/base/error.h b/base/error.h similarity index 100% rename from tool_kits/base/error.h rename to base/error.h diff --git a/tool_kits/base/file/file_path.h b/base/file/file_path.h similarity index 100% rename from tool_kits/base/file/file_path.h rename to base/file/file_path.h diff --git a/tool_kits/base/file/file_util.cpp b/base/file/file_util.cpp similarity index 100% rename from tool_kits/base/file/file_util.cpp rename to base/file/file_util.cpp diff --git a/tool_kits/base/file/file_util.h b/base/file/file_util.h similarity index 100% rename from tool_kits/base/file/file_util.h rename to base/file/file_util.h diff --git a/tool_kits/base/file/file_util_posix.cpp b/base/file/file_util_posix.cpp similarity index 100% rename from tool_kits/base/file/file_util_posix.cpp rename to base/file/file_util_posix.cpp diff --git a/tool_kits/base/file/file_util_win.cpp b/base/file/file_util_win.cpp similarity index 100% rename from tool_kits/base/file/file_util_win.cpp rename to base/file/file_util_win.cpp diff --git a/tool_kits/base/framework/default_message_pump.cpp b/base/framework/default_message_pump.cpp similarity index 100% rename from tool_kits/base/framework/default_message_pump.cpp rename to base/framework/default_message_pump.cpp diff --git a/tool_kits/base/framework/default_message_pump.h b/base/framework/default_message_pump.h similarity index 100% rename from tool_kits/base/framework/default_message_pump.h rename to base/framework/default_message_pump.h diff --git a/tool_kits/base/framework/message_loop.cpp b/base/framework/message_loop.cpp similarity index 100% rename from tool_kits/base/framework/message_loop.cpp rename to base/framework/message_loop.cpp diff --git a/tool_kits/base/framework/message_loop.h b/base/framework/message_loop.h similarity index 100% rename from tool_kits/base/framework/message_loop.h rename to base/framework/message_loop.h diff --git a/tool_kits/base/framework/message_loop_proxy.cpp b/base/framework/message_loop_proxy.cpp similarity index 100% rename from tool_kits/base/framework/message_loop_proxy.cpp rename to base/framework/message_loop_proxy.cpp diff --git a/tool_kits/base/framework/message_loop_proxy.h b/base/framework/message_loop_proxy.h similarity index 100% rename from tool_kits/base/framework/message_loop_proxy.h rename to base/framework/message_loop_proxy.h diff --git a/tool_kits/base/framework/message_pump.cpp b/base/framework/message_pump.cpp similarity index 100% rename from tool_kits/base/framework/message_pump.cpp rename to base/framework/message_pump.cpp diff --git a/tool_kits/base/framework/message_pump.h b/base/framework/message_pump.h similarity index 100% rename from tool_kits/base/framework/message_pump.h rename to base/framework/message_pump.h diff --git a/tool_kits/base/framework/observer_list.h b/base/framework/observer_list.h similarity index 100% rename from tool_kits/base/framework/observer_list.h rename to base/framework/observer_list.h diff --git a/tool_kits/base/framework/readme.txt b/base/framework/readme.txt similarity index 100% rename from tool_kits/base/framework/readme.txt rename to base/framework/readme.txt diff --git a/tool_kits/base/framework/task.h b/base/framework/task.h similarity index 100% rename from tool_kits/base/framework/task.h rename to base/framework/task.h diff --git a/tool_kits/base/framework/win_io_message_pump.cpp b/base/framework/win_io_message_pump.cpp similarity index 100% rename from tool_kits/base/framework/win_io_message_pump.cpp rename to base/framework/win_io_message_pump.cpp diff --git a/tool_kits/base/framework/win_io_message_pump.h b/base/framework/win_io_message_pump.h similarity index 100% rename from tool_kits/base/framework/win_io_message_pump.h rename to base/framework/win_io_message_pump.h diff --git a/tool_kits/base/framework/win_message_pump.cpp b/base/framework/win_message_pump.cpp similarity index 100% rename from tool_kits/base/framework/win_message_pump.cpp rename to base/framework/win_message_pump.cpp diff --git a/tool_kits/base/framework/win_message_pump.h b/base/framework/win_message_pump.h similarity index 100% rename from tool_kits/base/framework/win_message_pump.h rename to base/framework/win_message_pump.h diff --git a/tool_kits/base/framework/win_ui_message_pump.cpp b/base/framework/win_ui_message_pump.cpp similarity index 100% rename from tool_kits/base/framework/win_ui_message_pump.cpp rename to base/framework/win_ui_message_pump.cpp diff --git a/tool_kits/base/framework/win_ui_message_pump.h b/base/framework/win_ui_message_pump.h similarity index 100% rename from tool_kits/base/framework/win_ui_message_pump.h rename to base/framework/win_ui_message_pump.h diff --git a/tool_kits/base/hardware/cpu.cpp b/base/hardware/cpu.cpp similarity index 100% rename from tool_kits/base/hardware/cpu.cpp rename to base/hardware/cpu.cpp diff --git a/tool_kits/base/hardware/cpu.h b/base/hardware/cpu.h similarity index 100% rename from tool_kits/base/hardware/cpu.h rename to base/hardware/cpu.h diff --git a/tool_kits/base/macros.h b/base/macros.h similarity index 100% rename from tool_kits/base/macros.h rename to base/macros.h diff --git a/tool_kits/base/memory/blockbuffer.h b/base/memory/blockbuffer.h similarity index 100% rename from tool_kits/base/memory/blockbuffer.h rename to base/memory/blockbuffer.h diff --git a/tool_kits/base/memory/deleter.h b/base/memory/deleter.h similarity index 100% rename from tool_kits/base/memory/deleter.h rename to base/memory/deleter.h diff --git a/tool_kits/base/memory/lazy_instance.h b/base/memory/lazy_instance.h similarity index 100% rename from tool_kits/base/memory/lazy_instance.h rename to base/memory/lazy_instance.h diff --git a/tool_kits/base/memory/singleton.h b/base/memory/singleton.h similarity index 100% rename from tool_kits/base/memory/singleton.h rename to base/memory/singleton.h diff --git a/tool_kits/base/network/network_util.cpp b/base/network/network_util.cpp similarity index 100% rename from tool_kits/base/network/network_util.cpp rename to base/network/network_util.cpp diff --git a/tool_kits/base/network/network_util.h b/base/network/network_util.h similarity index 100% rename from tool_kits/base/network/network_util.h rename to base/network/network_util.h diff --git a/tool_kits/base/network/nio_base.h b/base/network/nio_base.h similarity index 100% rename from tool_kits/base/network/nio_base.h rename to base/network/nio_base.h diff --git a/tool_kits/base/port.h b/base/port.h similarity index 100% rename from tool_kits/base/port.h rename to base/port.h diff --git a/tool_kits/base/synchronization/lock.h b/base/synchronization/lock.h similarity index 100% rename from tool_kits/base/synchronization/lock.h rename to base/synchronization/lock.h diff --git a/tool_kits/base/synchronization/lock_posix.cpp b/base/synchronization/lock_posix.cpp similarity index 100% rename from tool_kits/base/synchronization/lock_posix.cpp rename to base/synchronization/lock_posix.cpp diff --git a/tool_kits/base/synchronization/lock_win.cpp b/base/synchronization/lock_win.cpp similarity index 100% rename from tool_kits/base/synchronization/lock_win.cpp rename to base/synchronization/lock_win.cpp diff --git a/tool_kits/base/synchronization/semaphore.h b/base/synchronization/semaphore.h similarity index 100% rename from tool_kits/base/synchronization/semaphore.h rename to base/synchronization/semaphore.h diff --git a/tool_kits/base/synchronization/semaphore_posix.cpp b/base/synchronization/semaphore_posix.cpp similarity index 100% rename from tool_kits/base/synchronization/semaphore_posix.cpp rename to base/synchronization/semaphore_posix.cpp diff --git a/tool_kits/base/synchronization/semaphore_win.cpp b/base/synchronization/semaphore_win.cpp similarity index 100% rename from tool_kits/base/synchronization/semaphore_win.cpp rename to base/synchronization/semaphore_win.cpp diff --git a/tool_kits/base/synchronization/waitable_event.h b/base/synchronization/waitable_event.h similarity index 100% rename from tool_kits/base/synchronization/waitable_event.h rename to base/synchronization/waitable_event.h diff --git a/tool_kits/base/synchronization/waitable_event_posix.cpp b/base/synchronization/waitable_event_posix.cpp similarity index 100% rename from tool_kits/base/synchronization/waitable_event_posix.cpp rename to base/synchronization/waitable_event_posix.cpp diff --git a/tool_kits/base/synchronization/waitable_event_win.cpp b/base/synchronization/waitable_event_win.cpp similarity index 100% rename from tool_kits/base/synchronization/waitable_event_win.cpp rename to base/synchronization/waitable_event_win.cpp diff --git a/tool_kits/base/third_party/chrome/atomicops.h b/base/third_party/chrome/atomicops.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops.h rename to base/third_party/chrome/atomicops.h diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_arm_gcc.h b/base/third_party/chrome/atomicops_internals_arm_gcc.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_arm_gcc.h rename to base/third_party/chrome/atomicops_internals_arm_gcc.h diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_atomicword_compat.h b/base/third_party/chrome/atomicops_internals_atomicword_compat.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_atomicword_compat.h rename to base/third_party/chrome/atomicops_internals_atomicword_compat.h diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_x86_gcc.cc b/base/third_party/chrome/atomicops_internals_x86_gcc.cc similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_x86_gcc.cc rename to base/third_party/chrome/atomicops_internals_x86_gcc.cc diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_x86_gcc.h b/base/third_party/chrome/atomicops_internals_x86_gcc.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_x86_gcc.h rename to base/third_party/chrome/atomicops_internals_x86_gcc.h diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_x86_macosx.h b/base/third_party/chrome/atomicops_internals_x86_macosx.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_x86_macosx.h rename to base/third_party/chrome/atomicops_internals_x86_macosx.h diff --git a/tool_kits/base/third_party/chrome/atomicops_internals_x86_msvc.h b/base/third_party/chrome/atomicops_internals_x86_msvc.h similarity index 100% rename from tool_kits/base/third_party/chrome/atomicops_internals_x86_msvc.h rename to base/third_party/chrome/atomicops_internals_x86_msvc.h diff --git a/tool_kits/base/third_party/convert_utf/ConvertUTF.c b/base/third_party/convert_utf/ConvertUTF.c similarity index 100% rename from tool_kits/base/third_party/convert_utf/ConvertUTF.c rename to base/third_party/convert_utf/ConvertUTF.c diff --git a/tool_kits/base/third_party/convert_utf/ConvertUTF.h b/base/third_party/convert_utf/ConvertUTF.h similarity index 100% rename from tool_kits/base/third_party/convert_utf/ConvertUTF.h rename to base/third_party/convert_utf/ConvertUTF.h diff --git a/tool_kits/base/third_party/convert_utf/readme.txt b/base/third_party/convert_utf/readme.txt similarity index 100% rename from tool_kits/base/third_party/convert_utf/readme.txt rename to base/third_party/convert_utf/readme.txt diff --git a/tool_kits/base/third_party/modp_b64/Readme.txt b/base/third_party/modp_b64/Readme.txt similarity index 100% rename from tool_kits/base/third_party/modp_b64/Readme.txt rename to base/third_party/modp_b64/Readme.txt diff --git a/tool_kits/base/third_party/modp_b64/modp_b64.cc b/base/third_party/modp_b64/modp_b64.cc similarity index 100% rename from tool_kits/base/third_party/modp_b64/modp_b64.cc rename to base/third_party/modp_b64/modp_b64.cc diff --git a/tool_kits/base/third_party/modp_b64/modp_b64.h b/base/third_party/modp_b64/modp_b64.h similarity index 100% rename from tool_kits/base/third_party/modp_b64/modp_b64.h rename to base/third_party/modp_b64/modp_b64.h diff --git a/tool_kits/base/third_party/modp_b64/modp_b64_data.h b/base/third_party/modp_b64/modp_b64_data.h similarity index 100% rename from tool_kits/base/third_party/modp_b64/modp_b64_data.h rename to base/third_party/modp_b64/modp_b64_data.h diff --git a/tool_kits/base/thread/framework_thread.cpp b/base/thread/framework_thread.cpp similarity index 100% rename from tool_kits/base/thread/framework_thread.cpp rename to base/thread/framework_thread.cpp diff --git a/tool_kits/base/thread/framework_thread.h b/base/thread/framework_thread.h similarity index 100% rename from tool_kits/base/thread/framework_thread.h rename to base/thread/framework_thread.h diff --git a/tool_kits/base/thread/thread.h b/base/thread/thread.h similarity index 100% rename from tool_kits/base/thread/thread.h rename to base/thread/thread.h diff --git a/tool_kits/base/thread/thread_local.h b/base/thread/thread_local.h similarity index 100% rename from tool_kits/base/thread/thread_local.h rename to base/thread/thread_local.h diff --git a/tool_kits/base/thread/thread_local_posix.cpp b/base/thread/thread_local_posix.cpp similarity index 100% rename from tool_kits/base/thread/thread_local_posix.cpp rename to base/thread/thread_local_posix.cpp diff --git a/tool_kits/base/thread/thread_local_win.cpp b/base/thread/thread_local_win.cpp similarity index 100% rename from tool_kits/base/thread/thread_local_win.cpp rename to base/thread/thread_local_win.cpp diff --git a/tool_kits/base/thread/thread_manager.cpp b/base/thread/thread_manager.cpp similarity index 100% rename from tool_kits/base/thread/thread_manager.cpp rename to base/thread/thread_manager.cpp diff --git a/tool_kits/base/thread/thread_manager.h b/base/thread/thread_manager.h similarity index 95% rename from tool_kits/base/thread/thread_manager.h rename to base/thread/thread_manager.h index 91cca119..75b1ceda 100644 --- a/tool_kits/base/thread/thread_manager.h +++ b/base/thread/thread_manager.h @@ -9,6 +9,16 @@ #include "base/thread/framework_thread.h" #include "base/memory/singleton.h" +/** + * 一些预定义的线程 ID 值,提供开发者使用 + */ +enum ThreadIds +{ + kThreadMain, + kThreadDatabase, + kThreadGlobalMisc, +}; + namespace nbase { class MessageLoop; diff --git a/tool_kits/base/thread/thread_posix.cpp b/base/thread/thread_posix.cpp similarity index 100% rename from tool_kits/base/thread/thread_posix.cpp rename to base/thread/thread_posix.cpp diff --git a/tool_kits/base/thread/thread_win.cpp b/base/thread/thread_win.cpp similarity index 100% rename from tool_kits/base/thread/thread_win.cpp rename to base/thread/thread_win.cpp diff --git a/tool_kits/base/time/time.cpp b/base/time/time.cpp similarity index 100% rename from tool_kits/base/time/time.cpp rename to base/time/time.cpp diff --git a/tool_kits/base/time/time.h b/base/time/time.h similarity index 100% rename from tool_kits/base/time/time.h rename to base/time/time.h diff --git a/tool_kits/base/time/time_posix.cpp b/base/time/time_posix.cpp similarity index 100% rename from tool_kits/base/time/time_posix.cpp rename to base/time/time_posix.cpp diff --git a/tool_kits/base/time/time_win.cpp b/base/time/time_win.cpp similarity index 100% rename from tool_kits/base/time/time_win.cpp rename to base/time/time_win.cpp diff --git a/tool_kits/base/util/at_exit.cpp b/base/util/at_exit.cpp similarity index 100% rename from tool_kits/base/util/at_exit.cpp rename to base/util/at_exit.cpp diff --git a/tool_kits/base/util/at_exit.h b/base/util/at_exit.h similarity index 100% rename from tool_kits/base/util/at_exit.h rename to base/util/at_exit.h diff --git a/tool_kits/base/util/base64.cpp b/base/util/base64.cpp similarity index 100% rename from tool_kits/base/util/base64.cpp rename to base/util/base64.cpp diff --git a/tool_kits/base/util/base64.h b/base/util/base64.h similarity index 100% rename from tool_kits/base/util/base64.h rename to base/util/base64.h diff --git a/tool_kits/base/util/callback_unittest.cpp b/base/util/callback_unittest.cpp similarity index 100% rename from tool_kits/base/util/callback_unittest.cpp rename to base/util/callback_unittest.cpp diff --git a/tool_kits/base/util/cmd_line_args.cpp b/base/util/cmd_line_args.cpp similarity index 100% rename from tool_kits/base/util/cmd_line_args.cpp rename to base/util/cmd_line_args.cpp diff --git a/tool_kits/base/util/cmd_line_args.h b/base/util/cmd_line_args.h similarity index 100% rename from tool_kits/base/util/cmd_line_args.h rename to base/util/cmd_line_args.h diff --git a/tool_kits/base/util/string_number_conversions.cpp b/base/util/string_number_conversions.cpp similarity index 100% rename from tool_kits/base/util/string_number_conversions.cpp rename to base/util/string_number_conversions.cpp diff --git a/tool_kits/base/util/string_number_conversions.h b/base/util/string_number_conversions.h similarity index 100% rename from tool_kits/base/util/string_number_conversions.h rename to base/util/string_number_conversions.h diff --git a/tool_kits/base/util/string_util.cpp b/base/util/string_util.cpp similarity index 100% rename from tool_kits/base/util/string_util.cpp rename to base/util/string_util.cpp diff --git a/tool_kits/base/util/string_util.h b/base/util/string_util.h similarity index 100% rename from tool_kits/base/util/string_util.h rename to base/util/string_util.h diff --git a/tool_kits/base/util/stringize_macros.h b/base/util/stringize_macros.h similarity index 100% rename from tool_kits/base/util/stringize_macros.h rename to base/util/stringize_macros.h diff --git a/tool_kits/base/util/template_util.h b/base/util/template_util.h similarity index 100% rename from tool_kits/base/util/template_util.h rename to base/util/template_util.h diff --git a/tool_kits/base/util/unicode.h b/base/util/unicode.h similarity index 100% rename from tool_kits/base/util/unicode.h rename to base/util/unicode.h diff --git a/tool_kits/base/util/valuemap.h b/base/util/valuemap.h similarity index 100% rename from tool_kits/base/util/valuemap.h rename to base/util/valuemap.h diff --git a/tool_kits/base/win32/object_watcher.cpp b/base/win32/object_watcher.cpp similarity index 100% rename from tool_kits/base/win32/object_watcher.cpp rename to base/win32/object_watcher.cpp diff --git a/tool_kits/base/win32/object_watcher.h b/base/win32/object_watcher.h similarity index 100% rename from tool_kits/base/win32/object_watcher.h rename to base/win32/object_watcher.h diff --git a/tool_kits/base/win32/path_util.cpp b/base/win32/path_util.cpp similarity index 100% rename from tool_kits/base/win32/path_util.cpp rename to base/win32/path_util.cpp diff --git a/tool_kits/base/win32/path_util.h b/base/win32/path_util.h similarity index 100% rename from tool_kits/base/win32/path_util.h rename to base/win32/path_util.h diff --git a/tool_kits/base/win32/platform_string_util.cpp b/base/win32/platform_string_util.cpp similarity index 100% rename from tool_kits/base/win32/platform_string_util.cpp rename to base/win32/platform_string_util.cpp diff --git a/tool_kits/base/win32/platform_string_util.h b/base/win32/platform_string_util.h similarity index 100% rename from tool_kits/base/win32/platform_string_util.h rename to base/win32/platform_string_util.h diff --git a/tool_kits/base/win32/scoped_win_handle.h b/base/win32/scoped_win_handle.h similarity index 100% rename from tool_kits/base/win32/scoped_win_handle.h rename to base/win32/scoped_win_handle.h diff --git a/tool_kits/base/win32/security_util.cpp b/base/win32/security_util.cpp similarity index 100% rename from tool_kits/base/win32/security_util.cpp rename to base/win32/security_util.cpp diff --git a/tool_kits/base/win32/security_util.h b/base/win32/security_util.h similarity index 100% rename from tool_kits/base/win32/security_util.h rename to base/win32/security_util.h diff --git a/tool_kits/base/win32/shared_memory.cpp b/base/win32/shared_memory.cpp similarity index 100% rename from tool_kits/base/win32/shared_memory.cpp rename to base/win32/shared_memory.cpp diff --git a/tool_kits/base/win32/shared_memory.h b/base/win32/shared_memory.h similarity index 100% rename from tool_kits/base/win32/shared_memory.h rename to base/win32/shared_memory.h diff --git a/tool_kits/base/win32/win_util.cpp b/base/win32/win_util.cpp similarity index 100% rename from tool_kits/base/win32/win_util.cpp rename to base/win32/win_util.cpp diff --git a/tool_kits/base/win32/win_util.h b/base/win32/win_util.h similarity index 100% rename from tool_kits/base/win32/win_util.h rename to base/win32/win_util.h diff --git a/tool_kits/build/build_config.h b/build/build_config.h similarity index 100% rename from tool_kits/build/build_config.h rename to build/build_config.h diff --git a/tool_kits/build/stdafx.cpp b/build/stdafx.cpp similarity index 100% rename from tool_kits/build/stdafx.cpp rename to build/stdafx.cpp diff --git a/tool_kits/build/stdafx.h b/build/stdafx.h similarity index 100% rename from tool_kits/build/stdafx.h rename to build/stdafx.h diff --git a/tool_kits/build/uac_require_admin_win.manifest b/build/uac_require_admin_win.manifest similarity index 100% rename from tool_kits/build/uac_require_admin_win.manifest rename to build/uac_require_admin_win.manifest diff --git a/tool_kits/build/winsdk_config.h b/build/winsdk_config.h similarity index 100% rename from tool_kits/build/winsdk_config.h rename to build/winsdk_config.h diff --git a/tool_kits/build/xp_style_manifest_win.h b/build/xp_style_manifest_win.h similarity index 100% rename from tool_kits/build/xp_style_manifest_win.h rename to build/xp_style_manifest_win.h diff --git a/docs/PREVIEW.gif b/docs/PREVIEW.gif index 890a7182dc79abf53eabec82d0e0abfd3374cfff..9e82d53eb7adda524a0068aeccdbd754d20ae9fb 100644 GIT binary patch literal 201727 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/m*pU@f}#+7T9;13^t?FUtfo5VIP@n8~*r^ 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

tycZZ8f1;jPjy4Kj^CduD*wHhzdtue{B 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 literal 92566 zcmd3sRZtwxw(bWXoRHw|?ykWdLV`ok;O-g-&I}%OaCdiicM0z9?m9XDz4tv;=hk_= zFZWkpb*<{BRbSQWUaPBR5uT-@B;eB7TE`AwC0yu}rM^XO(t7-kr|CHRHKMfFl4!s_PY+UDxo#`^lk=H}+kzu4X0-QV0h z-aR-zJUsdjr~l^c?Ckvf{Nm!`@;_YPUH+q+`~TL%{|WxH|NpRF-Q3;W-2PA9{x^4b zclZCz!@qfae0=&h&;N_3mzS%zw>>Cy8w%ZmLdRdAz30%t=ko^- z`yF!tmZziYx4mNM zb}n=~`yah;Wj}9ZKdfXv%_qN(M?w38puPUko?q|Xzh1ihDgL6WNUN(!imOUWZea#DY*r6zYp-^5o(f z^+)SV{uHU^DP$-#l+KrF*IBQRHk2u+q5cTh&{iv|ud`e))*oxESZ#9L9nDZ|s$6gL zyggYTYpUAp@`pnuRcfx@?gM>fG8k{J*&Vc;IVmquJ?joOODS;cE37-5%9e~ERc@_6 z{!^@0W-!s(aJpFiV=Pm-t?_)d+2wR&qOIw2vpWcttwNKNYZN#{*(lLN)t3$>SFY?9 zCtMY78tOmd;{uPwMCMAeGWb}b*8{EDK8xQf(WL57Hb584lB37px95JP#NOaB*LN zrUaSDmV4szjLT~-=EB;>2^tGxeR(mH3P#uDAPsrUXsm4%TZz3MeAAP=|$VsAk$_0-Ga?!$J0T? zW&O;gSYIWt(e^-=6oz6sGdzP=q}HI8i1~J$d(rlGg8#7mc2fB9%w-b4N|ghRvww>%QTOSHj3^M- zGbLxF_Um9DuN*NP8m>ip?*hGRR4=ko7|X+wX|mnJvSm@l!-{Rw`NOK?5X!RJ` zy60iVBXr~E)M>5l6>Dh zuFHD^a()_C?{RTa<;zKV)5Xha^$_dpS^c8@>v{8G*DWk{8n8C|UayMEbdzk#VNvJa%gJTb_9XmT9U`91Pg|MHMK@=VT zHg##dkhf`M!ruEft#{5J!FYOGktfj2rGDtMQJMN){UWF$@?Hi>HbWFm&7Fvj`qBLXn0 zSWZ@9HZJuppPpt|>T9=xd1y}xk(nw!`GN{gHaR@9a*2w^=%37&yQ1tlF`#NTteMP3 zfo-gek`)-iedh+AeE3+Kum>cx7Vsgen^?7JbiUI2zU;$10H_i>j{o$rL_vC5tSA(L z5T6@?_Q_w}corn`27~2^&`QGI1p2&YT%C^n$u~x3b=zy zz=<&9idYtV(yR-(VzvrXT-zZ`jxp%&Mr3tdLA3?I8IV&WswnE8m}Ey4`O3S`H|u_^ z{)AX5Qe-FoT4JVUr3dm$WkBHpSSnyB)7jF>vsTx<<~yZlwt zrXQf{5ru!{@4<#|P&mLDm!4y4XGaKo7jA}`hJHb^F%1;z*Q)c8+vUfu_D2u{VEn3Q z^LrlK!EJj=CE~9@%H0k4bMh?~wz854GaZ?ga0kIoym473f6!@Egd7l09atejPESbikQ4i#UD{fQs|02B7BS4zYV8qcL8| zz%+drmZG8K;xEwII0Q5=(_U{T&6iX`@HRv)5)PjXWI{W7mcC>R2sBbl(CY^W+rXn zoy+dgPDK}e7W@YvD^N`=rGCs~`cF$@787pD4dw3wzqr%xZ36^NUuHi}anGh)+`UFO zA5%=VE(nn9qKq%0@lj5y*ieD2AA4`k+x!`i_vfX( z8N}3^T+QL-PaE<5D+=|M#!!_oHXxuv2zt%@Q00HDa>9>iI(cE=vTQu-o_b4g@qppl z`6JNy8M@Zgjw4lIjO}ktCi($wDtHiy&4=AW@S(2jQdo4%b@&zf*r$Bqoc6kQgz@d> zZ$Z1+c;|DnD|9|9xnWKAa_<2efGIZRxLF1LzJs9s^Li5(cwY1Uyenw)b*HO}w=lzO ztL^W55D$wr&dZzED)9(^*W((??a@Y|LEjagKPT2@>R2-~xI-(|Hp#2TAY;OFhYofc#%Pf~1>+m6n1XU4!u~gT#-5)wM%3 zfg!Z?A@r6Z-)&_-of}kJ>D7+aIxde)S0>$Ek={)l?*h(^zdX6^7IU~mZ}qVp-D z8$Ys_KeAsta?mq!m_D+tICNwwa`Gv18b4~5KWa`p>Q8f|i$&B*bJW^W)W%cP7JhUe zC@P3H`oJ^#2oinL9DODiwFfdd$B((;kGa#1dGL$@KSg(dV&0ZwpieOXg4mYg7+9TH zM6Xz2N-T;M2)-p2<2e?K;5YVi6uQ7~T(95wDZdGi!*N=ElRp0@Cy1le0g(vA(R#(v zr^F%X#4#?%u|CJKBSWK^3F5hR;(5K|yZPh!TjGV6<3*3bg3s|10tr$&3BmXYGARiP zEeRap1f}N$Rf0sqR#`-D7uLNJ#NhlDk*3=W~QjO7hR;WWN-!&vSC103;X;3ebUoQXqj|knm+l^l?(; zGbBzR#fTs!!7ByQl91#Dig46PyHCj`NX->U&DTjS^hyOMrLf4G{~k`wYEB6~N+}XZ ztJg_uBuM?0oyvHe8Z(@h0Za?=OzRa$?t$-8=LCS>DUI26J1fZff_{%8hJQe^VkD@g9bhz^noKNlj z1i&p)&X&vdm&>FqTR_MVJ6c+UidXWpzd|w0ZERF=Ar*P771OM>Vnq-tyJ1~ebzFjk zAL7Q4KLaj3PAxq>DeVL0T&5O&E`xJGsX_GzepIX$^v8r7L;59GFQZomHx0n>0RYRY zm4&LYRI6c(8sK6ZaDA#ewSf-RRc|L%e+jE=QUOY3aBxOI#4%6Z(}sc4e4W-tyVph? zy(WLpnkh(4gth0!fiFbYj;772ov)hWz?M1*s2%F37}iV_Ry{N5m(Xfv##meIT07QS zvUTXaxL|ge+^mjjH!EYuRM@=g?lfNLczD>Hqo=ghnwS+HY-m+C4KDR?#EQt);U_|> z?M6!7Z|i0P`uSrCqGm9RRtjdfU!j29Pud;zns}^{5N-0NpsV$~gaCuI0)w)S$m}ND z(?;6};1d=Mj!|GB&0C&fMcf}4J#)g35rfx_P{7fg?c2V%r z0JJUNFtSTwbkO}OA5U>`;;3od+6`H(qQRpA{(CnxYSq_=++o7QFMGw^G8%-FV}RjEr~xXXcf@ZNf;6TbjqyAxi#0M@3-KCNKK zr^(T_!`h~1hIk+_e0&%*gusjyk!(xS=FRBd9U4(fT2_1zITD#}8ssAM}yvYVSN)?htetr zuGo-_&%~k_%%;x-KFN?K)5OwS<8=F2%Q$qRMLXliSk8(SNa59PNfGA5>KH0{gEHZt zjj#?y-65mZ3Anc=k7^&P)9&53nuSm&dZyms^hv@oM~cXv*R>(>4ztI0#cL(36;z~C zq>?9uc_oqgmq?&&(kx(1)=rnKqW>gmFj>0Z5dlmN8al>S~| zS;$i%$NHdQT0J%GU}#3Q%l9%E)p{OhO?pmFeiNxA?PyZ{QO^A_Ari0++2t4-z-iQANMsGzHZwa;44T0lm zM9u9*>RbsHA&{NZ)*ZU#9kz!Zm*d14mPKySd|vxF{tFYq%)T7P_0K9f;-Ybq8z$1C zm9iKA6w00=X`J$;$rpoZPCu}kO1_5uK5O)w%trb13H#lwd zJ8jN9ZMKKy0v!Lws30QxD4Q`fmLUsi^9xNqF4{=5=>NVZk?hr9$Rsr#go=9sm#x}9{;SIlRNhaQaN#wI`7@M$jU!2 z>+FN@UjWFiV85ImKy!{Z>^6Cui{6J0-&%{uno~}$@@z~Bh}PJzhhxz$tv*c`pU#^s zw1#e6uPq#J2}7$ZQCsk;E;IWtEjnZVie9mk-EJCOQTtsHd(4xp`f}RZaoP6J(e~ga z4|Au_eJGm4kGU?mJJfQY$J4q4kKf9luTW(5eqz3?E1KhIcaqGy8H1*o+3)42gE>Dx zn0`L}a|}yI4tv;V%^G{yt#YPy*bO`z+8cLDdb>M1Tk+W%@ywb!kG{*#zmpxh3qm^i z+ur-yKBBNV;xTnk5_!Upwr~9R#?0`UqbiNE8kTnpQNaX}*HOGn<+0!3W+%NH&2Um{ zeZ{M5(&YV-@v}nUmrEqACryuA6uOhtwJBwfCzy9^|4n)3sy<8Bha|%{*sN_Lm24s% z1V*EuY|tDIF5O!P!)_^MH+B7HdbB>{cbyR7VePJWmtS{PYzj3~-U*{-^_ce&VG9&p zQ|28|yrPA#=T8J*4kq6hRwqxAEZ^QfUu-FZ06pSEVu1+gq*4&oZHZ8H64BsdRp|&N z92Q;S1qo@XXc7@Wc!FyaT03~$bXWF^?uZ{tl zu?!Ke_i<|SuZ0jUSxxm9^%M0{jSAg&PdC%?_|WLe;8ft@mr4v)&khi`^$db#O0KY8 zO|e?Z*M^OOGM;=%G*XFlRhS>4=xnA-&BnBfxLka;!=5!9aG~KJDTIxdBC7k%Co@ET zK@mxG?<{8v_$*}JRkQo%OZ2-!(QCp%Y+7BQ;+xj>0O1H9Hyy?06d;)wRp*N8U}k0kPD4t0N(|TbA-MQjcaL~2s0R&TDza? zgFL)bJIvP~UvhBwPcb|3ky5Mj{+ePt4#cPw?^H6X4BG;vM6E4gWn7gCr6pZ;gD(Z)wpRTy+7peTcty<-2l!ljmxQYelZAQ*A?Q+r?_fTqQ3sNw78(^j}9U7a@oS$+&|zs^T^ z(oWA_r|o{af;*${JOFuQ{3IVSo9G}X^@acD*oz)hbKURj(0M%+7ToeO&L{i#Ys{?0 zuja{yH%&FRp?mf5PwV?eu&Cvl`sFqqC+Z)ZrRltIgtN1CF;1mXMuq z&HM<3&M7uhgb;s9xrWcY&r{Zb^z{W;kPt3Lz9IbAsqrh*fNS|{!cX*RV=Lm)8*+-l zY)mPi4j(wBnC(N9nTJgUWfFhD%TOSmqGZss*FSFj(Z!Iq3}aT0kcl;$YR~@ zTtgPhv07AjI5lWJL)&)Flo~TYS)&H|7i|OvuV*s~0;rT+1-uKhQHva4&6(H?CH@;v z|1A1vy3cvnv99FK$?&BzRoGv#-8DawpB4@(`@Yx2r|+2wmiY&+$VnqG4l9?>J{SH* z8=&k-P*6-jK>8^NVsc$3=E&m2FcA088ZIB^aETi?BP>eMdOnnJbC)9ywD*%e&B4rQ zO!2ZCOv_D8?x^N1RL;Cjzr9NZYN{ge(GQ|)Xv3fh*D5Bw6lRLggzKMqeF-KUW_?Tt z5JPqVg4tiP@xUXB5Xz*?8}(cqFM8)(g+wQKw_@oGdTthk&$-8{uJ?+%v;%^g%Bk^i z7ScAl^SXbOHDM6xuzHY0$pb$QCsZi6mwcaJ$H0{pt3QS_tu(pU#R;vUS^0ejpI9MS_GOv)-%Y(wx9`Qviy3k zm5u;oGY6k7M^pNB(IeRx-<7(YW=Z_=>SJU5e$xcX#a9$Y^^B|0<_R}sjfdZ><*-Ac znGuF&U88bymJ4l&Z?>KTLK`|ExD6d<_S%fOUv^3Bihl?Y5WDZ-1YU^KTqw8+w zGfOiH37qW%$3ATq(sbTy(En1LReittQ~jol;){;@>4g-~6_Gd=?7_Qy=I!>I;N2c1 zFKK|CywuOzF>JN1xDKsssyf8URP-~Mg623%dp<~;s{?F4j2JID!^vDa;gx<0K}@MZ zo2;=xWyZ`UY)RpbzL4`4)~;|b%blxd)+S;wVU0QHH$-%SP?#7Dm@hT`6k%40jMU8r z($L$mxc(OYA|W&) z$MW$6bhmPL_A}{8Zz|eEI9T>+tK~+jyDbBF$gUY4KFJJhI8!JH)y}WPxInVjmNI4k z;1F1A^|~dCaFspj3b2kGUfS%C3@_M$u|1(&Doeo*MH%Azv3h)f&M1dNrGn(JSZbA0 z)j-U@gt)JLskzrr^GJ^z7f%KHO3*r`(WGNE7Qb5hI!IJm%Plm1WZX6gKfv0E94F!! zxH+E^NPN|EZMSY|;xW_PS#D!~<>2q(g@`cZIXF{%ML?UryA0bXT}E&{XA1z($$E`y zbUG(Bt?jdgd5!aBJEbnBJCOa#8FCUWiT&Z#Rs;5$4iRG8*6MR{3%GxRvH{k!R86+z+2uN7iR0WW%koiG;`Gm-o`P=*8yu z2A$@ns^<|};qE?IBd;npu>wA!|~3=r_TH7b8yXYY|Y zd$wX`-hv*Z)<29q{d4k@+!PJ99-vl!BdWi{H?I~~(zuMBVrvg+_`*Ghcj;2sg?Qh^ z<}E)j_*OsJNui+{fLC}k=}AZy+lOthHf$TPpcKR9Evailr`}>j% zzE)K9@7;B-3q=!ARul`yo0*(D=8sLD)uFDjw!aNGM5esw<>9NAqI1~{>~;0SwZMlJ zHh3wlz(D-+@V3=HRHU;+RhQC7$@=Zst^jOY;J8TWD&r}W(5qt9TabWkYzV-={oMwr zS@JQ=GZ9ai17jBDeGBtM2V@E+pQNlSUE=PNh$UeH=hpI6$BR|SF+zs9O1i}kmbyPt z0Vv1CMoK%Gh@d@wOyVD11wN_w4E^Z29~LKYO%!Ah3z-)GY?XUD6HdmF5JR3sGeRB| zB;izs`d6@mUno}KwGoy`=s1rN9j^D`2R&W7M2SC_P0nXOs+Q6}y-B;hINWrXHkce} zeZ&ls!Jd5_5_w`U>AY(Zh$dxlags?*9uxpE^MY(Vlai)O z76o#3La{Sl+SmrHtDnEI61P<&?p6sfq5S2Pmn*LE!r z&3sb8y-8D#i!&77CPvb~0iW9j;RvEtek{4jXMBj7OF28k1k& z&OlPg;S8_Yw#wd>&%_rUTmwZS3gDbL}-yR*TOPqO28oiCAJRLiGO!?T~W$yd3dDMuWc zu6Kll?I=WVuvBXa0rU<;zD6q{nO1n(jz=VGT(OfeT0nW%aBsbXu6V8 zhkU2aR4|B=Wry->EhTeYE{iiJ+b9of#wZ(49_PF)`nSANOR6>rpm1)QMlKa~$!jTIjQqZgL&6B<{9w}B+%VA)?i;mni!$dd5wTN& zQB;h&F1{vZx|Vl}Hlu$W%mRs2-c?%o_c*#rp#>A18LtBD%XC3=1Y|O3hkUB7QbNSY zFYPbs?V9XoT|wG(0Al2WKQv4O{621<9)gzOJOeGLM(@Sz;4$R$i%Aaz$23qw&>MN1J@6~esE{*H_N-K;}xFZCsk+Yds1=y%-}!F$NC%L`5caxIsIKW_?a$ecnue zigP`?V|5{MeYs$LMLKb@VYR+teSLp@<6b|ed;K(MaFb?Zhi790eS=A9WY=utz-^;n zd82o3@vvayq+#PS!a%NL<9vVPBC-99=KCei<~7Y`B;4i*%jTWN<~>Wzt+f6_$mUbx zrn2*9QO4%$z~);<;!BkN`~Bu$gssIb!*%qnemN0@aovp<%#0VW{0R!T2^+VG z2Dgb9wn+}QNguY!5O>INcPMCgD0z3NWOk@EcWBIaXx*VZbfG)+NjnUMJB*DcO!jkF zKj*G|w^<)d`lGhlaCbR)SJ-KHxny>ixpukDcX=;bdE9sTlYZQ~&Gkrc3JmTFtMKwK z?2118xY^nLjJqdZSt3TeCn;l!&bcRLz9+MhEbYE0m$U~HuqWTRr--{Hn6&n&jE;J> z_XTlZ6?gwD?fy63eKnbVbIy$ud;Y%D@O4?Pi&z!?_7`~ir? z0fhYEAOisUlEs;?`4Y`m?9-utp`{7QQ4l{&ir5jtl4Yp93g)MZv?g%yI`hGXFbkfjgD_TMASZtQppH5u!@ehN?9-wIxw{| z@7<@29z>wc@WVhV=gWLB%UTEsOagzLKKwWh*v|3KlQ}V8+q0aE^ib(7@U|{-S7{{0 zpr8f_-}97(idt>?qj#USFW6wjB9?TY1T6r98Z+a!tbJ8LqGD(Lnr8#%XM^r%L!oEG znzo;_&qf>1#s<&E7tSUs&puzBO(C8`r*Y3`XzgYYga62!&uN~|8`z0E+ASgmhsU2U zBmTx2HmMCgfUcvugjVnRpCG&1Y%kTQw@J2Ep0+KVwjZ39TpfSR_CE}@3WQ9B#Gair zUYrivPcB@XAJ~two?jwfUYVa?(>l!goi7%i-)UZc2#Si;1iCD!m=Mcox(+$)Sk4`gGDB%nmDxRLcay)sE=I{h%$);Y1VHRVx-U?gu23&8&=#*I zF)lG49j90?u^i5CqtEYouRs3taVgVkJIW~5|B|SJ2bqgLNUHkDggIQjlya{mxPCY| zl8vxRj%?^!ZI=TMPai%^^wTud=99L0DF4yNt&_l~69j+fKHSqrm&;(!>*jhD>ohe! zo3SdadYW6FM)kU9Tg3+MTWTt22)i?NmKH&`4MB5wm%BYm^$kPO4HITNvn+7KzLb?s zh5d2j6uzEQc2Y#~j?IB<$Mlv2wRR`ettW+wO$)6UK>4Lo5Eh3lV4kk zUR#@9+lG7^H@$`zcX?QXYd>d@~ zdFc6b7|DHv?-bfm{5FR4zB~ML!lJGC@7uJj?>4^g?4jVFFYk*}5%X-H@t6EjwtBD@deeM-Hd;gqs*%vLwlqX~>! zwYJAtL19>Q>fI3IK2!o;d&o%Kz&JV)r-ALbf6k5+5EK79@cprab6^8&_QaV$0u%q#U)L#1}74=iiV&WE!VHh7glFuNwC+3`vu9*2VO`&RcI z`%X9xH)MNwCNdNSOs7_9`^`%@eN9U{Yj6r#|1fjsCsS)NJUz zX}IFN?TbrULB%WI)mCrV$E-BIT*NLsBhTjSAN>d)I9Qn{Z1wlySqMoy<~X+npRRU> z;b78k%*M#rZ5~l=KN-xgX`cYBYW1&Q-(0_KT7JG}}5&=_0k z^P(E}wpyg?9?R%sospGC8e#5k~nHHxZ2c%Zl z88TUl58^a2DK72|NhuC;ZbQ|Y%H3w#Tc+$qwj(M8XVs&eX>{uC@~=!85nD(^0fVrX zwi>RKsCEepq_65VJ0_>}ZRf3Htoazv4dMpG{B#nof3|f=yHKtCXWWUrr~{w{?}R_u zdy!*IO}(>f=vI6RM#5H%TdhN;S|-gCD}=So12Jp0uV2hlyR6$+DXF>$>>B{3Xoc!t z?yEI^DbsHW{5Zosn)V9^UR+6nbT6zk(nNOY(xXvERTz}o3J_zITbo|>amWW5d~tL;9K<$pSc@yv1NVsq98(NFXg5`2k9>s?qE%Wxt@drZ^6^bk8op_P%QcV2 zBj{PpmLypR|8A5G&ZQ)`kywTpe2Jr~gmD<2WFq{p>w&J1wpc+21!;bQia)5H*(;P( z+SwFw$NCCJT=UY+G`@wP+1gaOX?Uy-v}$sV9?1v@4{5pUG4n^{ze1-j2435*Z)b%3 zL>{6gp|R*A`mrs4*t6~RKeE`01;C?olf$I2aC3;hU5`!0o?uM1=Jz*=w%`o1uNpiJ zGgs5t`hs;E%Ji;LnmH=2MwLBB6*4xeX<2z31GH;r)2F4{8kf%kYG<;ynIRn?;-K;V)b$FkJ8(Uq%$G3;S#!>onAxe&cTHxSB}wIa1s|#e+PxU#WFXNud6a z#_#h8%FIGkq_@SgGAuPwes5IdyN`pf?^t%#df8Z|W)gM1MBY?y`5 zI+UBtVsMPp0oe7~h$8e7 zA4{i0IO}sTa4dzW7{8K)-^LZE)5~y`&O|xSrQuA_hzK#x{*J59r*)&V*lLlsiM!2b z^<_}{!KgO+(=~G>ok7K=^iM`-ec|vPgK7}tTu$R3Xwf1yc!*#2NzU3SNAXpB7Mh#CE~a?{w<`Of0FZl;$Q z*ih%BA@3MpwzkjN)M7z!VeVw5*3aM6y3oPuE|01|ukctDHp1%J$Fy;6?cCOsP~_nu zl{;Zee$7}=x@<;Vqe@%N`2_Ztr z7K7ipN^qs#>ekD-g2g8{M3U6*Mb54A-Cf;6l7)0UO~8v#3j4#>En#7pJNY(A#K3=o zV5V$226KrU!QD0uiP{(Z(jwHHs?2A;W0#^;dP{;AvImg3SHmG185i?Eb-z3M`(&i= zVh%m==|%^|WyP6bay<_sR9|b++wL-1wDifU+`y>3?F#(Si4kXIwJGtzMapYoF*8pG zuvYIY$>|Jg^VUVdi5$TN;PZzgx}@iD9w0Y8GW?`PjZb{DWXx)r%!G0iT(++q`)M(8 zU2uih5c^AFc4M7&0HU6&cj5lFjDCS4i}`Yl|3G4*gt(6`3o% z>HC3VJPklI=|O8S%H%^(>n7AZy|}GRFIl@4u>DXCd1f)gQfuynm$_;FTfX~pqcid| zwASaI#hh7fsn@oUz5jU~*Lst1le)_>pDEKnb~k7DvhqqzG!wv$DYiyz_}r-{>cZtg zz;czzosRQn;^Gjpe!<%?Yu=}0)^ijX#@Mynb<>ckLojV@!>;>8s9B!5{5&qgUIann7V%CD4@@-K2wxOb!g9q8B){Q z<&7ENOxMl>KA#_x$6{;B`G!k<9qHA>e)Fks7V;9`>Rm>(SMs6n&r102J=r0VBCaZ< z5w)%tw;W-AaOC%)JYA-5gFN{{Y|!aHlCYUo-hdM^2k#@8nGazC8>i4Di_OQ`rY`oE zk@J^`$5oT^$>p%TQx%Qa=IjW!ZlK57W2pOUZ1x{)RBB7Q|h7^wTz`I=zo?p)H zcjL@NLL9**Oa%)3!W_cJ2>iHIZ;c#`+-<^13KB*+qC&i$`5e*<3NpkY5`~O^dU$dS zN{ZY8GF=05++0f59dc3=e;fiTnOy4G94c!=Bo#_pa}yj*N~G2#T0cs91yVZm9Qoi} zhD?*LsNBpPN~XpgzYrK&JUYxk7r5Bepz{!A-f{_H%isCZ*zoDU3D&#)iJQ$+AS_ za_)rm`SL(A4|Ng6-rZNz9HOtYS;m0Pu>k}~D(rB(c>zp<*w*=OY=7!^tD-KOYo znx%ytuk`p5@rQ3TRp@N7q*a#?)=?}suCJ`gQyh1!uPPH!<`-y&>%h}*cl5053T7ec zt_GMv^HT10qmEa&dW|%b^y)rr-qz4Gd^kuTC_E!sn%*{o_x|xs^x%(GsFst~90etH zr}mU|fqeAxY6sbvGC2@RmL_fXnY%mScluxoi8_1w=J}o${`!@Gp?c}Q^@Y*oMB&kP z;pfcN1SdEIIfyuEs`$#%tJm5@O}g&UK>`DvI=hA1iusK4j~;n4Q_Z4WW;3KrLaqEI zo^p~?9NkTv>Y;llogE(@llm$*72qas94lQDkokK;OHPqQ4G( z&h*-WIjyjO0TPPk8tf1d`K@OeagzPI$SWTy&bM3c9kI+qH}m7&*XPXl&s;9RvFvHc z^u#dKai)m6IGW!-x)HJTktm)gApY@h0XFLHGXvq|mZqsp2-4@Q& z&WX|z4UbrA)4p*kFi|GA#nkn{6nJDK{Z!VCQEm@lmd0Z4r9IQbKa-*_?-OO#VK0{w zV;=Zc-Y+9HU|!y9z$|51K7_$MB-%d|&D<4QE*Z-_+FLflD>d3!USG*9iLZRVY?F$! zp+9aLe-f&2ag@1ls~em-hG?hPeI_xU)f7lpreLAF#oTI=Ix#rF!&%{YW_x^Z`)A<{ zISD}o#cm9{LZTfZO~gpAk#O#SdBPcCdU7*9rDAFYVg6gi66^AxRH(G9v)!UXq4`(y zeGy8v(gFCB)w=CMJ-LcCbC&PIgxjz~tBiID1}rO+b~?lb>v83a*zmQQB+G-ecF`nQ ztmHXfOjSCo^4Ro~QD!BATgRanRU}pkCk1wh43l1DO-^P)#6&YX1+F`+yy5l+FS;Js z7RM_znuIn51@SM3rr$OQ?aFx?a)wYVoGb>vU zuS2jzwld>VT}_JDjS*}@MxJPPkg|W%x;`A8He8k+Jk<(3^perLl+GvAGI>4gilF3f zMh}Szf>5;)(5Qvj#8M^53bR=TV^fikX>==41dgI#s3Adtvw|u95^+I_nzjWpSdZYX zghz7Xb|wU7S%MKZfnV}2C$wV_=~D$DShu$GwWNr6HH{`mXp*+*YFoQK$-^wwITuHd zW)3iDrD@iOS>fiD4R|ECC1`nD6$3TFymYA;WUmVukijZ7!L?TTs@L;1;$$n5R|mh7 z;+trW;T=2cjKvMzTsqxd2qkfu_v&$AHjvP;`rBc_S4j2z$rYhq&Bo;xZZ~~hErUgc zJL3jg_{j(794ykDDoSStx^4y{CMT#2HX|+Mo?Rb-Wf^93K~pw{tk{>-gDrxMS)B9*qUE>IBtH_++)rZq8{c>xApL)VgsP zbWep3>j(?$L?3SvZt6ZG)zdfDZI~OC0wc}OO1&m4WKnLGxmI|z0w-sCozTVBUl5O?ki_L~eBatfp8dyL? zlDTwMq00CnVW^i+#h7*lJ5B|r*^+-{*=xL6aVO&_GJR`YR0wia%o|W?<0itcry;r% zNiI`C++PYjb@bO}&}*o3!{6grzZkHgW>y}W zv)W-$*I+m_Hv~0^i=CUVX4l%!AP~8zIe1XAL6&I@%{^*iXmvi*yT(w(9Ix_{=6E=G zU<;+05E8qsRG&t(UWFH2Wmd9V6r2o-d%LXo5N$*T*yK<=x@@vG&+vK?8Iwppx~JK* z<6W|oRaH?KQ{TG(5_ji}*=AuZ?Sa-@t+uzz0-xN~P~06YmjCiPViM_+w`W`|kvKt&bCQogX&WM^B3J$qB9in{YSv zpPRFWn5p(J2WS3uoB4mS_uf%aE^WH^(+QfKbIut_0-|CQM6w_vprDPCB?kdxlO!i4 z3P{d5NK&!MAVH#tihzPh1|>Bre#P!Rd+qm~GiR-H=FItK=7@i}_6B*XpZlt-e%D=9 z_FkeiJUkk+sRfR_po36CvD2-l^T^k1_G7&oU!&S@h1BdTA#$`wPPce9R^6@12wawo zG{61%YqOM6M}t)<_42x^h&Mc~aonj@<5tec{2F%UoSeMziLL8zm2UYyOMPBr)V6nI z`k+L-(DQBXGl_@K5%P8;kymow))d;OPxM`R^Gf`VeB=9XCx+viwp(51*ji@R>1K~- zu-$A#Dc(g0w}?x%jCS&QS<72tRVxPz=e+3WeO13)Pku#_ZoA|1CG)P^9o41E7R6%K znp9U_sY>*!u1+5aPpYo1x9~5juKzk8s52lTgT z9K`3Uhtdk&U=;g$ts`DU#O{4qO`axzJoTE|uhh5_lsrCP2M6%T(BiZZ6o!OQ*> z+Jlq5uJPO)6ese{bL%?&?1#tq=}4G=_~v~K57OZFmSmH@*q6%t>Unx2E(qo-pRb3l zx-xJ-y8^1Ijb1_LMAC>;_GVC;YBkt+7z2K$E+zGMipWnCR- z?sxA#b$d2@j$)M`LAY3i8JPPP{^AYw`<2$WTYBrNkpIWnR)pfCDm6+qO5=|B`gbu+ ze{spu^5%W-^44L zwws&{H@c(WIAi`z4jLtiW2iNoTIznS9VBA^Z z#Sb1=3NbM{#YFYMOwi}{H=G{D2%~}xmx0_RqfbQ%uN-v7Z}6G>WE4HqKhHk=;nr%o zaT7y^iEJ}-anNQn+qS`)Txb}jj0oQZVyivMVQ{Uq*yx8Phn^N6N^soaeI8uWhTO)D9{SK#`0Bh}T-Q-EVy9GC=ndwr_{D64| zqQ#85C>NQ334MvH=T9TtJkx`wds?i>4xkq2fr?u^iHB^b8g3(tG>un z@^-4tmXF8J0K8HuHkLYuc<(e~9pFu}mAY`OfZa^_B$5xE6+tH|k*Gw^P%$LC-8O$V zAcFQP_38Tu>KRn1E)_0nQ&QHN$LU5-p4TuHs~hJFKL?$~#~sP7OkB<=>3nQQY2y`e z{G|r?gxYmk*M~hSW0)bK@wyv~naE=jBI_y>7wAeM2J`EEoH9a5uj8xG9Hrl8R3vTK z#)Qjn>X_}8@XngQ;zi*2B^_CWHMj;V>(a$oc#ccv_V!lUGl@N-e>a%EZ8 zRk7wDS%nstI(aPdt+!)But@fb`j^(nS=1~=`c%5c2WQRNaplsXT_|#oY>uhA_a@DJ z`yV|jIGTNL(mx$5cXh4NEpxTytn=V585I zshgta7`0*>>g+NoX~qv+35+I9x2SFNReiYyhsr4Fat z9j#1l?Q*I1oIGyFUzc|#zqniHQ8Klj zVmvxyF*-!%adqRW{Z;kp%YOHzHM2t{^5##C4;7Ov9AvlJrZ2>QXv{pm=3vD>8fF@N zz6m2)5>zN|txIa(LqD&(*5zy*Z8afRZX@Vw+gJO@gXct4=VAp#^!)*h_B4)KwEek}5#<5~2xdV}L!*-sZj8os@{wt78#y(*MU0DJXo zf!64W6>ZgI*OCj-}-|1e^ylh%_U9$6|_dq-8Go8V$+i7XDZ9fb4KUBD@ zQ2gu>pH}QjrEs!{dbZ|9ezVO>)9c!&bQ%)}zxiCY&F8LL>38Ul->n?F6Ib^1$Ad;K zs=>v3ByOL_sI*TyBt67=S=gM}`M5^1RxbQVp;*b@zV+bxlLQ5JL0gwo+I_SY4;n1T z98U*G5UL`+B~?O+Wdv4(LFEAvl~C!M_ijciaCQoaL;ZbI#5GL9rCv{!vGzoHKcLI+?)M3_>iB zTh&QGJ>n-kA~#Q0+DJG5vUoxPExGMRrngOIPI#WX_zsQ&%6GrF=Z;1hze-=})28~u zNVC7DR~FWxz2fAlB5|i{t>iPgg=F6eo6gPK68c#OB}=M${v$87TiQ!XWDLIs)pfkA z8>1~v$V%@nMTNMc`7V^io$v zo|ciD|Il3S4`F1vdinlYX_UP5qNkug+!`6abeUwwJ9G;tOwM!_iaCNNt(EJmk-6q6 zl6Q9Fi}204A(FoJl9F>FlC=tz^zt4xBJ4))%5ib3CW$?yzV}y2{X^soz9|OLAH63> z7Ar=P9G-ny{t@om*A@X8k8jG3=ai!9pDM>MrgY?~SC^a^_U)%SR_-N|Xu|8_%wAc0 z+)M6wW=+?Jk>kC!f~{WOFXc~;Gk6cyVqbqdI62Fp@z&(Z$6D3Z+JTg%fjU_ss&A@4 zznwaMRrNX&Lso}bpckkeChW<}Q`M>cG{NX~s0lG*_`Ht`Z>g`=sy{(!9NRj1bWBS{ zL9_Rp29=hk!I+B9n4~+Um{j|BMFDn?Hsxu$$s9ecvk61z>Lei>s7-S%Cg`*nQqXcs z4!b4ntZ<6oRrA?uhl9fWSaka%Mjel!7jk`yr)&c&63p&iQ*hf#^4#)?$;CKzPWRAC z;m(Wjwx4nymW!yHdFF25mNTn*#_(N{{+&QWp}~*uH@|O)nVl#!=N?sZzb5&VF}Y<- z^oIBOyswDRgu70?YHJz>WJ7Fs>I^x2_?-@@ugE3pA4%j>98VG!Z0zd$6*#PL^W}L7 zjRknM(WwQa$iOe0O9(S91LiCkz0eW8{%@d%f_ZuQwh!sCPsZeJXImoHA?bd;VmcjPH7^aD~b26tbQ(VvEOkG|tS(FN147a&hdvsm!sjp?E`4=*rg_xtlhB399MYy`ZHuFtmWiPk$3lfm&RDhie+f_LX4sK5 zQvQ5(o4Z!LNuf+Q_AzG?sRbfU6#LdGf=N!CB2Jz|GbNrj z(_==#X9Wx|2(pvj<6iK;8|$fDVgpl*KNu0NRg64xH_kcc242uB2`Pg;ZG#Pk-+1lm zV5((py@WW)P`2m2$o>Ux_VLGuw&?RT-!4R&IKlmb&nOCs$x6vkth(7PIJmgcIzR3C z^_u3FvgSd{$hY?w?rPWnf;+lCXa4Cf`^#M~81gke=H;Lk=e(2X!IOMk;)Z<24b80j z6!IiFmX4UR8$VPweqv-Sq{EH1+=X--);+g3(WJYWWVxgw2&w6+kvyFuOfq|eMr6^u zI`O8K66tE3>k3n*lW*+7jxB-(>62VA4A1&vO?h4G?rehm7TL8Y^^Yoa;={DF z0^{#qk0p=vz2!=dTi)?&4UeI<$=5~W%$#uFckQYCe3Kh)uF*Ca)>C~-a3Rk!j5CPj zM+CRh(>_f;`9g^;dPpR>R@u+He50g{UaPV|{@xXJx3MpDdYc|H?ToP8N=xPPmJ%PY zQioG?RAf1&{0~EK9lihRsE5CY`9(it3zIKY@z z6h-h)VlP(I+M%?ZYqGEi}1PmEkkf!Uz8R;;HUT4RLB6F`1>~s?Jh=A0LWrcNEOOoT1Y+ zw0O7~^)O90(aK-gf{S1Pb)*q(_$p^1tuB#?f8Uhc4oRmF6p=<2% z>XuA}zsQJpJ)Z60zH#(JZ_Nz_=QFIcUz(PCz8k_uPn0ts&0lpr zVfEIN;n64l8tL51+f(Z27?Umxn3gw7Uy^b+n`TY8H(s0Ldx<>6y!WC*c87GtxK&D` zYvWPNx{%8zzH@tq%rEjUEjA}i>{nE-N14C0h;ucswW-+ko_jyO=45<%*l+#4Z8;g~ zmE?<8ejfECrIhJxD!HO^s@k}~#5}&8L5fyhZqR>2g~hd@%8nuU1;64~(brkgpRZOb zUK`iCrhFrH=JU06G5cHV`na9i1x;IlvyHyY?q@8Ttm+$^NE+s2yHxAy0F z@%7&4uf8k4BuFVJnJX)`%6V1e6?aBk3_I1H>N%X z!}poY@9i&!u%u44FL4N^K3JW4^VH&lS8j)xK>|&#E=KaxIg9D>sA;l;ncm4My?0{6 z46|H!M<@?wh3*dU-~A}{pWpjv2Si zr7tsL@p$MTLV8=0sW zjbC2oc(DBaV?l=aN-;a16ZOd+l41+(;#8IQD|6>v_+_BXHL8)dfXLEbTGPjC+1HL% z-|a`L%t|%VKF(ZHYLUry)x3+q={Bvo3Fbi{A{`z)lFh znB%5vLB}f=T%!$eQ~ylv^EB9K@Y~5(&Hg(p#hN1%an0+GJuKSw~@X$ z^i4MPj!GUL+ZT$kHnj|WBq=X{${O_eF6~F!xeL(Q0&g-_ZNWX6kHObb(wbo!XL&V3 zQ?=CRd`_UYBH8!$d?f0WtIOMTK%5-fAlJ-13(hnSrw!%SY zQ0EfD$FNYTJVK$$@mA6D0aBDtQQ@Tm|D_yTi`?ySOTG~Z{`B066{h%lqQNx#E9JV@ z&P0?E|G<}w9sQece?B@DtNMI@d*$8Jdo-t1El0N~1TOTyk+tbfkh=D|Kh-`f{KA!h z!c-+l-^L&TuV+KGaS5gv-F-=TPDj)7)Dc-sfT^_F5VcQRc|PCyl5$~Fi{9ABJy@h>dh~lG!Z8aUc+taJ#uYy(b9huW?TgdFwJqLB{Gd9C5coGR#y_reBe8hND z{6_5Uvpv)lhOXa5xqmz`hNX^*D*ioa`T6*f?xgyiE=W|h}Zti2LOrPR(l-FQa^LyvUZEnf(rVmT{-osivE+Vh^yDeqg zMjuCdkDWVf;B!m2UH_o^xgmu?c{Lf;9E!t?6ezb#iMCiORAwmkT^d`s`0O6TeV; z4f)I}=iTYsiyKE{n=MO}ZZd44iv@3i`RusIJ4~9T{LNy=POdl&m7$mts-m}XvDbud zLMYkAIaU4}qm4MHv++-UVa~Q9kB5n>o8ETk3Hzw@BCYE4F`;8wKQ46grVL35u{hB3 z=n69Y$PPY+C{DMa|9XI@q>l?^?%-8FFZA%2kh=(J5%xgeA)C(A{pfvKUKkZ?4sCs} zILpXmnqykW3!12Iv&zSscL+3;C<|)K22$%Xnm(9%lNZVwa8)-#9TvK!!Q0WK`|&lL zuEx1qR4%87vCo7fZ7UZ>DjUWomB&R=VHe2g7i+8s6Lb-Yo8+i!OXv_#^Kafk}5gF)HB!#U(1*(~+r;FD z!@lP929@VGAs=*vE1o3YlB7=PJlV{WpM}8q&+-)PUrgD8#q<{NDkJ9k6!#RR-+L!PIp)0FJ zoCs*N&Tm}fA*F<7&P|=1oGo#Ogkr0Ar$@V|Vy?fud6u4Ki;CS=z9;p8Q*MJ zrZoME(`7lnrh{#1DcV#>KG`2r^1*p7>x^FG<|8aJ0LTpXT$y>RzPTS_tL!rC`prW)jO{E0Lyt1GCF64M!V~HaMuJ zR`?)<-zQg>7j(@pSC)Kk;TaZsMtEA`|0=C)WvA?h!L3VsLlo0{FOyHcaydfx?%4E? zCEpi3ChH@bj-#J;5?>&ts{&q~o93%wC?s{Q3ffMaG5)~VL{m`}GQcql-AcZ|vQ`xu zkT$!fyW1`(UA?3JY=SP$uT!#sJtFt}2j)J%uBdNEJetxzvX1(7pV)a5Id$o!HCgPD zv!_RqxfkXdj1D|byp??yH_OkwWL4cQ_I>jX+q1`l+-xV$Rz%J`NM|`!v)~>efm!%~ zu#-!(?Ui@>x>=EY;R$C&zW7HG)&a|A>2s-7rT!%kzh+1MU_k2ZR=@m^S)N(Ij|JM^yV5;lbOK|AukZ=j+x4|(#jr0Wu! zRfyuxYF5p}-s-9op}_R;C>PlnCk8e9XCQT$@T_>+6x z`Z;gnW^Pn8w!tpP#l;S}zEdDP@-v^X6Ih<)kRJDsQC5~Z692fI+DY6a0jDn~Cvt@$ zPw=~=;7R#rD9J`hcy_NZsiHc1heBm+KJ4PO&++uzL-OvyDqS*dvCH=UpF*Nqy4ATo z#rT`IyHZte6tFKYpJKUn;RV_5$-7oxY-M$P!*cB77c%00P{zEA^rEd};9itD`b;=} zchKdPnB`{?j-~!S#2LY;aojy_sgZdw(eR8(WbKU(~QSvNio!LKyJv8rxTmHf(baV4|c^(D3gO;nm>xE2Jg6}UO zy|6{2N>bzM!rNyQjk=TR@=S48neIrOz8BfaPxnTNuyCBB$B8)rCo#@sGkW`#h+&wL zla+!|V8cCB$61DyJ4K8dzw(YDo;Z|tacyYc?YMeZ&5nC?$Lpk^X*u$=fZBP=1nM(B zfzIP+4Yz%@lG(g8G3LS`q3V1!&sUIh~%9*ZLaFQz%-a`;_&1ao9Ts?ZU*~A zXSYIjn>Xhz%(V`%EPVEFLTu`Sx&4gg`C(Q0=RHY7pUQJ#d_#_V(prawRBhci)i(1| z4w|}p?Onc^j9t*urWuyOoOgmYq|@zZgT?6@bDJ&t7$FO>UF{Y-3%NZ$z8niixZwP( z1;+^AFoL;y+dQ-A(l14i?oSasb9!~-#t5^^dcOP>Z^En1!^@S`8-*fF)gqqxFuR$8 z1(r_78yAFeSp2KKzUF5X$C*XpBOa^P+Oh z=EzCquCOnD3Ui6UPM|0|V+cjEQ(?CIUt)imi~iWNhjijl1Yvl%6G?F#MUxP+B8y$6oA*>G|6`FLTb<+@ zucQJGmXwC5ZbhxfEa#hSB7DSBBD|9G16YpCt2ou%ed%$lP3?{epMQ{8>KT)if||r~ zO;yM4`_z0KGWKB)$sTE%q~7-k%KsK7;%!kc#FyRs$W;DONC0ou=%ZSH!%8yAJJm6D z#c7!~X+a0oX)pY(pIb=bb<(MX(@D>z_x4`tEDA|=^os5ZaYhE!; zdJ-3=@QmqH%hzO&Klz(|)Ooz%X!tq&@v{Hbw`5rU8+TX4GVOC8e{;;NSbW@>crDs5 z^QTTKfh=|boG+`Bb@X#gdw$qwKU;Wv7S&P~4S6=5cs7G>Hj`5}OGGwXNjAsJY_6s3 z>A1e7r+l-Be2WrrTB(dea|U}?zO{J4 zHQfSRr-B3fn^|v#a`-1R9F_{)$O}Eh3%%HLja704bPD}T3U9qEyt7nj@-ctCDf6Cg zQHWDfXhhK^r$XnOx#3GivE;?^;>BFeMT#oL$q~h=CBEtEZ;w8D{#gEA| z^CG|ot&-A<1qCWaW#pyR;-$4qxfSfObrGdaC8bZBv+I}GL~(`B#LL=s%R0q{b_3wQ z@(r(G5egfntxjdb;^m{wr9CfM6|jgaRT;MUvcYD!C>HLbTmDJ6VqUx?%o;9Q1((5< zUoj%d=_nr{M@&1xdE#K7BPt0cm8p+lJaHAvZ!6ZtrAP22o4N?OD!7hI zu6D+fa9={m&cMao;k+_6BFnX>DC+b}V7%^du^G6m5kl%Z2`fi!jZE#)Qj{XDRvaoj z$x&w(`NTpZmz@^gd$Ue43uRqZCnHgdyi|)*ue?zD0?p}K=5`J^JA$qwn_7V>}4z2}`N}j3sF!$dC>Ywpsh7wdM!_}1>2pL*q3w@f19+!7MWhT311CG)F6s`qwd~@X>ApwV6Cl|Wq~8kgH?^!ct-m*8r8krEWwzwYjQ(z6cetob6XP;`HnKcv zx#q@kHiPe7;+)-F%WVTHh>2U>5?OG$^zNeD@K(wGcK!ZN=l<@f{@$|wzW)A!mHta;G0J zA9%EhrnlAU*Vc1BY2-x6VY{F94~p{+Aq<94E<>czLuBPc6axoCRI5WYRKs*q!wd$) zOfJJL(Zg)z!yE&{T&u%8R3m&+BLW5^LM|hG1A{9o@KQ;{dQ>^~J4(8*>lsI_JYQ`; zzWGUd%VpkYibe>9xW1n&uVgS|r(MR*M33o|kLeAJ8LW<-r5ZPu8aFW*H+2~|iypTq zAHOs(ZnZjoh3d7n)az>ouWemk+eg2)lR`+XjvU1z6mh7_Ms4f5uau?wSdG~hp0-Jz z=)RnVI=MQk!22ffBqGG+O=$F+@bWj218<^N-^5Z)#!F2;G?+|unM{tJOf8>G8<@;k zoy??qn=SP=*Whiw%iF@}x5ZL#gQVWL{(Nnog}O{TYExCWbzu2wCu+j5wCR{j11hcM z&gz6Y^v2ELeW%O&?&$ZuJlEHyQ1Fg5NnH4!~ESw8h{U}|c0YMSc9 ztkj231|Q~KJ}kI=XybZU!$smX_0Gk4!q;U~?&-Txj&6b_$&0BESMbwUW>CMVW?<4Y z2*Vka>kMhk3|Ykt#o!Fp+6)c#ES>Z$gW)Wb>nuymEL+7a$KWj2+AI(CM?UF~0)w+Z zxkgt{PS_f~djOj*dH2*dexf;gbfjwHxeJNXWs+l$r)}_`POg1AMLnk`J*NRqvT~g} z6Ek;skm=x@!P?we>Um@7c@x8VaFD54%)CX#{H4KptF`%qE7YGaR(uk_`{_AVp91%^ z>|JKryOb`fpA^XlaMm3G6GPS=(0n3ZnTB?s;$m%+u1 z7G_z)>A|&?Y}eI^nAORO)pvudQ){c!)N8ZSYo83)=3UnoV%8Qb)|Lm?z^zy7)a#ql z>)#C5w_VqFW7Y{DR>sy=MyOXkXV+mzHV|hwP;MKfu@W0(l^YbVHmKG&XlOR+j%+fV z-DGmxWQpBmtK8&xwaK-<$wTv%@5QDI9qr+@Mlcd^qmg7TYzU$Se?sL3Aq1!5|XexD**&5X6Fz#B0Z4VBrW#R{fzYUN{LHMazo8 z;4v^5HROOd#zOazC>a^7i8U_wG#R_HJFXR%tIfcU!C?b}vd{d!PR0BKD=-gsfe8^{%H1<1{my*GDU+y{)aLJH3}*fR3WiOL9v3O z1f>az^{+|=MGVnFpmzToeL}w<<@X3chXo4C6oZ2T(I|FW^DL-6n39Ix-5i2x22jEE zkvJTr9t4AEWw2FvC;)9p&WMqlg-FO~NtDCfaoqthPjx{VET%tQg@GR9K7$L4L@>~z zBfR-=Fg`wU)(r@Qdq^rRXFdesjgx2*&iOj>WkD!XuJ@E_Gnn&%e=o{B*f2B&(fl!Y zf-3xL`UF*|n7Dr|Y2Tr4S2%Xx8NX{?x@S|dcP^VC7Po&ojc~PWPdt8K>cPH9+&=hB z^&b-)8+K(M?hD53+g9#jQVB*`1c~^4vpj-T(Vl4B{*j0KLb3axnu$dZ3SB;7|8nu( zr2>NbBZ9}9?Ng})kI5~`2m9LT1pC@O`mgPx&Cz5eR$h_X#4u}UCY8fm(CrRjvb9hgcB(Qopgd$ z8sP%?_NlEC$podOeb0q&9@ATn^}E0jxQ}kTcJ7$u5G?WuwpDvN83gGE`w9vB3W@s$ zj|qaY`??tfm1M%1bb@Qwj%)Xh`}nqFutBeZKuXvyP7@cmR+Z&UA0t#<|Be$2H|Mp{_$jjY6`(Hli>Vf*Xil5 z>&qSI)*Ywj-SasF<1E7EA}}nVi|bGkfrAl<*%yu_h{O?o*Uo?32!JawVQ5BP84MI4 zi2NU2iP^Zp3kC6(tt5r69=Qyv7g?M~`$qyb@Ei7Y28i zmc$kn4i|zeF-=S2aAzKz6;%hj$bAwjR*4kLAR%+&nkX8 zY6Z$d#KBQ_zCf%ah_FnI&s`cCbBhyN;4ioE2 zxfZ9Rm1>*f*man3Ydvx-D(-r8y{cC$&82a%E6oj0b|&4UN31*DYe?rzhR++v?hN0V z@H3D7zZ7>rzGb)3dnWVF-ePwqKP}bFgY(aJmagk-F9s)|A?5Am>K@_abSOqz44$up z#3!s~>_VC(jFFKy5FG~5COnzB&yfiA(+hS&_rt)InCkJER<(2K;5r?%YH%f{;3DYF z+}l}p)B00*Nx@tE4{nI4x}eg5v=>M*kV;^VfCBuvR-rpwy#U$#k1K)SKl%3v z{NEn|bl~6I5I2&R7l%hs(2*#=iJQfRAyLZCqBxvJFa;I+i8u^z0E|qH+8ie*)CS|R zqNl`U74!$dD8EP&Xj@^y-1g#FeAYY$MU579#%JL)kO+E7BM1uxqTr-I6fD5jyd+st ze%c`>d=QB=#|bIkIH#8(Dkdbzzb{gT0ZAbGA+SgxS|U)H#8L$H391p)A*fPfDgK2P z{_hXm?|i#50Q$}!WyuTt5CSdE=wOtE3nAxFwFEcc;3AO1>YU~?I9w1?f_@AQ zsRcen^D>)@VPHYYB)s&zGqU*8a57DD!74gDSgp{C&WKg1^+HsXjF3Av;1!A*$xN$* z4S>POk^;{cK{!*0x>=eL%ZLj|5%Q5f;SOEJ{EsUVOq8G^L0y6=5)>tPdQg|3B8lVx z)FmiKP?|(?@E5o>E2#y4D5;mHt zf#3m1aT7tpRa9-OcoX7)hN+C4so0~(+X4%l=bCewP*2Ed|uchS2Kl87R zuiM0;1kjGSpagRxV0eJ!5dj`RYeawtFdJZafS&=32cR0jX#kr6NCrqA0APUO0g?w0 z7a(~63#kNfFHnqhX}A`*W<$$z=41T0%Zb74}eL4^Z?`o zsLy?58!$gWD~Z4lP(Z-;0OTXmK7jf>XSM*m{FC;L{Ym=(_5-vJAU(kOJZHB6*CbLs zBJBfo6M#Ly^8nQYY!7fgK>Gm6b9=Q7*q+zoH_y2(BGm(&4=_II z-+1reuMK}NJWe$4IkEs4`d>3VUB(St^UCmJBm<-&EydeNr+}i8b}~7?b}z zTFy)-mIud@;53n&kb{6sBt`)4vjVvzLNO{HP!t^k)5oL%t!y~Ld3*U7g!l3O3|+cR zMx8x;$O>@tW9o)yDp7g~{1Po3>c{>{TWgcR_)ey3NCNnKTd`YL>tp$v&qHFvI9sGAb0#Z zlq4e_668;OebMDP(}d-J2;BSmlVt{n;s#ugN|kjsnCWuL?EN@acYGF~xWd(Nmg3X2 zmt0$q##ws9uq==tEQ{sJT^N*t4Q9Kaay9B0NvchP#r;&fbbpdZ4tc5fA32qmHIbw_ z*G=9}bA3i2Nq6sH3r+XzKSrA2J!TP_apS!|>0`gS)X>K_SDHvOZ*NV8X5RflAkD%d z*~78|DOJ$f!HgHRq5JGkyuD{7Qo@W(>_ddspKTf1;03kRP&mlK$8`M#6vTulj}3Of z7=HJZz4`*Cw6b9aSB66@B;8vZovak5ZR9XUBMby*e6-mk*jERKxbAV{NY|29zV@+( z&jpb3w>p0tpg|Ft0}XiT|3HB>|Iohxxn3_mQK1|%X5ym%ZO9wmMv zZmSeijV2RRpupP=LawC$hysV8`9I5&*slO;5>zH|R$%ym!vSUn1fiflL6rj61iTZ` zjSz!SkR=iw6tGXgGXVQU^iCk+0}cV0CEywU;ugT30jET?Ou#PzdjLEe(J}$21gx4^ z{64U4r&0(YAO#+Y7?1+L1Ts=!mVjjf*(@-4z#Rdz1biI`MS-aU)()5`V5Mv-4_y;5 zQ6NF}nA`@g4_GN+`GBYT%SwTC6xb(VrGR|`RuFh65S#)}Ws*$*Stzhiz!m~4MRZUg zK0UNgm3zQG5xo;IQ6MY@_6az~!C zqr{lhePY{d;hX2jEfAA}$P_p$qOBr&D&V7ltpW~{Xsd{x%57-d>&rLKPk-7fkew2p z6<|NW@)09bU_^nf0*d*c^L78P@>~6BtFU;`ufXunwu*%b32n4$;2<6}_FtmWBn5EM zQ#b0*XtX~TrAGTjl->@4DFR!itMEA&g*hoI^F?h2LhvdwXXrjDF%2X)hsTNIFhU3t z&C6VR_0IZmb~17q9An{WO2DK4bB`YJthTO7D%bAS@}w z3BBFuiB}&Ep)h974y!GQjA8d=SJ=x|(_rG@hl*kFPiI+4D1RK_dgW|GScS>xDKCPs zB3n+}5_vP%rkzBNPtx4aa|XvNVHO9SLDFpvsgatW*uYZ=oHq)fk*teTBcWC{!iR9W z%XA?bjMVW^90ty)PJx5k1bHlx$(G)eA<36-6HxyXQ}cho(}ZQ;=hXU|ttLQU2bq(k zWL>o+A26N3_`>2?pj)sZ7U&*IkrfJoxtm{&Ji5aQ#T#6hv`uw+J!zjEec`QRYH|7N zx7Vu&F1&MTT7CV_t(D5`y+^Oq#Cxw{1G6cgNtcN!-`Qxh5B`hg6CZAE4wy~fA*@bJ z--A(`&jgT3znKZ5Gc=zKLD@9UA|KESCS8PgNF-Wpy}n+l0Y4#!f3~}`y#4}l2c7VY zXOm*16@50u1VS=W;vf@8zaL}H;F z42+tCISVw9!H^J~Q|3z*wkH4qmjsJXf!0Jc4W%HIh3iY9LY!Cdldkj*UII0=k@>ghxPj#|GSL9f3?nQFdYJ;OvJTdrUVul ztYN@R39K_QuK^S1f0xhZ_jCLnfj>t89rL%@ksBPLhr^@DP}HE;$T|=l1$172h8FZY zz>v2U9Ng6c0!h)7lmt3!7>NiOiGxlY=1iQt0JSLItF=F!j8srLj$S}J24lvK6oX(m zxB@A=3yY#WM%1Zni0E?_c%6hRv;F2nmr zm&0E(>6d?CfS>{aX#iCU*Z>GpKv{xCKUnUAg+2feV6A_+$}c`_!u~sZ0BdxRbr91V z03N`a8^kqW=?pRlVm<>ZA5=T2bHE+|!vL58@CJ~~0Q>-W1IT2Eya9lXe?kr*v;ip% zKn`v%cZkRVG;MjsRN)3{{SAkb^vJr>;Vu6 ztHM119zbXVQY^q50Du9=;jcz*Vv9CNasX@qUm_8{h|! z;eezIAP2x60A>Kq*?{5z zkN6Wdh=ESQ_)oYvu|N8-g>_)u$H_%!h6`S0VuHHfI}Gun>EINUv@h$5M+<3ClpEEI zCF7;$VB4g{gI@KMeJTch3?9er=T1Vxs{hdlLMgl% zH?xj5eQn`bKK}ZW$AFNLmGAr$vnya(Z*CnbRR2#$ab0vQ%&)(Ay|PpBl1syU{Ux^- zC?!jeZlMNCuUDs)tb8VH8?1b%LzFK2FXT5|zO~+|bmh+Oe8ZJ{zfj7&FcfzfOpxMk zmhd?N|9o0=vTzh+VV9lH3^_NU{tp0+!2elFgB3&s(8AH^&4lsVAuSGLNI+p&(-aZS zs{d6VCjT z*||#pVnQSiv&6l!(az?QC)~kkMrll3-jIQJ7z8uJ(8@nIg8~@^(hLNYsLMd3frbJ? z3m7aAWdLc3SQyCkUjqFX83r16sLoY;K$?Ln0SN~Bb*Mf~yFjLaSOcX7$^xVZ=swYr z0o@0(0?05?rh!HS)dn0G$TZMmpgus30TTvu0}$oI7`=X%xNin1GEt5J0sf!hU*e`2 zpu*sR|GsGkOe#REL5%*_rkTUgynYwJZ6L>hZ2!4qrg9HVIY6U6u1~Lt3Fv!`7du8+$|9h{@zej}s`FsB*SSL1vTJ}_Bw};XS z=%#B|=X6H0$~##ewueUZYWyL}IuE!`J+|zv$?r>+U=Zizt;Ol4D0?lvZyLps!ASiN zH^&rdq$1ruo)>T@hs5EbXhD9XSiAzf60M(u#Al!Mfsl0Sh_KMY&Q=QL^tQ#Lf9n~owG2l0YS6?{A$PHa6jcP*(s|8g4k*a%a)1!?9|{S=Y#|n_8?*U`IkqsX^?kkq)@w0p z!fdul)&*?#j{}6+9SgDx*soW#3Uj#B&lYgFwZKF;J-YY`IlTteM7VrjTNiTqeh3iZ z_Wzt+$bD|I6QX9QY=omLsb!;xqtC0fQfuNT2< zL7grdr-q1Qvv{e1dw}bL5P{U9*sP+nA()U6eIw5T-3$)CC}%PZq#sVkxhILQ7Dr^6 zk&!zB$Ya0S&;qQl5fx;w$1+ef3 zhl>1GellKX4_H&|eTS(8|q;JLtL2`UpHIZ&dY zK8eXGC{Zwv{{H$s0{@*x;Lk&TOkObjHV=ow5q0)e8X z4daFNASp;F!$h$-7y{0y(j#hw2}mZF8Oe+Pa7fkR0gvl{&Xs@f#0DrH!0^L< z=>%{>(jfx}=$i=P0gWfdkO0Dih!g~+pm0Ie60=f}LH~ zQ)12s5Hw)&haJd&6g{YTz~KS^2Uy-~`5Vv!u)z&vs2~U+!haA406q`kJjhf3Y}l^Z z0|6>v^&l4jp($YXAUy?$9>94(=|P4{3`&WIT7kIqFgl&w28k(%LIH;dSt)qAz#cbZ zVhVBu(4-A|vq4;X*reUL1MoWl@&L;dX*}r72DlzHX@irlz!0ka| z3J5%r&x7a`WT-?k54OC4_G|#^|Gx1Js3}17Kt~S|{qNKL{udR4$l*oZq1K>(-HA;h zhJ^4}Lom!pnSTjK^ zR%WHc4Q@|L)X61annG2*ha23&YXtYcIpB&YuSqH(vdD345H|qq5N)d*@*(;?-yB&y zPrwf-PM#D>m50hSVMAYHc_G~t$b*p#!>8;q<~^UaFi;v)f7~qK?dhB0KH zt2jY7vSz)pOUxXioF@9KgnX;>`j(e_KYfeQs%=uuPIZaDQ5#bhnzu8iBDz?ssZ0pv zxA|{U)}AB}MP)J}HE)^E-Vwmt`)${2eN_T4YMH9l9=~N{>vB<9VKwpd;8FvA!e3%g3n&Ww1fZej zGME@Ji2y>;2pMH2SOh3D0iFOEKne;>fCJzHSOE?O&=S29(eWZU3BUw6qmee6X9F7{ zzy^OAzzBo{PJ)|3;Gs@D5faCoha~;1Fp8%z>F;F%wK@+dE4E4hfMq z+W!fcgU}Ih@CL96b~7*&wJ%Ux1AqzG1eT)Agh(5h3C0C56FeEz)&NujCwZI=Af!9Z zWgsUSY=fbJM%n;Ro>Ut$el*nv?*a%3&N46)2DJgRKE}GiosdFo9gXo`!pT4|JIr930xQ?{=0&`54qzqOirW`L|8G~(~;4BOC(dr#MZ(~_I zaTL#df3M}eRzK%z2j4T`j~|~DIafNhq(+{?k~DuZYz{dSTf5S!XJZ(1X`cW-Zd5_y zcrhRFyutjEiLr{wv#Dgf;U5zY`|t^)NeX*X=Fi`sxAZ35aU>vW*@!}yV`~%aV;4{p zpqBGdk4gNy$zh61u@6+LZ^gAbZT1yOze*UR&Y$`4`p{Xm zIZp)2Mdi{S;$5o;o>jik=MnXqBdqU9=CD!`XR?RpINIuD(^8bSnDBgSokXv6Y!wF? z+(fRvD4y4Dc&OfQ$$J9#asu)vptaKebcMK|F1yW4 z#J*u8M%vwKo(T)_QOngy3|euNN&`oZ*d?kbbBY$kFe?J5OSRnK+%aVVA@+kAd-9sr zL_Qo%Y8Px}L}GcOYQ!Gf!y<`)q?MTSQ9lp%+p&WN)|vq0~ae#h++sFZh({A7}iz zhLjGqo66qQ7)T@g5WH!v3dC=k*M}t#S~wNO;roMzO{-hcsRD%?9zbZ@@CFJZcjvZC zPj4$#vLSL)wHrP`=-jXeqFe=$eQ5SD2BJy@vOVetXn`xW2h#p~y8n{e22mFSof~R5 zZEvL}K~IOPC%6wwAe4Sjfh%(SUv6)`z3tM|-ir7>v~AjpFW4tL^>4TYsLt)_aP^o3 zX^ktQ{Ls8RZ3==((EGoCdjhvxQ&J^pPX2O5D+2m!4;bCPHfDSBP{Y{vL^de)IDKma&$BhtQX==ou{-15cF?AWd?8Ejj(F`OxzCeud}b zIMH5hjaaQr8Z6qcWolE@LAIw!`z8_hNI1!_&0Z}gYhE;xHTo-oyMjpa{1Jr*ikU+_ ziD?j1ZDS=dzM;<=6^FX;Vp+=PPr;q>)@j!ET$BnzEuOAr4R6gl?0!2BrD>T?iSWp zrEcw&=dM+-Av+!HSltVr4t&NMM!sQ!{$B^^zuc5+;L5^g9>}feU2e#$d?C_pl!Vk; zLZ`5uZTLOJ8@L6{Gs31Vy>dRxTpT!4mA8E01y%m<){L7OKJ&Tx7s4&uR?m!>^UCfE z5e0jiXZD)+`zsfES?dF5MJ{-2;Kj(o6XRw@E&g!+#i*jz)w80Pe!Tl)^pjVcXZ2q8 zk1H2@^K6hsUFtM!noZDii#Jos4hBkoTS9u+4#N|NI?7vZ|o% zkTR|5m``k!J}6y1Jo3ts$W>WMM50#nJEAre?8)j!BKL4{FQWP0ps;er{-U-JXxljx z$goc?Uwb#~?gCeD?&9A*>E3_gr+ot5BzNJt1AY4C+y#t+6tBQIunq!V09J7EA^8B9 z0-n%)LSQ0L6>tmy0vLgH5R?JC9h`?qS%9Qy#KL18q<{JE4qA9>@xgIOSzz!1s-jN9 zuKu|f1$u&M5Uxew6~GFFMfnbFMRyAUwE%rW^x}?X;;<3ky-A$LFg$F9-!)Jn2n#Sp z35zZk0#bpkK#RaeFcbwVU?Z%9z(z_~p7lbs7wJwXAcFQ+Ux1{%p^JNY zZG3I+A|zH!to5bNo)S;)VuGeH(6&8IK^yR28cTXfwrO1hQ$fE+J@n^e8OwMt05n*F}rG*mqr)X)Jpg?+5aQevHG{UKJ45kqMj~S z+ZKwSV@#vo4jIM%vyExX&sa68nzY+QYX49&buCHP7#n=avvQ`bzCma!^69Zh#E*&S z{eV(UoM+S2r1Ae0%nLKTUkn9X5HtMn{Qqbo$mZ)ttty73$^b+bYEl z3%}f89?wk>i5FFiC)9k*KGV7V=nq}%k0hL#`2Dx#N&h+ep(HJSvlj%Vb!B?T)cF~WmpH36X%$MD$sx*b1|4>W@lAheOv!n7H67$7`cm4 zo2CqYXXK5X_ul!1?7qU(F8`p%2=2{a+{=b z`JTJZKfiF-!9@o*7>KaAve0QV=E%5(;NF8P2(CW3QqY;Qr}UL3&=KNB2#HRX>3r5x z084jf(UNXl6i|^0{HMFI1iJ66fyKoL*CPx`LGBnXkA7w>ROIgN3U9+m72C;^esNV9bqyG7Xg@W=@C5NJr5LGHrjw zCC@WK_O!p^ii67y?lc%2)Am?Rv!$)d!+= zZGpBbnlay-z-KVn{_1{>nf29n_dAol(Skj#y=6^Dy$3yk>maxLC6I7D+EoY221Vt{-5OGGG3_ zP+j7ct#+m){iy@_Z&+=Wap`@>Z`2RW6L0bfiAZ#CEwbLh+Dlao!?I#7el&6NLM3;f z^~$X+^<^&(pAvb>6?^ee1s0=Q-KLt<6@&dF&lH_JlCDfzSY0ukrHrj*WRnNux5^ zFZp26#3{ep-!U;~;i*NFrv193W0JWfWN~)h>sSGno&Rjs;>k0gUvz!4W&66tQ|7$7 z|N4}Iy{8uca^4?0uK&_{C}c^_g13j<$SHg;Ysu8be_C{7YSGzsOQtRTWdDt6PhLB< zd_4c?s|Hw|8gc&zbapf7cABID=$lKVOQ>_2oO^fkSj9&U{;zI#uNhB>S>iC&vlH+pGQP8;_5O#wC-7gNKzB%F+;x@oCNlo(&(Zq@Ka~^cril!X zjOJZy@KgCs^Zp#)_yoGmS_9ADPQu)2uZOyg`y;%%u;@}hFVtaN$Eddo4o4$P=DJl4N1=;-% zH)!iSL~SVA@a;l>7Yw``I}NM5N%`g=7y=8v-{JZ7AI^@S;H-$~Clm>fVK#?+HgiYC>^3txSi^ zO^v-&(T2tiu^R$6n$mHp7o_cXJLo1;w1HChF7^3B?1uae8!yyt=onps%FZD+9J@A*8hmbB8kzEr=)uV zi)J7(HIhUI9*}X-u=FlvxE(%xDrpx7S!yaYqlx%U#w~^3jSN+Di=0%Y@dq+@)}|=7 zk0PIaHd{oRHbilx5%PADk`%cM&gfsVvywuCm8iwe5?SwGq*rsI@pfgXZp?G@(;g}J z`vrH4Zyc0ctmv5+k!T6*>%Y49n#(oK;~SL`gC-Pgp4|$!aMCzkEs2RLG$s32oQyf# zGk$Gtxo=!GIjp?j!54=s;?%|R878hy(Wf-mX*U$PlNha$)X8IWtaU`MQE!i!`jP1v z^JuC$#5k8q+=n+j#w$i`%(eIZ?oGVfP={v4fO-R8C3h8-#7ESaKh9Vm`egi8FD=#u5CBwRGqCFGSR3s&7J{ud&qA%ZdGK3?rLLTYIVIy7DH}(6PBuaeNlbe|Gh_ z;qj0<)8J3`O@D`z%?&>C;3skI&FQb+U8qjAwL8~h;6;1qun;d@JS%wF<86)ChSwVN z&E6c|uj;lZAh!v7-a6M}u)bo#yLnD5R8bBB{a8 zthXIugBgpMbK6o#h+?@e+}y%Td&EVgS38-8wW5^h#9GHLwm2}rXJbEZJCRBs_m8U% zc4q!&kVL9>Exa(6)%?1+qu=|w?EP{P+qu}ya|04Fo;3&HEIg0!4+^a38HLW zXj<=#qJy(QSe~+VWYuZeI^`_7g$6JM=O7@9vK6gdzq4r_Es z846xV4{Cw1C~XOAqrhJjvVc)QD!PjX?1@D* zpeh&%L0h0I*ea=E@NTf`w!h&&#&4_(wam`1HWK#Jsr4LxhmkN$>b?}nS9Tc*U#e$% zKe*mHd+*EdzR1}^^){B{drBV)O^n#L>%EsveL}N0ng06DPN3G@w+6OUZY)u@hBwY| z1l!WY7l=c2lryl02@y8T8`*1W#w6x@r;*DC!BalGmQ?9>&zC!wr!0Am9H@`0)C6j7 zwvQ9JS8V9z6TH*JI*$fC7&U^ZN*ECz{cEz35jM+5k&np}ZM;Mi5S=i_a?be3CVf(o z)yH(OuIC>GnaCVNtGO0S4Px1PM|&To(p zl`CDV)h$k&G24>MGxM>DMjR;LW|M~H=#zbV6~HMtB+-SI^-PnELAoCHe3>l2`aw<%uOU?se~@$lizDr~aoyuSVzpGEKY z>^*_6Ie~5)&F~DbZYQX`ix0l$WAy%`pY{oKlf?&}*Br0S{-^!B=KbmZ!xQk@?Ek}q z^8Rby6Zp41u!D$4NA=V1z zODBYwF$Ra27ecJX5D~g8t*b=p7~(6YgOFn(#9~+o<#pl3YtURV5rp81F(K_!!bA`w zKq#-64&rK$T1t!qp|(O;rG=ExsxcIV)QYJp#)ME?asBr$UcC3G_O|TG5u50%`YAt> zH)Ahjq$gC|cd2;Oo*i#*z~btHjiwg;%gbES&a|+ zJgqyoSAU$lkA0prvd&{cWGOkbOXTdq53!JHrZ&C2ipwSix%KIR{6kB~xn@U;FS);G zf|^z5AMtyL)SDcx_`n*~z)@8<+qNF>+1F2HeWK0mLqc^ac6ngEt>hO8V@R!eYf=eY z8=p>sW*=Ve7alEPN@ZfX_P!|?0iGWnYnZO)tSQB%>$DZ)YslbqWz^6)k1_?ututo!&0oi5Gmel+(`@m#CvkQ0 zVN(~k?C2W8ea#GRB44oYgYxI+9sE?f+1e0Zv3Wt$aM=rmCns0Du=t}VWLt{PZK~L^ z^zs|B7oTkZpyI`4pM5HG@Zt!&qu6hRd~0d&6njhH+BWr(8m+$2$t2IuY~}g{t<@y; zXI-r;ral$&e)bGcb>_*g0;P~M=CY{uXY#)NRg4y{v}ceB1xllXoMUB|oohLn_B=wx z{ZmhJ%q3^?p}<*?UE{)8-k(twvn)C15)rmtuQ;lM?3yCiFX95U@>z z;YWS~KYVth>v?n$ABN8LJx+087l4cQg9C`@q#x%EM4}bpKpWcV;;D0iMhi8Rspaou0uo9GnKmy#OBn8}qI!m=!INWHF z3uM0z(0^Xb(83lQvcg zNQJt}_c~}BIJLcjB0*9>NNRNhTY;+Ja|2oewSZTkDgZ3iVu4z~D_T(r)aq)feB%a+ zDuG%cEbtU{xOwWofmgJ@1u`utY~iJAFuzgH8<>lByZ}ofwotblrO_YxlkvlR`(4=O z9`9pgz7o4`nw%O2prfqT#~giDJK>d_W56yu8>(Z;^tk#BSa}WXn$;lo4LT{Vbk)2I z?CLkwhp%%=^y6!kdNoI08MSGS(B+cCJd&$b&sjt!{vXSGubls|ENEP5)^BFM*=RSf zEn6vVWoo6)jkfXPXogQd>KsWf%kxECm9sBVGUZCdMpw24#?$ zWMj?C%R|VRHHM{P$Ep{Hk^1T@Lr;>ohhXGHv}=LeG}yt?6Y;EfSw5kt7=bP>ZblmwU}j$=>eQ3#qw#a+<&7kU}Uv4G}vTH zmqm@y+hXFXt%ua{Yuzb5b+wLBep&}fRrW~a8bfoi_d2TglhsMm0SDU37~O}wb47$j zZ4>v~X?3m?pF3mpjjeL0`mc*~@|hA{u#=?w*N&Si`tuIcH1=<&PCv#haoH5SeCetRtZ3jJH@+gBPsZrr|#i&pUL{o3KKtog_Hzkl3t@yQcJ zVQyWUp-|}8A0H7mx4qd<(pIlYO{nIHY03O^uJlQBhnz@JaFy)T#2#zjo>Xz)_2Z(N zHY1S)TeFx!tNwQVPdRTA^5GnrgZq>9;%}Dpcr?DRgUk4}Y=Gh6FU!8(jKUA|M)Ll@ zcB2#Mei;S-&xd80l!4JO`NG)C6HuVTGN2r7;Jb5P=AkxF9zp<^odMi{Jm57@8@P`~ z0RTiGBYX(d=?{p5zYahIpab$ypu^w{gb1Jm@_=+a&3r%}z#X6lb0SQLFh!!t1|S~b zj=DpDlNgzKiu$Ot?($R0SMwKb!qleDm_%_zP zqUUHo)tG+y7Y@mMLl1m(ATYMvH%ycATJDLOq>=$jwJt_18WnAbAD#0=8(HlWLST|} zyAS*J4I3a{olN?8JGhBs6`AL%56NS# zP9}(}b+Sz2Xtm96P_W}H>l^7l>(jq+zBob3Wz}WL-xxA!>XP&OCq4GGWN3D7Mf~g8 z(^sVqo&22z1oA5TymTOM#r;PN(^n3=aA5kXzdR&;A|)ZA&HTyOLdLv-D;iR>fqU{( z3Bke_DgXV1C|+sYCa_v8GqiQ*bY|o~ib%CF58;J5`?1U=<5NAqMt>S@2zIK<-8;h#RBn3CPdCahXE|4V0^x#PPh`Al7a(3%FPG&Fp+oDIl%wb>j_2AWw zS3TaP-u%Khdv$of>c@Bj-7dcn_|^FZPz?YKQYDB5=mm_yz>IPi2nRevhh!L!Vc-Px z0>V+vk}{Y_q@=?qpcg0$#0Aiz?Z03xKnTDClQT+LAS;Skcr$p?4H(w}u|R+jCNV{$ z0SCHYj}FoxPhzeH#G+XSP!<9g04<;wun?dHGNjvI09swShR#KMU6fTX^f!a1KvqJW zp}7O-2yO&ofxAGD;3y2zFf$V}qrbaBaSMnA)&f&uB8X`jWhx*g7!rX|nq?3~N}6Rj zDP$QS#{#!7PNRGU!4l&%OwItDKraZiKq)#rqtHcXV_>j_f4v6o0(610y5bDK7gpwZ zrOI#d@&7mZg}g847X}OY1>z|}K7#zhAG`7kB}N@dmhxnv-!ffM=1$}nwlCM!4r)2^ z!gyfVTOs6V>A=KhQmB{-8D{iG3h^kbd%>ys~hqpY@hLD5l=-6N05L z^0@S|o9+vUuHDMn(zhylMjF(Kc@6$iC7Z2m7~-Nw8EAvX(9uoqV&BJ#fLx1sViX7N zb72RJnXd~-EL9eZgKoMwQQsPCorK+&?p*OWlA{6D*~ICa9TQxV#vIIV&h}kb=9RXBD4X$I+>zb}MC7#x; zZt}TexrU`LRmyknfBO72SIWzNh0W=G?#tpjQ)zd3sPS5cjoKS^_!i$4-v88( _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); - SetBackgroudColor(pValue); - } - else if (srName == _T("fgcolor")) { - LPCTSTR pValue = strValue.c_str(); - while (*pValue > _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); - SetForegroudColor(pValue); - } - else if (srName == _T("gradientcolor")) { - LPCTSTR pValue = strValue.c_str(); - while (*pValue > _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); - SetCircleGradientColor(pValue); - } - else Progress::SetAttribute(srName, strValue); -} - -void CircleProgress::PaintStatusImage(IRenderContext* pRender) -{ - Progress::PaintStatusImage(pRender); - if (m_bCircular) - { - //ĿǰIRenderContextкܶGDI+ӿδʵ֣ʱֱgdi+ͼ - //Ժܻʵ1DrawArc 2Penbrush() 3Graphics - int direction = m_bClockwise ? 1 : -1; //ת - int bordersize = 1; //ȿĿǰʹ1 - - Gdiplus::Graphics graphics(pRender->GetDC()); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - Gdiplus::Pen bgPen(m_dwBackgroundColor, m_nCircleWidth); - // Բ - CPoint center; - center.x = m_rcItem.left + (m_rcItem.right - m_rcItem.left) / 2; - center.y = m_rcItem.top + (m_rcItem.bottom - m_rcItem.top) / 2; - - // ؼڵεı߽ - int side = min(m_rcItem.right - m_rcItem.left, m_rcItem.bottom - m_rcItem.top); - //UiRect rcBorder; ȻUiRect RectFתֱgdiRectF - Gdiplus::RectF rcBorder; - rcBorder.X = center.x - side / 2; - rcBorder.Y = center.y - side / 2; - rcBorder.Width = rcBorder.Height = side; - - Gdiplus::RectF outer = rcBorder; - if (m_pIndicator) { - outer.Inflate(-1.0F *m_pIndicator->GetWidth() / 2, -1.0F * m_pIndicator->GetWidth() / 2); - } - else - { - outer.Inflate(-0.5 * m_nCircleWidth, -0.5 * m_nCircleWidth); - } - outer.Inflate(-1, -1); - - - if (m_dwGradientColor == 0) - { - //ʹýɫֱǰɫ - Gdiplus::Pen fgPen(m_dwForegroundColor, m_nCircleWidth); - graphics.DrawArc(&bgPen, outer, 270, 360); //270濪ʼΪ0Ļұ߿ʼ - graphics.DrawArc(&fgPen, outer, 270, direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin)); - } - else - { - Gdiplus::REAL factors[4] = { 0.0f, 0.4f, 0.6f, 1.0f }; - Gdiplus::REAL positions[4] = { 0.0f, 0.2f, 0.8f, 1.0f }; - - Gdiplus::LinearGradientBrush lgbrush(rcBorder, m_dwForegroundColor, m_dwGradientColor, Gdiplus::LinearGradientModeVertical); - lgbrush.SetBlend(factors, positions, 4); - graphics.DrawArc(&bgPen, outer, 270, 360); - Gdiplus::Pen fgPen(&lgbrush, m_nCircleWidth); - graphics.DrawArc(&fgPen, outer, 270, direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin)); - - } - - //תָʾͼ꣬Ҫõ - if (m_pIndicator) - { - Gdiplus::Matrix matrix; - matrix.RotateAt(direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin), Gdiplus::PointF(center.x, center.y), Gdiplus::MatrixOrderAppend); - graphics.SetTransform(&matrix); - Gdiplus::RectF rectf; - rectf.X = center.x - m_pIndicator->GetWidth() / 2; - rectf.Y = outer.Y + bordersize / 2 - m_pIndicator->GetHeight() / 2; - rectf.Width = m_pIndicator->GetWidth(); - rectf.Height = m_pIndicator->GetHeight(); - graphics.DrawImage(m_pIndicator, rectf); - } - - } -} - -void CircleProgress::ClearImageCache() -{ - __super::ClearImageCache(); - if (m_pIndicator) - { - delete m_pIndicator; - m_pIndicator = nullptr; - } -} - -void CircleProgress::SetCircular(bool bCircular /*= true*/) -{ - m_bCircular = bCircular; - Invalidate(); -} - -void CircleProgress::SetClockwiseRotation(bool bClockwise /*= true*/) -{ - if (bClockwise != m_bClockwise) - { - m_bClockwise = bClockwise; - if (m_pIndicator) - { - //ѾתͼƬת෴ķ - m_pIndicator->RotateFlip(Gdiplus::Rotate180FlipNone); - } - - } -} - -void CircleProgress::SetCircleWidth(int nCircleWidth) -{ - m_nCircleWidth = nCircleWidth; - Invalidate(); -} - - -void CircleProgress::SetBackgroudColor(const std::wstring& strColor) -{ - m_dwBackgroundColor = GlobalManager::GetTextColor(strColor); - ASSERT(m_dwBackgroundColor != 0); - Invalidate(); -} - -void CircleProgress::SetForegroudColor(const std::wstring& strColor) -{ - m_dwForegroundColor = GlobalManager::GetTextColor(strColor); - ASSERT(m_dwForegroundColor != 0); - Invalidate(); -} - -void CircleProgress::SetIndicator(const std::wstring& sIndicatorImage) -{ - if (m_sIndicatorImage != sIndicatorImage) - { - m_sIndicatorImage = sIndicatorImage; - if (m_pIndicator) - { - delete m_pIndicator; - m_pIndicator = nullptr; - } - std::wstring imagepath = m_sIndicatorImage; - if (!::PathFileExistsW(imagepath.c_str())) { - imagepath = GlobalManager::GetResourcePath() + m_pWindow->GetWindowResourcePath() + imagepath; - } - if (!::PathFileExistsW(imagepath.c_str())) { - return; - } - m_pIndicator = new Gdiplus::Image(imagepath.c_str()); - - Gdiplus::Status state = m_pIndicator->GetLastStatus(); - if (Gdiplus::Ok == state) - { - // ٶͼƬָ - m_pIndicator->RotateFlip(m_bClockwise ? Gdiplus::Rotate90FlipNone : Gdiplus::Rotate270FlipNone); - Invalidate(); - } - } -} - -void CircleProgress::SetCircleGradientColor(const std::wstring& strColor) -{ - m_dwGradientColor = GlobalManager::GetTextColor(strColor); - ASSERT(m_dwGradientColor != 0); - Invalidate(); -} - -} +#include "stdafx.h" +#include "CircleProgress.h" +#include "shlwapi.h" + +namespace ui +{ + +CircleProgress::CircleProgress() : + m_bCircular(true), + m_bClockwise(true), + m_nCircleWidth(1), + m_dwBackgroundColor(0), + m_dwForegroundColor(0), + m_dwGradientColor(0), + m_pIndicator(nullptr) +{ + +} + +void CircleProgress::SetAttribute(const std::wstring& srName, const std::wstring& strValue) +{ + if (srName == _T("circular")) SetCircular(strValue == _T("true")); + else if (srName == _T("circlewidth")) SetCircleWidth(_ttoi(strValue.c_str())); + else if (srName == _T("indicator")) SetIndicator(strValue); + else if (srName == _T("clockwise")) SetClockwiseRotation(strValue == _T("true")); + else if (srName == _T("bgcolor")) { + LPCTSTR pValue = strValue.c_str(); + while (*pValue > _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); + SetBackgroudColor(pValue); + } + else if (srName == _T("fgcolor")) { + LPCTSTR pValue = strValue.c_str(); + while (*pValue > _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); + SetForegroudColor(pValue); + } + else if (srName == _T("gradientcolor")) { + LPCTSTR pValue = strValue.c_str(); + while (*pValue > _T('\0') && *pValue <= _T(' ')) pValue = ::CharNext(pValue); + SetCircleGradientColor(pValue); + } + else Progress::SetAttribute(srName, strValue); +} + +void CircleProgress::PaintStatusImage(IRenderContext* pRender) +{ + Progress::PaintStatusImage(pRender); + if (m_bCircular) + { + //ĿǰIRenderContextкܶGDI+ӿδʵ֣ʱֱgdi+ͼ + //Ժܻʵ1DrawArc 2Penbrush() 3Graphics + int direction = m_bClockwise ? 1 : -1; //ת + int bordersize = 1; //ȿĿǰʹ1 + + Gdiplus::Graphics graphics(pRender->GetDC()); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + Gdiplus::Pen bgPen(m_dwBackgroundColor, m_nCircleWidth); + // Բ + CPoint center; + center.x = m_rcItem.left + (m_rcItem.right - m_rcItem.left) / 2; + center.y = m_rcItem.top + (m_rcItem.bottom - m_rcItem.top) / 2; + + // ؼڵεı߽ + int side = min(m_rcItem.right - m_rcItem.left, m_rcItem.bottom - m_rcItem.top); + //UiRect rcBorder; ȻUiRect RectFתֱgdiRectF + Gdiplus::RectF rcBorder; + rcBorder.X = center.x - side / 2; + rcBorder.Y = center.y - side / 2; + rcBorder.Width = rcBorder.Height = side; + + Gdiplus::RectF outer = rcBorder; + if (m_pIndicator) { + outer.Inflate(-1.0F *m_pIndicator->GetWidth() / 2, -1.0F * m_pIndicator->GetWidth() / 2); + } + else + { + outer.Inflate(-0.5 * m_nCircleWidth, -0.5 * m_nCircleWidth); + } + outer.Inflate(-1, -1); + + + if (m_dwGradientColor == 0) + { + //ʹýɫֱǰɫ + Gdiplus::Pen fgPen(m_dwForegroundColor, m_nCircleWidth); + graphics.DrawArc(&bgPen, outer, 270, 360); //270濪ʼΪ0Ļұ߿ʼ + graphics.DrawArc(&fgPen, outer, 270, direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin)); + } + else + { + Gdiplus::REAL factors[4] = { 0.0f, 0.4f, 0.6f, 1.0f }; + Gdiplus::REAL positions[4] = { 0.0f, 0.2f, 0.8f, 1.0f }; + + Gdiplus::LinearGradientBrush lgbrush(rcBorder, m_dwForegroundColor, m_dwGradientColor, Gdiplus::LinearGradientModeVertical); + lgbrush.SetBlend(factors, positions, 4); + graphics.DrawArc(&bgPen, outer, 270, 360); + Gdiplus::Pen fgPen(&lgbrush, m_nCircleWidth); + graphics.DrawArc(&fgPen, outer, 270, direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin)); + + } + + //תָʾͼ꣬Ҫõ + if (m_pIndicator) + { + Gdiplus::Matrix matrix; + matrix.RotateAt(direction * 360 * (m_nValue - m_nMin) / (m_nMax - m_nMin), Gdiplus::PointF(center.x, center.y), Gdiplus::MatrixOrderAppend); + graphics.SetTransform(&matrix); + Gdiplus::RectF rectf; + rectf.X = center.x - m_pIndicator->GetWidth() / 2; + rectf.Y = outer.Y + bordersize / 2 - m_pIndicator->GetHeight() / 2; + rectf.Width = m_pIndicator->GetWidth(); + rectf.Height = m_pIndicator->GetHeight(); + graphics.DrawImage(m_pIndicator, rectf); + } + + } +} + +void CircleProgress::ClearImageCache() +{ + __super::ClearImageCache(); + if (m_pIndicator) + { + delete m_pIndicator; + m_pIndicator = nullptr; + } +} + +void CircleProgress::SetCircular(bool bCircular /*= true*/) +{ + m_bCircular = bCircular; + Invalidate(); +} + +void CircleProgress::SetClockwiseRotation(bool bClockwise /*= true*/) +{ + if (bClockwise != m_bClockwise) + { + m_bClockwise = bClockwise; + if (m_pIndicator) + { + //ѾתͼƬת෴ķ + m_pIndicator->RotateFlip(Gdiplus::Rotate180FlipNone); + } + + } +} + +void CircleProgress::SetCircleWidth(int nCircleWidth) +{ + m_nCircleWidth = nCircleWidth; + Invalidate(); +} + + +void CircleProgress::SetBackgroudColor(const std::wstring& strColor) +{ + m_dwBackgroundColor = GlobalManager::GetTextColor(strColor); + ASSERT(m_dwBackgroundColor != 0); + Invalidate(); +} + +void CircleProgress::SetForegroudColor(const std::wstring& strColor) +{ + m_dwForegroundColor = GlobalManager::GetTextColor(strColor); + ASSERT(m_dwForegroundColor != 0); + Invalidate(); +} + +void CircleProgress::SetIndicator(const std::wstring& sIndicatorImage) +{ + if (m_sIndicatorImage != sIndicatorImage) + { + m_sIndicatorImage = sIndicatorImage; + if (m_pIndicator) + { + delete m_pIndicator; + m_pIndicator = nullptr; + } + std::wstring imagepath = m_sIndicatorImage; + if (!::PathFileExistsW(imagepath.c_str())) { + imagepath = GlobalManager::GetResourcePath() + m_pWindow->GetWindowResourcePath() + imagepath; + } + if (!::PathFileExistsW(imagepath.c_str())) { + return; + } + m_pIndicator = new Gdiplus::Image(imagepath.c_str()); + + Gdiplus::Status state = m_pIndicator->GetLastStatus(); + if (Gdiplus::Ok == state) + { + // ٶͼƬָ + m_pIndicator->RotateFlip(m_bClockwise ? Gdiplus::Rotate90FlipNone : Gdiplus::Rotate270FlipNone); + Invalidate(); + } + } +} + +void CircleProgress::SetCircleGradientColor(const std::wstring& strColor) +{ + m_dwGradientColor = GlobalManager::GetTextColor(strColor); + ASSERT(m_dwGradientColor != 0); + Invalidate(); +} + +} diff --git a/tool_kits/duilib/Control/CircleProgress.h b/duilib/Control/CircleProgress.h similarity index 96% rename from tool_kits/duilib/Control/CircleProgress.h rename to duilib/Control/CircleProgress.h index c3e4c008..f0d1ba10 100644 --- a/tool_kits/duilib/Control/CircleProgress.h +++ b/duilib/Control/CircleProgress.h @@ -1,89 +1,89 @@ -/** @file CircleProgress.h -* @brief ͽؼԲмı85% -* @copyright (c) 2019-2022, NetEase Inc. All rights reserved -* @author Xuhuajie -* @date 2019/8/14 -*/ - -#ifndef UI_CONTROL_CIRCLEPROGRESS_H_ -#define UI_CONTROL_CIRCLEPROGRESS_H_ - -#pragma once - -namespace ui -{ - -class UILIB_API CircleProgress : public Progress -{ -public: - CircleProgress(); - - /// д෽ṩԻܣο - virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue) override; - virtual void PaintStatusImage(IRenderContext* pRender) override; - virtual void ClearImageCache() override; - - /** - * @brief ûͽĬΪͨ - * @param[in] bCircular Ϊ true ʱΪͽfalse ʱΪʽĬΪ true - * @return - */ - void SetCircular(bool bCircular = true); - - /** - * @brief õ - * @param[in] bClockwise Ϊ true ʱΪ˳ʱ룬false ʱΪʱ룬ĬΪ true - * @return - */ - void SetClockwiseRotation(bool bClockwise = true); - - /** - * @brief Բ - * @param[in] nCircleWidth ֵ - * @return - */ - void SetCircleWidth(int nCircleWidth); - - /** - * @brief ýɫ - * @param[in] strColorҪõıɫַַ global.xml д - * @return - */ - void SetBackgroudColor(const std::wstring& strColor); - - /** - * @brief ýǰɫ - * @param[in] strColorҪõǰɫַַ global.xml д - * @return - */ - void SetForegroudColor(const std::wstring& strColor); - - /** - * @brief ýǰɫ SetForegroudColor ͬʱʹãԲ,޽Ч - * @param[in] strColorҪõǰɫַַ global.xml д - * @return - */ - void SetCircleGradientColor(const std::wstring& strColor); - - /** - * @brief ýָʾƶͼ - * @param[in] sIndicatorImage ҪõͼƬ - * @return - */ - void SetIndicator(const std::wstring& sIndicatorImage); - -protected: - bool m_bCircular; - bool m_bClockwise; - int m_nCircleWidth; - DWORD m_dwBackgroundColor; - DWORD m_dwForegroundColor; - DWORD m_dwGradientColor; - Gdiplus::Image* m_pIndicator; //ĿǰάԴ - std::wstring m_sIndicatorImage; - -}; - -} // namespace ui - -#endif // UI_CONTROL_CIRCLEPROGRESS_H_ +/** @file CircleProgress.h +* @brief ͽؼԲмı85% +* @copyright (c) 2019-2022, NetEase Inc. All rights reserved +* @author Xuhuajie +* @date 2019/8/14 +*/ + +#ifndef UI_CONTROL_CIRCLEPROGRESS_H_ +#define UI_CONTROL_CIRCLEPROGRESS_H_ + +#pragma once + +namespace ui +{ + +class UILIB_API CircleProgress : public Progress +{ +public: + CircleProgress(); + + /// д෽ṩԻܣο + virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue) override; + virtual void PaintStatusImage(IRenderContext* pRender) override; + virtual void ClearImageCache() override; + + /** + * @brief ûͽĬΪͨ + * @param[in] bCircular Ϊ true ʱΪͽfalse ʱΪʽĬΪ true + * @return + */ + void SetCircular(bool bCircular = true); + + /** + * @brief õ + * @param[in] bClockwise Ϊ true ʱΪ˳ʱ룬false ʱΪʱ룬ĬΪ true + * @return + */ + void SetClockwiseRotation(bool bClockwise = true); + + /** + * @brief Բ + * @param[in] nCircleWidth ֵ + * @return + */ + void SetCircleWidth(int nCircleWidth); + + /** + * @brief ýɫ + * @param[in] strColorҪõıɫַַ global.xml д + * @return + */ + void SetBackgroudColor(const std::wstring& strColor); + + /** + * @brief ýǰɫ + * @param[in] strColorҪõǰɫַַ global.xml д + * @return + */ + void SetForegroudColor(const std::wstring& strColor); + + /** + * @brief ýǰɫ SetForegroudColor ͬʱʹãԲ,޽Ч + * @param[in] strColorҪõǰɫַַ global.xml д + * @return + */ + void SetCircleGradientColor(const std::wstring& strColor); + + /** + * @brief ýָʾƶͼ + * @param[in] sIndicatorImage ҪõͼƬ + * @return + */ + void SetIndicator(const std::wstring& sIndicatorImage); + +protected: + bool m_bCircular; + bool m_bClockwise; + int m_nCircleWidth; + DWORD m_dwBackgroundColor; + DWORD m_dwForegroundColor; + DWORD m_dwGradientColor; + Gdiplus::Image* m_pIndicator; //ĿǰάԴ + std::wstring m_sIndicatorImage; + +}; + +} // namespace ui + +#endif // UI_CONTROL_CIRCLEPROGRESS_H_ diff --git a/tool_kits/duilib/Control/Combo.cpp b/duilib/Control/Combo.cpp similarity index 100% rename from tool_kits/duilib/Control/Combo.cpp rename to duilib/Control/Combo.cpp diff --git a/tool_kits/duilib/Control/Combo.h b/duilib/Control/Combo.h similarity index 100% rename from tool_kits/duilib/Control/Combo.h rename to duilib/Control/Combo.h diff --git a/tool_kits/duilib/Control/Label.h b/duilib/Control/Label.h similarity index 100% rename from tool_kits/duilib/Control/Label.h rename to duilib/Control/Label.h diff --git a/tool_kits/duilib/Control/List.cpp b/duilib/Control/List.cpp similarity index 100% rename from tool_kits/duilib/Control/List.cpp rename to duilib/Control/List.cpp diff --git a/tool_kits/duilib/Control/List.h b/duilib/Control/List.h similarity index 100% rename from tool_kits/duilib/Control/List.h rename to duilib/Control/List.h diff --git a/tool_kits/duilib/Control/Option.h b/duilib/Control/Option.h similarity index 100% rename from tool_kits/duilib/Control/Option.h rename to duilib/Control/Option.h diff --git a/tool_kits/duilib/Control/Progress.cpp b/duilib/Control/Progress.cpp similarity index 100% rename from tool_kits/duilib/Control/Progress.cpp rename to duilib/Control/Progress.cpp diff --git a/tool_kits/duilib/Control/Progress.h b/duilib/Control/Progress.h similarity index 100% rename from tool_kits/duilib/Control/Progress.h rename to duilib/Control/Progress.h diff --git a/tool_kits/duilib/Control/RichEdit.cpp b/duilib/Control/RichEdit.cpp similarity index 100% rename from tool_kits/duilib/Control/RichEdit.cpp rename to duilib/Control/RichEdit.cpp diff --git a/tool_kits/duilib/Control/RichEdit.h b/duilib/Control/RichEdit.h similarity index 100% rename from tool_kits/duilib/Control/RichEdit.h rename to duilib/Control/RichEdit.h diff --git a/tool_kits/duilib/Control/ScrollBar.cpp b/duilib/Control/ScrollBar.cpp similarity index 100% rename from tool_kits/duilib/Control/ScrollBar.cpp rename to duilib/Control/ScrollBar.cpp diff --git a/tool_kits/duilib/Control/ScrollBar.h b/duilib/Control/ScrollBar.h similarity index 100% rename from tool_kits/duilib/Control/ScrollBar.h rename to duilib/Control/ScrollBar.h diff --git a/tool_kits/duilib/Control/Slider.cpp b/duilib/Control/Slider.cpp similarity index 100% rename from tool_kits/duilib/Control/Slider.cpp rename to duilib/Control/Slider.cpp diff --git a/tool_kits/duilib/Control/Slider.h b/duilib/Control/Slider.h similarity index 100% rename from tool_kits/duilib/Control/Slider.h rename to duilib/Control/Slider.h diff --git a/tool_kits/duilib/Control/TreeView.cpp b/duilib/Control/TreeView.cpp similarity index 100% rename from tool_kits/duilib/Control/TreeView.cpp rename to duilib/Control/TreeView.cpp diff --git a/tool_kits/duilib/Control/TreeView.h b/duilib/Control/TreeView.h similarity index 100% rename from tool_kits/duilib/Control/TreeView.h rename to duilib/Control/TreeView.h diff --git a/tool_kits/duilib/Control/VirtualListBox.cpp b/duilib/Control/VirtualListBox.cpp similarity index 100% rename from tool_kits/duilib/Control/VirtualListBox.cpp rename to duilib/Control/VirtualListBox.cpp diff --git a/tool_kits/duilib/Control/VirtualListBox.h b/duilib/Control/VirtualListBox.h similarity index 100% rename from tool_kits/duilib/Control/VirtualListBox.h rename to duilib/Control/VirtualListBox.h diff --git a/tool_kits/duilib/Core/Box.cpp b/duilib/Core/Box.cpp similarity index 100% rename from tool_kits/duilib/Core/Box.cpp rename to duilib/Core/Box.cpp diff --git a/tool_kits/duilib/Core/Box.h b/duilib/Core/Box.h similarity index 100% rename from tool_kits/duilib/Core/Box.h rename to duilib/Core/Box.h diff --git a/tool_kits/duilib/Core/Control.cpp b/duilib/Core/Control.cpp similarity index 100% rename from tool_kits/duilib/Core/Control.cpp rename to duilib/Core/Control.cpp diff --git a/tool_kits/duilib/Core/Control.h b/duilib/Core/Control.h similarity index 100% rename from tool_kits/duilib/Core/Control.h rename to duilib/Core/Control.h diff --git a/tool_kits/duilib/Core/Define.cpp b/duilib/Core/Define.cpp similarity index 100% rename from tool_kits/duilib/Core/Define.cpp rename to duilib/Core/Define.cpp diff --git a/tool_kits/duilib/Core/Define.h b/duilib/Core/Define.h similarity index 100% rename from tool_kits/duilib/Core/Define.h rename to duilib/Core/Define.h diff --git a/tool_kits/duilib/Core/GlobalManager.cpp b/duilib/Core/GlobalManager.cpp similarity index 100% rename from tool_kits/duilib/Core/GlobalManager.cpp rename to duilib/Core/GlobalManager.cpp diff --git a/tool_kits/duilib/Core/GlobalManager.h b/duilib/Core/GlobalManager.h similarity index 100% rename from tool_kits/duilib/Core/GlobalManager.h rename to duilib/Core/GlobalManager.h diff --git a/tool_kits/duilib/Core/Image.cpp b/duilib/Core/Image.cpp similarity index 100% rename from tool_kits/duilib/Core/Image.cpp rename to duilib/Core/Image.cpp diff --git a/tool_kits/duilib/Core/Image.h b/duilib/Core/Image.h similarity index 100% rename from tool_kits/duilib/Core/Image.h rename to duilib/Core/Image.h diff --git a/tool_kits/duilib/Core/Markup.cpp b/duilib/Core/Markup.cpp similarity index 100% rename from tool_kits/duilib/Core/Markup.cpp rename to duilib/Core/Markup.cpp diff --git a/tool_kits/duilib/Core/Markup.h b/duilib/Core/Markup.h similarity index 100% rename from tool_kits/duilib/Core/Markup.h rename to duilib/Core/Markup.h diff --git a/tool_kits/duilib/Core/Placeholder.cpp b/duilib/Core/Placeholder.cpp similarity index 100% rename from tool_kits/duilib/Core/Placeholder.cpp rename to duilib/Core/Placeholder.cpp diff --git a/tool_kits/duilib/Core/Placeholder.h b/duilib/Core/Placeholder.h similarity index 100% rename from tool_kits/duilib/Core/Placeholder.h rename to duilib/Core/Placeholder.h diff --git a/tool_kits/duilib/Core/Window.cpp b/duilib/Core/Window.cpp similarity index 100% rename from tool_kits/duilib/Core/Window.cpp rename to duilib/Core/Window.cpp diff --git a/tool_kits/duilib/Core/Window.h b/duilib/Core/Window.h similarity index 100% rename from tool_kits/duilib/Core/Window.h rename to duilib/Core/Window.h diff --git a/tool_kits/duilib/Core/WindowBuilder.cpp b/duilib/Core/WindowBuilder.cpp similarity index 100% rename from tool_kits/duilib/Core/WindowBuilder.cpp rename to duilib/Core/WindowBuilder.cpp diff --git a/tool_kits/duilib/Core/WindowBuilder.h b/duilib/Core/WindowBuilder.h similarity index 100% rename from tool_kits/duilib/Core/WindowBuilder.h rename to duilib/Core/WindowBuilder.h diff --git a/tool_kits/duilib/Render/Bitmap.cpp b/duilib/Render/Bitmap.cpp similarity index 100% rename from tool_kits/duilib/Render/Bitmap.cpp rename to duilib/Render/Bitmap.cpp diff --git a/tool_kits/duilib/Render/Bitmap.h b/duilib/Render/Bitmap.h similarity index 100% rename from tool_kits/duilib/Render/Bitmap.h rename to duilib/Render/Bitmap.h diff --git a/tool_kits/duilib/Render/Brush.cpp b/duilib/Render/Brush.cpp similarity index 100% rename from tool_kits/duilib/Render/Brush.cpp rename to duilib/Render/Brush.cpp diff --git a/tool_kits/duilib/Render/Brush.h b/duilib/Render/Brush.h similarity index 100% rename from tool_kits/duilib/Render/Brush.h rename to duilib/Render/Brush.h diff --git a/tool_kits/duilib/Render/Clip.cpp b/duilib/Render/Clip.cpp similarity index 100% rename from tool_kits/duilib/Render/Clip.cpp rename to duilib/Render/Clip.cpp diff --git a/tool_kits/duilib/Render/Clip.h b/duilib/Render/Clip.h similarity index 100% rename from tool_kits/duilib/Render/Clip.h rename to duilib/Render/Clip.h diff --git a/tool_kits/duilib/Render/Factory.cpp b/duilib/Render/Factory.cpp similarity index 100% rename from tool_kits/duilib/Render/Factory.cpp rename to duilib/Render/Factory.cpp diff --git a/tool_kits/duilib/Render/Factory.h b/duilib/Render/Factory.h similarity index 100% rename from tool_kits/duilib/Render/Factory.h rename to duilib/Render/Factory.h diff --git a/tool_kits/duilib/Render/IRender.cpp b/duilib/Render/IRender.cpp similarity index 100% rename from tool_kits/duilib/Render/IRender.cpp rename to duilib/Render/IRender.cpp diff --git a/tool_kits/duilib/Render/IRender.h b/duilib/Render/IRender.h similarity index 100% rename from tool_kits/duilib/Render/IRender.h rename to duilib/Render/IRender.h diff --git a/tool_kits/duilib/Render/Matrix.cpp b/duilib/Render/Matrix.cpp similarity index 100% rename from tool_kits/duilib/Render/Matrix.cpp rename to duilib/Render/Matrix.cpp diff --git a/tool_kits/duilib/Render/Matrix.h b/duilib/Render/Matrix.h similarity index 100% rename from tool_kits/duilib/Render/Matrix.h rename to duilib/Render/Matrix.h diff --git a/tool_kits/duilib/Render/Path.cpp b/duilib/Render/Path.cpp similarity index 100% rename from tool_kits/duilib/Render/Path.cpp rename to duilib/Render/Path.cpp diff --git a/tool_kits/duilib/Render/Path.h b/duilib/Render/Path.h similarity index 100% rename from tool_kits/duilib/Render/Path.h rename to duilib/Render/Path.h diff --git a/tool_kits/duilib/Render/Pen.cpp b/duilib/Render/Pen.cpp similarity index 100% rename from tool_kits/duilib/Render/Pen.cpp rename to duilib/Render/Pen.cpp diff --git a/tool_kits/duilib/Render/Pen.h b/duilib/Render/Pen.h similarity index 100% rename from tool_kits/duilib/Render/Pen.h rename to duilib/Render/Pen.h diff --git a/tool_kits/duilib/Render/Render.cpp b/duilib/Render/Render.cpp similarity index 97% rename from tool_kits/duilib/Render/Render.cpp rename to duilib/Render/Render.cpp index 452a85a2..cb6a7682 100644 --- a/tool_kits/duilib/Render/Render.cpp +++ b/duilib/Render/Render.cpp @@ -1,626 +1,626 @@ -#include "StdAfx.h" - -namespace ui { - -static inline void DrawFunction(HDC hDC, bool bTransparent, UiRect rcDest, HDC hdcSrc, UiRect rcSrc, bool bAlphaChannel, int uFade) -{ - if (bTransparent || bAlphaChannel || uFade < 255 - || (rcSrc.GetWidth() == rcDest.GetWidth() && rcSrc.GetHeight() == rcDest.GetHeight())) { - BLENDFUNCTION ftn = { AC_SRC_OVER, 0, uFade, AC_SRC_ALPHA }; - ::AlphaBlend(hDC, rcDest.left, rcDest.top, rcDest.GetWidth(), rcDest.GetHeight(), - hdcSrc, rcSrc.left, rcSrc.top, rcSrc.GetWidth(), rcSrc.GetHeight(), ftn); - } - else { - ::StretchBlt(hDC, rcDest.left, rcDest.top, rcDest.GetWidth(), rcDest.GetHeight(), - hdcSrc, rcSrc.left, rcSrc.top, rcSrc.GetWidth(), rcSrc.GetHeight(), SRCCOPY); - } -} - -RenderContext_GdiPlus::RenderContext_GdiPlus() - : m_hDC(NULL) - , m_hOldBitmap(NULL) - , m_bTransparent(false) -{ - HDC hDC = ::GetDC(NULL); - m_hDC = ::CreateCompatibleDC(hDC); - ::ReleaseDC(NULL, hDC); - ASSERT(m_hDC); -} - -RenderContext_GdiPlus::~RenderContext_GdiPlus() -{ - if (m_hOldBitmap != NULL) - { - ::SelectObject(m_hDC, m_hOldBitmap); - m_hOldBitmap = NULL; - } - - if (m_hDC != NULL) - { - ::DeleteDC(m_hDC); - m_hDC = NULL; - } -} - -HDC RenderContext_GdiPlus::GetDC() -{ - return m_hDC; -} - -bool RenderContext_GdiPlus::Resize(int width, int height, bool flipBItmap) -{ - ASSERT(m_hDC); - if (m_bitmap.GetWidth() == width && m_bitmap.GetHeight() == height) - return false; - - if (m_hOldBitmap != NULL) - { - ::SelectObject(m_hDC, m_hOldBitmap); - } - - bool ret = m_bitmap.Init(m_hDC, width, height, flipBItmap); - m_hOldBitmap = (HBITMAP)::SelectObject(m_hDC, m_bitmap.GetBitmap()); - return ret; -} - -void RenderContext_GdiPlus::Clear() -{ - ASSERT(m_hDC); - m_bitmap.Clear(); -} - -std::unique_ptr RenderContext_GdiPlus::Clone() -{ - std::unique_ptr pClone = std::make_unique(); - pClone->Resize(GetWidth(), GetHeight()); - pClone->BitBlt(0, 0, GetWidth(), GetHeight(), m_hDC); - return pClone; -} - -HBITMAP RenderContext_GdiPlus::DetachBitmap() -{ - ASSERT(m_hDC && m_hOldBitmap); - ASSERT(m_bitmap.GetHeight() != 0 && m_bitmap.GetWidth() != 0); - if (m_hOldBitmap == NULL) - return NULL; - - ::SelectObject(m_hDC, m_hOldBitmap); - return m_bitmap.DetachBitmap(); -} - -BYTE* RenderContext_GdiPlus::GetBits() -{ - return m_bitmap.GetBits(); -} - -int RenderContext_GdiPlus::GetWidth() -{ - return m_bitmap.GetWidth(); -} - -int RenderContext_GdiPlus::GetHeight() -{ - return m_bitmap.GetHeight(); -} - -void RenderContext_GdiPlus::ClearAlpha(const UiRect& rcDirty, int alpha) -{ - m_bitmap.ClearAlpha(rcDirty, alpha); -} - -void RenderContext_GdiPlus::RestoreAlpha(const UiRect& rcDirty, const UiRect& rcShadowPadding, int alpha) -{ - m_bitmap.RestoreAlpha(rcDirty, rcShadowPadding, alpha); -} - -bool RenderContext_GdiPlus::IsRenderTransparent() const -{ - return m_bTransparent; -} - -bool RenderContext_GdiPlus::SetRenderTransparent(bool bTransparent) -{ - bool oldValue = m_bTransparent; - m_bTransparent = bTransparent; - return oldValue; -} - -void RenderContext_GdiPlus::Save() -{ - m_saveDC = SaveDC(m_hDC); -} - -void RenderContext_GdiPlus::Restore() -{ - RestoreDC(m_hDC, m_saveDC); -} - -CPoint RenderContext_GdiPlus::OffsetWindowOrg(CPoint ptOffset) -{ - CPoint ptOldWindowOrg; - GetWindowOrgEx(m_hDC, &ptOldWindowOrg); - ptOffset.Offset(ptOldWindowOrg.x, ptOldWindowOrg.y); - ::SetWindowOrgEx(m_hDC, ptOffset.x, ptOffset.y, NULL); - return ptOldWindowOrg; -} - -CPoint RenderContext_GdiPlus::SetWindowOrg(CPoint ptOffset) -{ - CPoint ptOldWindowOrg; - GetWindowOrgEx(m_hDC, &ptOldWindowOrg); - ::SetWindowOrgEx(m_hDC, ptOffset.x, ptOffset.y, NULL); - return ptOldWindowOrg; -} - -CPoint RenderContext_GdiPlus::GetWindowOrg() const -{ - CPoint ptWindowOrg; - GetWindowOrgEx(m_hDC, &ptWindowOrg); - return ptWindowOrg; -} - -void RenderContext_GdiPlus::SetClip(const UiRect& rc) -{ - m_clip.CreateClip(m_hDC, rc); -} - -void RenderContext_GdiPlus::SetRoundClip(const UiRect& rc, int width, int height) -{ - m_clip.CreateRoundClip(m_hDC, rc, width, height); -} - -void RenderContext_GdiPlus::ClearClip() -{ - m_clip.ClearClip(m_hDC); -} - -HRESULT RenderContext_GdiPlus::BitBlt(int x, int y, int cx, int cy, HDC hdcSrc, int xSrc /*= 0*/, int yScr /*= 0*/, DWORD rop /*= SRCCOPY*/) -{ - return ::BitBlt(m_hDC, x, y, cx, cy, hdcSrc, xSrc, yScr, rop); -} - -bool RenderContext_GdiPlus::AlphaBlend(int xDest, int yDest, int widthDest, int heightDest, HDC hdcSrc, int xSrc, int yScr, int widthSrc, int heightSrc, BYTE uFade /*= 255*/) -{ - BLENDFUNCTION bf = { AC_SRC_OVER, 0, uFade, AC_SRC_ALPHA }; - return (TRUE == ::AlphaBlend(m_hDC, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc, yScr, widthSrc, heightSrc, bf)); -} - -void RenderContext_GdiPlus::DrawImage(const UiRect& rcPaint, HBITMAP hBitmap, bool bAlphaChannel, - const UiRect& rcImageDest, const UiRect& rcImageSource, const UiRect& rcCorners, BYTE uFade /*= 255*/, bool xtiled /*= false*/, bool ytiled /*= false*/) -{ - UiRect rcTestTemp; - if (!::IntersectRect(&rcTestTemp, &rcImageDest, &rcPaint)) return; - - ASSERT(::GetObjectType(m_hDC) == OBJ_DC || ::GetObjectType(m_hDC) == OBJ_MEMDC); - - if (hBitmap == NULL) return; - - HDC hCloneDC = ::CreateCompatibleDC(m_hDC); - HBITMAP hOldBitmap = (HBITMAP) ::SelectObject(hCloneDC, hBitmap); - int stretchBltMode = ::SetStretchBltMode(m_hDC, HALFTONE); - - UiRect rcTemp; - UiRect rcSource; - UiRect rcDest; - UiRect rcDpiCorner = rcCorners; - DpiManager::GetInstance()->ScaleRect(rcDpiCorner); - - // middle - rcDest.left = rcImageDest.left + rcDpiCorner.left; - rcDest.top = rcImageDest.top + rcDpiCorner.top; - rcDest.right = rcImageDest.right - rcDpiCorner.right; - rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcImageSource.right - rcCorners.right; - rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - if (!xtiled && !ytiled) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - else if (xtiled && ytiled) { - LONG lWidth = rcImageSource.right - rcImageSource.left - rcCorners.left - rcCorners.right; - LONG lHeight = rcImageSource.bottom - rcImageSource.top - rcCorners.top - rcCorners.bottom; - int iTimesX = (rcDest.right - rcDest.left + lWidth - 1) / lWidth; - int iTimesY = (rcDest.bottom - rcDest.top + lHeight - 1) / lHeight; - for (int j = 0; j < iTimesY; ++j) { - LONG lDestTop = rcDest.top + lHeight * j; - LONG lDestBottom = rcDest.top + lHeight * (j + 1); - LONG lDrawHeight = lHeight; - if (lDestBottom > rcDest.bottom) { - lDrawHeight -= lDestBottom - rcDest.bottom; - lDestBottom = rcDest.bottom; - } - for (int i = 0; i < iTimesX; ++i) { - LONG lDestLeft = rcDest.left + lWidth * i; - LONG lDestRight = rcDest.left + lWidth * (i + 1); - LONG lDrawWidth = lWidth; - if (lDestRight > rcDest.right) { - lDrawWidth -= lDestRight - rcDest.right; - lDestRight = rcDest.right; - } - rcDest.left = rcDest.left + lWidth * i; - rcDest.top = rcDest.top + lHeight * j; - rcDest.right = rcDest.left + lDestRight - lDestLeft; - rcDest.bottom = rcDest.top + lDestBottom - lDestTop; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcSource.left + lDrawWidth; - rcSource.bottom = rcSource.top + lDrawHeight; - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - } - else if (xtiled) { - LONG lWidth = rcImageSource.right - rcImageSource.left - rcCorners.left - rcCorners.right; - int iTimes = (rcDest.right - rcDest.left + lWidth - 1) / lWidth; - for (int i = 0; i < iTimes; ++i) { - LONG lDestLeft = rcDest.left + lWidth * i; - LONG lDestRight = rcDest.left + lWidth * (i + 1); - LONG lDrawWidth = lWidth; - if (lDestRight > rcDest.right) { - lDrawWidth -= lDestRight - rcDest.right; - lDestRight = rcDest.right; - } - rcDest.left = lDestLeft; - rcDest.top = rcDest.top; - rcDest.right = lDestRight; - rcDest.bottom = rcDest.top + rcDest.bottom; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcSource.left + lDrawWidth; - rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - else { // ytiled - LONG lHeight = rcImageSource.bottom - rcImageSource.top - rcCorners.top - rcCorners.bottom; - int iTimes = (rcDest.bottom - rcDest.top + lHeight - 1) / lHeight; - for (int i = 0; i < iTimes; ++i) { - LONG lDestTop = rcDest.top + lHeight * i; - LONG lDestBottom = rcDest.top + lHeight * (i + 1); - LONG lDrawHeight = lHeight; - if (lDestBottom > rcDest.bottom) { - lDrawHeight -= lDestBottom - rcDest.bottom; - lDestBottom = rcDest.bottom; - } - rcDest.left = rcDest.left; - rcDest.top = rcDest.top + lHeight * i; - rcDest.right = rcDest.left + rcDest.right; - rcDest.bottom = rcDest.top + lDestBottom - lDestTop; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcImageSource.right - rcCorners.right; - rcSource.bottom = rcSource.top + lDrawHeight; - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - } - - // left-top - if (rcCorners.left > 0 && rcCorners.top > 0) { - rcDest.left = rcImageDest.left; - rcDest.top = rcImageDest.top; - rcDest.right = rcImageDest.left + rcDpiCorner.left; - rcDest.bottom = rcImageDest.top + rcDpiCorner.top; - rcSource.left = rcImageSource.left; - rcSource.top = rcImageSource.top; - rcSource.right = rcImageSource.left + rcCorners.left; - rcSource.bottom = rcImageSource.top + rcCorners.top; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // top - if (rcCorners.top > 0) { - rcDest.left = rcImageDest.left + rcDpiCorner.left; - rcDest.top = rcImageDest.top; - rcDest.right = rcImageDest.right - rcDpiCorner.right; - rcDest.bottom = rcImageDest.top + rcDpiCorner.top; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.top; - rcSource.right = rcImageSource.right - rcCorners.right; - rcSource.bottom = rcImageSource.top + rcCorners.top; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // right-top - if (rcCorners.right > 0 && rcCorners.top > 0) { - rcDest.left = rcImageDest.right - rcDpiCorner.right; - rcDest.top = rcImageDest.top; - rcDest.right = rcImageDest.right; - rcDest.bottom = rcImageDest.top + rcDpiCorner.top; - rcSource.left = rcImageSource.right - rcCorners.right; - rcSource.top = rcImageSource.top; - rcSource.right = rcImageSource.right; - rcSource.bottom = rcImageSource.top + rcCorners.top; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // left - if (rcCorners.left > 0) { - rcDest.left = rcImageDest.left; - rcDest.top = rcImageDest.top + rcDpiCorner.top; - rcDest.right = rcImageDest.left + rcDpiCorner.left; - rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; - rcSource.left = rcImageSource.left; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcImageSource.left + rcCorners.left; - rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // right - if (rcCorners.right > 0) { - rcDest.left = rcImageDest.right - rcDpiCorner.right; - rcDest.top = rcImageDest.top + rcDpiCorner.top; - rcDest.right = rcImageDest.right; - rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; - rcSource.left = rcImageSource.right - rcCorners.right; - rcSource.top = rcImageSource.top + rcCorners.top; - rcSource.right = rcImageSource.right; - rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // left-bottom - if (rcCorners.left > 0 && rcCorners.bottom > 0) { - rcDest.left = rcImageDest.left; - rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; - rcDest.right = rcImageDest.left + rcDpiCorner.left; - rcDest.bottom = rcImageDest.bottom; - rcSource.left = rcImageSource.left; - rcSource.top = rcImageSource.bottom - rcCorners.bottom; - rcSource.right = rcImageSource.left + rcCorners.left; - rcSource.bottom = rcImageSource.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // bottom - if (rcCorners.bottom > 0) { - rcDest.left = rcImageDest.left + rcDpiCorner.left; - rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; - rcDest.right = rcImageDest.right - rcDpiCorner.right; - rcDest.bottom = rcImageDest.bottom; - rcSource.left = rcImageSource.left + rcCorners.left; - rcSource.top = rcImageSource.bottom - rcCorners.bottom; - rcSource.right = rcImageSource.right - rcCorners.right; - rcSource.bottom = rcImageSource.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - // right-bottom - if (rcCorners.right > 0 && rcCorners.bottom > 0) { - rcDest.left = rcImageDest.right - rcDpiCorner.right; - rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; - rcDest.right = rcImageDest.right; - rcDest.bottom = rcImageDest.bottom; - rcSource.left = rcImageSource.right - rcCorners.right; - rcSource.top = rcImageSource.bottom - rcCorners.bottom; - rcSource.right = rcImageSource.right; - rcSource.bottom = rcImageSource.bottom; - if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { - DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); - } - } - - ::SetStretchBltMode(m_hDC, stretchBltMode); - ::SelectObject(hCloneDC, hOldBitmap); - ::DeleteDC(hCloneDC); -} - -void RenderContext_GdiPlus::DrawColor(const UiRect& rc, DWORD dwColor, BYTE uFade) -{ - DWORD dwNewColor = dwColor; - if (uFade < 255) { - int alpha = dwColor >> 24; - dwNewColor = dwColor % 0xffffff; - alpha *= double(uFade) / 255; - dwNewColor += alpha << 24; - } - - Gdiplus::Graphics graphics(m_hDC); - Gdiplus::Color color(dwNewColor); - Gdiplus::SolidBrush brush(color); - Gdiplus::RectF rcFill(rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); - graphics.FillRectangle(&brush, rcFill); -} - -void RenderContext_GdiPlus::DrawColor(const UiRect& rc, const std::wstring& colorStr, BYTE uFade) -{ - if (colorStr.empty()) { - return; - } - - DWORD dwColor = GlobalManager::GetTextColor(colorStr); - DrawColor(rc, dwColor, uFade); -} - -void RenderContext_GdiPlus::DrawLine(const UiRect& rc, int nSize, DWORD dwPenColor) -{ - Gdiplus::Graphics graphics(m_hDC); - Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); - graphics.DrawLine(&pen, Gdiplus::Point(rc.left, rc.top), Gdiplus::Point(rc.right, rc.bottom)); -} - -void RenderContext_GdiPlus::DrawLine(const IPen* pen, int x1, int y1, int x2, int y2) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - graphics.DrawLine(((Pen_GdiPlus*)pen)->GetPen(), x1, y1, x2, y2); -} - -void RenderContext_GdiPlus::DrawBezier(const IPen* pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - graphics.DrawBezier(((Pen_GdiPlus*)pen)->GetPen(), x1, y1, x2, y2, x3, y3, x4, y4); -} - -void RenderContext_GdiPlus::DrawRect(const UiRect& rc, int nSize, DWORD dwPenColor) -{ - Gdiplus::Graphics graphics(m_hDC); - Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); - graphics.DrawRectangle(&pen, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); -} - - -void RenderContext_GdiPlus::DrawRoundRect(const UiRect& rc, const CSize& roundSize, int nSize, DWORD dwPenColor) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); - - // ü±߿ʱȫһ - // UiRect rcInflate = rc; - // rcInflate.Inflate({ -1, -1, -1, -1 }); - - Gdiplus::GraphicsPath pPath; - pPath.AddArc(rc.left, rc.top, roundSize.cx, roundSize.cy, 180, 90); - pPath.AddLine(rc.left + roundSize.cx, rc.top, rc.right - roundSize.cx, rc.top); - pPath.AddArc(rc.right - roundSize.cx, rc.top, roundSize.cx, roundSize.cy, 270, 90); - pPath.AddLine(rc.right, rc.top + roundSize.cy, rc.right, rc.bottom - roundSize.cy); - pPath.AddArc(rc.right - roundSize.cx, rc.bottom - roundSize.cy, roundSize.cx, roundSize.cy, 0, 90); - pPath.AddLine(rc.right - roundSize.cx, rc.bottom, rc.left + roundSize.cx, rc.bottom); - pPath.AddArc(rc.left, rc.bottom - roundSize.cy, roundSize.cx, roundSize.cy, 90, 90); - pPath.AddLine(rc.left, rc.bottom - roundSize.cy, rc.left, rc.top + roundSize.cy); - pPath.CloseFigure(); - - graphics.DrawPath(&pen, &pPath); -} - -void RenderContext_GdiPlus::DrawText(const UiRect& rc, const std::wstring& strText, DWORD dwTextColor, const std::wstring& strFontId, UINT uStyle, BYTE uFade /*= 255*/, bool bLineLimit /*= false*/) -{ - ASSERT(::GetObjectType(m_hDC) == OBJ_DC || ::GetObjectType(m_hDC) == OBJ_MEMDC); - if (strText.empty()) return; - - Gdiplus::Graphics graphics(m_hDC); - Gdiplus::Font font(m_hDC, GlobalManager::GetFont(strFontId)); - Gdiplus::RectF rcPaint((Gdiplus::REAL)rc.left, (Gdiplus::REAL)rc.top, (Gdiplus::REAL)(rc.right - rc.left), (Gdiplus::REAL)(rc.bottom - rc.top)); - int alpha = dwTextColor >> 24; - uFade *= double(alpha) / 255; - if (uFade == 255) { - uFade = 254; - } - Gdiplus::SolidBrush tBrush(Gdiplus::Color(uFade, GetBValue(dwTextColor), GetGValue(dwTextColor), GetRValue(dwTextColor))); - - Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat::GenericTypographic(); - if ((uStyle & DT_END_ELLIPSIS) != 0) { - stringFormat.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); - } - - int formatFlags = 0; - if ((uStyle & DT_NOCLIP) != 0) { - formatFlags |= Gdiplus::StringFormatFlagsNoClip; - } - if ((uStyle & DT_SINGLELINE) != 0) { - formatFlags |= Gdiplus::StringFormatFlagsNoWrap; - } - if (bLineLimit) { - formatFlags |= Gdiplus::StringFormatFlagsLineLimit; - } - stringFormat.SetFormatFlags(formatFlags); - - if ((uStyle & DT_LEFT) != 0) { - stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); - } - else if ((uStyle & DT_CENTER) != 0) { - stringFormat.SetAlignment(Gdiplus::StringAlignmentCenter); - } - else if ((uStyle & DT_RIGHT) != 0) { - stringFormat.SetAlignment(Gdiplus::StringAlignmentFar); - } - else { - stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); - } - - if ((uStyle & DT_TOP) != 0) { - stringFormat.SetLineAlignment(Gdiplus::StringAlignmentNear); - } - else if ((uStyle & DT_VCENTER) != 0) { - TFontInfo* fontInfo = GlobalManager::GetTFontInfo(strFontId); - if (fontInfo->sFontName == L"") { - if (rcPaint.Height >= fontInfo->iSize + 2) { - rcPaint.Offset(0, 1); - } - } - stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); - } - else if ((uStyle & DT_BOTTOM) != 0) { - stringFormat.SetLineAlignment(Gdiplus::StringAlignmentFar); - } - else { - stringFormat.SetLineAlignment(Gdiplus::StringAlignmentNear); - } - - graphics.DrawString(strText.c_str(), (int)strText.length(), &font, rcPaint, &stringFormat, &tBrush); -} - -void RenderContext_GdiPlus::DrawEllipse(const UiRect& rc, int nSize, DWORD dwColor) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - Gdiplus::Pen pen(dwColor, nSize); - graphics.DrawEllipse(&pen, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); -} - -void RenderContext_GdiPlus::FillEllipse(const UiRect& rc, DWORD dwColor) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - Gdiplus::SolidBrush brush(dwColor); - graphics.FillEllipse(&brush, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); -} - -void RenderContext_GdiPlus::DrawPath(const IPath* path, const IPen* pen) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - graphics.DrawPath(((Pen_GdiPlus*)pen)->GetPen(), ((Path_Gdiplus*)path)->GetPath()); -} - -void RenderContext_GdiPlus::FillPath(const IPath* path, const IBrush* brush) -{ - Gdiplus::Graphics graphics(m_hDC); - graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - graphics.FillPath(((Brush_Gdiplus*)brush)->GetBrush(), ((Path_Gdiplus*)path)->GetPath()); -} - -ui::UiRect RenderContext_GdiPlus::MeasureText(const std::wstring& strText, const std::wstring& strFontId, UINT uStyle, int width /*= DUI_NOSET_VALUE*/) -{ - Gdiplus::Graphics graphics(m_hDC); - Gdiplus::Font font(m_hDC, GlobalManager::GetFont(strFontId)); - Gdiplus::RectF bounds; - - Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat::GenericTypographic(); - int formatFlags = 0; - if ((uStyle & DT_SINGLELINE) != 0) { - formatFlags |= Gdiplus::StringFormatFlagsNoWrap; - } - stringFormat.SetFormatFlags(formatFlags); - - if (width == DUI_NOSET_VALUE) { - graphics.MeasureString(strText.c_str(), (int)strText.length(), &font, Gdiplus::PointF(), &stringFormat, &bounds); - } - else { - Gdiplus::REAL height = 0; - if ((uStyle & DT_SINGLELINE) != 0) { - Gdiplus::RectF rcEmpty((Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)0); - graphics.MeasureString(L"", 2, &font, rcEmpty, &stringFormat, &bounds); - height = bounds.Height; - } - Gdiplus::RectF rcText((Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)width, height); - graphics.MeasureString(strText.c_str(), (int)strText.length(), &font, rcText, &stringFormat, &bounds); - } - - UiRect rc(int(bounds.GetLeft()), int(bounds.GetTop()), int(bounds.GetRight() + 1), int(bounds.GetBottom() + 1)); - return rc; -} - -} // namespace ui +#include "StdAfx.h" + +namespace ui { + +static inline void DrawFunction(HDC hDC, bool bTransparent, UiRect rcDest, HDC hdcSrc, UiRect rcSrc, bool bAlphaChannel, int uFade) +{ + if (bTransparent || bAlphaChannel || uFade < 255 + || (rcSrc.GetWidth() == rcDest.GetWidth() && rcSrc.GetHeight() == rcDest.GetHeight())) { + BLENDFUNCTION ftn = { AC_SRC_OVER, 0, uFade, AC_SRC_ALPHA }; + ::AlphaBlend(hDC, rcDest.left, rcDest.top, rcDest.GetWidth(), rcDest.GetHeight(), + hdcSrc, rcSrc.left, rcSrc.top, rcSrc.GetWidth(), rcSrc.GetHeight(), ftn); + } + else { + ::StretchBlt(hDC, rcDest.left, rcDest.top, rcDest.GetWidth(), rcDest.GetHeight(), + hdcSrc, rcSrc.left, rcSrc.top, rcSrc.GetWidth(), rcSrc.GetHeight(), SRCCOPY); + } +} + +RenderContext_GdiPlus::RenderContext_GdiPlus() + : m_hDC(NULL) + , m_hOldBitmap(NULL) + , m_bTransparent(false) +{ + HDC hDC = ::GetDC(NULL); + m_hDC = ::CreateCompatibleDC(hDC); + ::ReleaseDC(NULL, hDC); + ASSERT(m_hDC); +} + +RenderContext_GdiPlus::~RenderContext_GdiPlus() +{ + if (m_hOldBitmap != NULL) + { + ::SelectObject(m_hDC, m_hOldBitmap); + m_hOldBitmap = NULL; + } + + if (m_hDC != NULL) + { + ::DeleteDC(m_hDC); + m_hDC = NULL; + } +} + +HDC RenderContext_GdiPlus::GetDC() +{ + return m_hDC; +} + +bool RenderContext_GdiPlus::Resize(int width, int height, bool flipBItmap) +{ + ASSERT(m_hDC); + if (m_bitmap.GetWidth() == width && m_bitmap.GetHeight() == height) + return false; + + if (m_hOldBitmap != NULL) + { + ::SelectObject(m_hDC, m_hOldBitmap); + } + + bool ret = m_bitmap.Init(m_hDC, width, height, flipBItmap); + m_hOldBitmap = (HBITMAP)::SelectObject(m_hDC, m_bitmap.GetBitmap()); + return ret; +} + +void RenderContext_GdiPlus::Clear() +{ + ASSERT(m_hDC); + m_bitmap.Clear(); +} + +std::unique_ptr RenderContext_GdiPlus::Clone() +{ + std::unique_ptr pClone = std::make_unique(); + pClone->Resize(GetWidth(), GetHeight()); + pClone->BitBlt(0, 0, GetWidth(), GetHeight(), m_hDC); + return pClone; +} + +HBITMAP RenderContext_GdiPlus::DetachBitmap() +{ + ASSERT(m_hDC && m_hOldBitmap); + ASSERT(m_bitmap.GetHeight() != 0 && m_bitmap.GetWidth() != 0); + if (m_hOldBitmap == NULL) + return NULL; + + ::SelectObject(m_hDC, m_hOldBitmap); + return m_bitmap.DetachBitmap(); +} + +BYTE* RenderContext_GdiPlus::GetBits() +{ + return m_bitmap.GetBits(); +} + +int RenderContext_GdiPlus::GetWidth() +{ + return m_bitmap.GetWidth(); +} + +int RenderContext_GdiPlus::GetHeight() +{ + return m_bitmap.GetHeight(); +} + +void RenderContext_GdiPlus::ClearAlpha(const UiRect& rcDirty, int alpha) +{ + m_bitmap.ClearAlpha(rcDirty, alpha); +} + +void RenderContext_GdiPlus::RestoreAlpha(const UiRect& rcDirty, const UiRect& rcShadowPadding, int alpha) +{ + m_bitmap.RestoreAlpha(rcDirty, rcShadowPadding, alpha); +} + +bool RenderContext_GdiPlus::IsRenderTransparent() const +{ + return m_bTransparent; +} + +bool RenderContext_GdiPlus::SetRenderTransparent(bool bTransparent) +{ + bool oldValue = m_bTransparent; + m_bTransparent = bTransparent; + return oldValue; +} + +void RenderContext_GdiPlus::Save() +{ + m_saveDC = SaveDC(m_hDC); +} + +void RenderContext_GdiPlus::Restore() +{ + RestoreDC(m_hDC, m_saveDC); +} + +CPoint RenderContext_GdiPlus::OffsetWindowOrg(CPoint ptOffset) +{ + CPoint ptOldWindowOrg; + GetWindowOrgEx(m_hDC, &ptOldWindowOrg); + ptOffset.Offset(ptOldWindowOrg.x, ptOldWindowOrg.y); + ::SetWindowOrgEx(m_hDC, ptOffset.x, ptOffset.y, NULL); + return ptOldWindowOrg; +} + +CPoint RenderContext_GdiPlus::SetWindowOrg(CPoint ptOffset) +{ + CPoint ptOldWindowOrg; + GetWindowOrgEx(m_hDC, &ptOldWindowOrg); + ::SetWindowOrgEx(m_hDC, ptOffset.x, ptOffset.y, NULL); + return ptOldWindowOrg; +} + +CPoint RenderContext_GdiPlus::GetWindowOrg() const +{ + CPoint ptWindowOrg; + GetWindowOrgEx(m_hDC, &ptWindowOrg); + return ptWindowOrg; +} + +void RenderContext_GdiPlus::SetClip(const UiRect& rc) +{ + m_clip.CreateClip(m_hDC, rc); +} + +void RenderContext_GdiPlus::SetRoundClip(const UiRect& rc, int width, int height) +{ + m_clip.CreateRoundClip(m_hDC, rc, width, height); +} + +void RenderContext_GdiPlus::ClearClip() +{ + m_clip.ClearClip(m_hDC); +} + +HRESULT RenderContext_GdiPlus::BitBlt(int x, int y, int cx, int cy, HDC hdcSrc, int xSrc /*= 0*/, int yScr /*= 0*/, DWORD rop /*= SRCCOPY*/) +{ + return ::BitBlt(m_hDC, x, y, cx, cy, hdcSrc, xSrc, yScr, rop); +} + +bool RenderContext_GdiPlus::AlphaBlend(int xDest, int yDest, int widthDest, int heightDest, HDC hdcSrc, int xSrc, int yScr, int widthSrc, int heightSrc, BYTE uFade /*= 255*/) +{ + BLENDFUNCTION bf = { AC_SRC_OVER, 0, uFade, AC_SRC_ALPHA }; + return (TRUE == ::AlphaBlend(m_hDC, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc, yScr, widthSrc, heightSrc, bf)); +} + +void RenderContext_GdiPlus::DrawImage(const UiRect& rcPaint, HBITMAP hBitmap, bool bAlphaChannel, + const UiRect& rcImageDest, const UiRect& rcImageSource, const UiRect& rcCorners, BYTE uFade /*= 255*/, bool xtiled /*= false*/, bool ytiled /*= false*/) +{ + UiRect rcTestTemp; + if (!::IntersectRect(&rcTestTemp, &rcImageDest, &rcPaint)) return; + + ASSERT(::GetObjectType(m_hDC) == OBJ_DC || ::GetObjectType(m_hDC) == OBJ_MEMDC); + + if (hBitmap == NULL) return; + + HDC hCloneDC = ::CreateCompatibleDC(m_hDC); + HBITMAP hOldBitmap = (HBITMAP) ::SelectObject(hCloneDC, hBitmap); + int stretchBltMode = ::SetStretchBltMode(m_hDC, HALFTONE); + + UiRect rcTemp; + UiRect rcSource; + UiRect rcDest; + UiRect rcDpiCorner = rcCorners; + DpiManager::GetInstance()->ScaleRect(rcDpiCorner); + + // middle + rcDest.left = rcImageDest.left + rcDpiCorner.left; + rcDest.top = rcImageDest.top + rcDpiCorner.top; + rcDest.right = rcImageDest.right - rcDpiCorner.right; + rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcImageSource.right - rcCorners.right; + rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + if (!xtiled && !ytiled) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + else if (xtiled && ytiled) { + LONG lWidth = rcImageSource.right - rcImageSource.left - rcCorners.left - rcCorners.right; + LONG lHeight = rcImageSource.bottom - rcImageSource.top - rcCorners.top - rcCorners.bottom; + int iTimesX = (rcDest.right - rcDest.left + lWidth - 1) / lWidth; + int iTimesY = (rcDest.bottom - rcDest.top + lHeight - 1) / lHeight; + for (int j = 0; j < iTimesY; ++j) { + LONG lDestTop = rcDest.top + lHeight * j; + LONG lDestBottom = rcDest.top + lHeight * (j + 1); + LONG lDrawHeight = lHeight; + if (lDestBottom > rcDest.bottom) { + lDrawHeight -= lDestBottom - rcDest.bottom; + lDestBottom = rcDest.bottom; + } + for (int i = 0; i < iTimesX; ++i) { + LONG lDestLeft = rcDest.left + lWidth * i; + LONG lDestRight = rcDest.left + lWidth * (i + 1); + LONG lDrawWidth = lWidth; + if (lDestRight > rcDest.right) { + lDrawWidth -= lDestRight - rcDest.right; + lDestRight = rcDest.right; + } + rcDest.left = rcDest.left + lWidth * i; + rcDest.top = rcDest.top + lHeight * j; + rcDest.right = rcDest.left + lDestRight - lDestLeft; + rcDest.bottom = rcDest.top + lDestBottom - lDestTop; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcSource.left + lDrawWidth; + rcSource.bottom = rcSource.top + lDrawHeight; + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + } + else if (xtiled) { + LONG lWidth = rcImageSource.right - rcImageSource.left - rcCorners.left - rcCorners.right; + int iTimes = (rcDest.right - rcDest.left + lWidth - 1) / lWidth; + for (int i = 0; i < iTimes; ++i) { + LONG lDestLeft = rcDest.left + lWidth * i; + LONG lDestRight = rcDest.left + lWidth * (i + 1); + LONG lDrawWidth = lWidth; + if (lDestRight > rcDest.right) { + lDrawWidth -= lDestRight - rcDest.right; + lDestRight = rcDest.right; + } + rcDest.left = lDestLeft; + rcDest.top = rcDest.top; + rcDest.right = lDestRight; + rcDest.bottom = rcDest.top + rcDest.bottom; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcSource.left + lDrawWidth; + rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + else { // ytiled + LONG lHeight = rcImageSource.bottom - rcImageSource.top - rcCorners.top - rcCorners.bottom; + int iTimes = (rcDest.bottom - rcDest.top + lHeight - 1) / lHeight; + for (int i = 0; i < iTimes; ++i) { + LONG lDestTop = rcDest.top + lHeight * i; + LONG lDestBottom = rcDest.top + lHeight * (i + 1); + LONG lDrawHeight = lHeight; + if (lDestBottom > rcDest.bottom) { + lDrawHeight -= lDestBottom - rcDest.bottom; + lDestBottom = rcDest.bottom; + } + rcDest.left = rcDest.left; + rcDest.top = rcDest.top + lHeight * i; + rcDest.right = rcDest.left + rcDest.right; + rcDest.bottom = rcDest.top + lDestBottom - lDestTop; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcImageSource.right - rcCorners.right; + rcSource.bottom = rcSource.top + lDrawHeight; + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + } + + // left-top + if (rcCorners.left > 0 && rcCorners.top > 0) { + rcDest.left = rcImageDest.left; + rcDest.top = rcImageDest.top; + rcDest.right = rcImageDest.left + rcDpiCorner.left; + rcDest.bottom = rcImageDest.top + rcDpiCorner.top; + rcSource.left = rcImageSource.left; + rcSource.top = rcImageSource.top; + rcSource.right = rcImageSource.left + rcCorners.left; + rcSource.bottom = rcImageSource.top + rcCorners.top; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // top + if (rcCorners.top > 0) { + rcDest.left = rcImageDest.left + rcDpiCorner.left; + rcDest.top = rcImageDest.top; + rcDest.right = rcImageDest.right - rcDpiCorner.right; + rcDest.bottom = rcImageDest.top + rcDpiCorner.top; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.top; + rcSource.right = rcImageSource.right - rcCorners.right; + rcSource.bottom = rcImageSource.top + rcCorners.top; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // right-top + if (rcCorners.right > 0 && rcCorners.top > 0) { + rcDest.left = rcImageDest.right - rcDpiCorner.right; + rcDest.top = rcImageDest.top; + rcDest.right = rcImageDest.right; + rcDest.bottom = rcImageDest.top + rcDpiCorner.top; + rcSource.left = rcImageSource.right - rcCorners.right; + rcSource.top = rcImageSource.top; + rcSource.right = rcImageSource.right; + rcSource.bottom = rcImageSource.top + rcCorners.top; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // left + if (rcCorners.left > 0) { + rcDest.left = rcImageDest.left; + rcDest.top = rcImageDest.top + rcDpiCorner.top; + rcDest.right = rcImageDest.left + rcDpiCorner.left; + rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; + rcSource.left = rcImageSource.left; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcImageSource.left + rcCorners.left; + rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // right + if (rcCorners.right > 0) { + rcDest.left = rcImageDest.right - rcDpiCorner.right; + rcDest.top = rcImageDest.top + rcDpiCorner.top; + rcDest.right = rcImageDest.right; + rcDest.bottom = rcImageDest.bottom - rcDpiCorner.bottom; + rcSource.left = rcImageSource.right - rcCorners.right; + rcSource.top = rcImageSource.top + rcCorners.top; + rcSource.right = rcImageSource.right; + rcSource.bottom = rcImageSource.bottom - rcCorners.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // left-bottom + if (rcCorners.left > 0 && rcCorners.bottom > 0) { + rcDest.left = rcImageDest.left; + rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; + rcDest.right = rcImageDest.left + rcDpiCorner.left; + rcDest.bottom = rcImageDest.bottom; + rcSource.left = rcImageSource.left; + rcSource.top = rcImageSource.bottom - rcCorners.bottom; + rcSource.right = rcImageSource.left + rcCorners.left; + rcSource.bottom = rcImageSource.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // bottom + if (rcCorners.bottom > 0) { + rcDest.left = rcImageDest.left + rcDpiCorner.left; + rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; + rcDest.right = rcImageDest.right - rcDpiCorner.right; + rcDest.bottom = rcImageDest.bottom; + rcSource.left = rcImageSource.left + rcCorners.left; + rcSource.top = rcImageSource.bottom - rcCorners.bottom; + rcSource.right = rcImageSource.right - rcCorners.right; + rcSource.bottom = rcImageSource.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + // right-bottom + if (rcCorners.right > 0 && rcCorners.bottom > 0) { + rcDest.left = rcImageDest.right - rcDpiCorner.right; + rcDest.top = rcImageDest.bottom - rcDpiCorner.bottom; + rcDest.right = rcImageDest.right; + rcDest.bottom = rcImageDest.bottom; + rcSource.left = rcImageSource.right - rcCorners.right; + rcSource.top = rcImageSource.bottom - rcCorners.bottom; + rcSource.right = rcImageSource.right; + rcSource.bottom = rcImageSource.bottom; + if (::IntersectRect(&rcTemp, &rcPaint, &rcDest)) { + DrawFunction(m_hDC, m_bTransparent, rcDest, hCloneDC, rcSource, bAlphaChannel, uFade); + } + } + + ::SetStretchBltMode(m_hDC, stretchBltMode); + ::SelectObject(hCloneDC, hOldBitmap); + ::DeleteDC(hCloneDC); +} + +void RenderContext_GdiPlus::DrawColor(const UiRect& rc, DWORD dwColor, BYTE uFade) +{ + DWORD dwNewColor = dwColor; + if (uFade < 255) { + int alpha = dwColor >> 24; + dwNewColor = dwColor % 0xffffff; + alpha *= double(uFade) / 255; + dwNewColor += alpha << 24; + } + + Gdiplus::Graphics graphics(m_hDC); + Gdiplus::Color color(dwNewColor); + Gdiplus::SolidBrush brush(color); + Gdiplus::RectF rcFill(rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); + graphics.FillRectangle(&brush, rcFill); +} + +void RenderContext_GdiPlus::DrawColor(const UiRect& rc, const std::wstring& colorStr, BYTE uFade) +{ + if (colorStr.empty()) { + return; + } + + DWORD dwColor = GlobalManager::GetTextColor(colorStr); + DrawColor(rc, dwColor, uFade); +} + +void RenderContext_GdiPlus::DrawLine(const UiRect& rc, int nSize, DWORD dwPenColor) +{ + Gdiplus::Graphics graphics(m_hDC); + Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); + graphics.DrawLine(&pen, Gdiplus::Point(rc.left, rc.top), Gdiplus::Point(rc.right, rc.bottom)); +} + +void RenderContext_GdiPlus::DrawLine(const IPen* pen, int x1, int y1, int x2, int y2) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + graphics.DrawLine(((Pen_GdiPlus*)pen)->GetPen(), x1, y1, x2, y2); +} + +void RenderContext_GdiPlus::DrawBezier(const IPen* pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + graphics.DrawBezier(((Pen_GdiPlus*)pen)->GetPen(), x1, y1, x2, y2, x3, y3, x4, y4); +} + +void RenderContext_GdiPlus::DrawRect(const UiRect& rc, int nSize, DWORD dwPenColor) +{ + Gdiplus::Graphics graphics(m_hDC); + Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); + graphics.DrawRectangle(&pen, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); +} + + +void RenderContext_GdiPlus::DrawRoundRect(const UiRect& rc, const CSize& roundSize, int nSize, DWORD dwPenColor) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize); + + // ü±߿ʱȫһ + // UiRect rcInflate = rc; + // rcInflate.Inflate({ -1, -1, -1, -1 }); + + Gdiplus::GraphicsPath pPath; + pPath.AddArc(rc.left, rc.top, roundSize.cx, roundSize.cy, 180, 90); + pPath.AddLine(rc.left + roundSize.cx, rc.top, rc.right - roundSize.cx, rc.top); + pPath.AddArc(rc.right - roundSize.cx, rc.top, roundSize.cx, roundSize.cy, 270, 90); + pPath.AddLine(rc.right, rc.top + roundSize.cy, rc.right, rc.bottom - roundSize.cy); + pPath.AddArc(rc.right - roundSize.cx, rc.bottom - roundSize.cy, roundSize.cx, roundSize.cy, 0, 90); + pPath.AddLine(rc.right - roundSize.cx, rc.bottom, rc.left + roundSize.cx, rc.bottom); + pPath.AddArc(rc.left, rc.bottom - roundSize.cy, roundSize.cx, roundSize.cy, 90, 90); + pPath.AddLine(rc.left, rc.bottom - roundSize.cy, rc.left, rc.top + roundSize.cy); + pPath.CloseFigure(); + + graphics.DrawPath(&pen, &pPath); +} + +void RenderContext_GdiPlus::DrawText(const UiRect& rc, const std::wstring& strText, DWORD dwTextColor, const std::wstring& strFontId, UINT uStyle, BYTE uFade /*= 255*/, bool bLineLimit /*= false*/) +{ + ASSERT(::GetObjectType(m_hDC) == OBJ_DC || ::GetObjectType(m_hDC) == OBJ_MEMDC); + if (strText.empty()) return; + + Gdiplus::Graphics graphics(m_hDC); + Gdiplus::Font font(m_hDC, GlobalManager::GetFont(strFontId)); + Gdiplus::RectF rcPaint((Gdiplus::REAL)rc.left, (Gdiplus::REAL)rc.top, (Gdiplus::REAL)(rc.right - rc.left), (Gdiplus::REAL)(rc.bottom - rc.top)); + int alpha = dwTextColor >> 24; + uFade *= double(alpha) / 255; + if (uFade == 255) { + uFade = 254; + } + Gdiplus::SolidBrush tBrush(Gdiplus::Color(uFade, GetBValue(dwTextColor), GetGValue(dwTextColor), GetRValue(dwTextColor))); + + Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat::GenericTypographic(); + if ((uStyle & DT_END_ELLIPSIS) != 0) { + stringFormat.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); + } + + int formatFlags = 0; + if ((uStyle & DT_NOCLIP) != 0) { + formatFlags |= Gdiplus::StringFormatFlagsNoClip; + } + if ((uStyle & DT_SINGLELINE) != 0) { + formatFlags |= Gdiplus::StringFormatFlagsNoWrap; + } + if (bLineLimit) { + formatFlags |= Gdiplus::StringFormatFlagsLineLimit; + } + stringFormat.SetFormatFlags(formatFlags); + + if ((uStyle & DT_LEFT) != 0) { + stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); + } + else if ((uStyle & DT_CENTER) != 0) { + stringFormat.SetAlignment(Gdiplus::StringAlignmentCenter); + } + else if ((uStyle & DT_RIGHT) != 0) { + stringFormat.SetAlignment(Gdiplus::StringAlignmentFar); + } + else { + stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); + } + + if ((uStyle & DT_TOP) != 0) { + stringFormat.SetLineAlignment(Gdiplus::StringAlignmentNear); + } + else if ((uStyle & DT_VCENTER) != 0) { + TFontInfo* fontInfo = GlobalManager::GetTFontInfo(strFontId); + if (fontInfo->sFontName == L"") { + if (rcPaint.Height >= fontInfo->iSize + 2) { + rcPaint.Offset(0, 1); + } + } + stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); + } + else if ((uStyle & DT_BOTTOM) != 0) { + stringFormat.SetLineAlignment(Gdiplus::StringAlignmentFar); + } + else { + stringFormat.SetLineAlignment(Gdiplus::StringAlignmentNear); + } + + graphics.DrawString(strText.c_str(), (int)strText.length(), &font, rcPaint, &stringFormat, &tBrush); +} + +void RenderContext_GdiPlus::DrawEllipse(const UiRect& rc, int nSize, DWORD dwColor) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + Gdiplus::Pen pen(dwColor, nSize); + graphics.DrawEllipse(&pen, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); +} + +void RenderContext_GdiPlus::FillEllipse(const UiRect& rc, DWORD dwColor) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + Gdiplus::SolidBrush brush(dwColor); + graphics.FillEllipse(&brush, rc.left, rc.top, rc.GetWidth(), rc.GetHeight()); +} + +void RenderContext_GdiPlus::DrawPath(const IPath* path, const IPen* pen) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + graphics.DrawPath(((Pen_GdiPlus*)pen)->GetPen(), ((Path_Gdiplus*)path)->GetPath()); +} + +void RenderContext_GdiPlus::FillPath(const IPath* path, const IBrush* brush) +{ + Gdiplus::Graphics graphics(m_hDC); + graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + graphics.FillPath(((Brush_Gdiplus*)brush)->GetBrush(), ((Path_Gdiplus*)path)->GetPath()); +} + +ui::UiRect RenderContext_GdiPlus::MeasureText(const std::wstring& strText, const std::wstring& strFontId, UINT uStyle, int width /*= DUI_NOSET_VALUE*/) +{ + Gdiplus::Graphics graphics(m_hDC); + Gdiplus::Font font(m_hDC, GlobalManager::GetFont(strFontId)); + Gdiplus::RectF bounds; + + Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat::GenericTypographic(); + int formatFlags = 0; + if ((uStyle & DT_SINGLELINE) != 0) { + formatFlags |= Gdiplus::StringFormatFlagsNoWrap; + } + stringFormat.SetFormatFlags(formatFlags); + + if (width == DUI_NOSET_VALUE) { + graphics.MeasureString(strText.c_str(), (int)strText.length(), &font, Gdiplus::PointF(), &stringFormat, &bounds); + } + else { + Gdiplus::REAL height = 0; + if ((uStyle & DT_SINGLELINE) != 0) { + Gdiplus::RectF rcEmpty((Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)0); + graphics.MeasureString(L"", 2, &font, rcEmpty, &stringFormat, &bounds); + height = bounds.Height; + } + Gdiplus::RectF rcText((Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)width, height); + graphics.MeasureString(strText.c_str(), (int)strText.length(), &font, rcText, &stringFormat, &bounds); + } + + UiRect rc(int(bounds.GetLeft()), int(bounds.GetTop()), int(bounds.GetRight() + 1), int(bounds.GetBottom() + 1)); + return rc; +} + +} // namespace ui diff --git a/tool_kits/duilib/Render/Render.h b/duilib/Render/Render.h similarity index 100% rename from tool_kits/duilib/Render/Render.h rename to duilib/Render/Render.h diff --git a/tool_kits/duilib/StdAfx.cpp b/duilib/StdAfx.cpp similarity index 100% rename from tool_kits/duilib/StdAfx.cpp rename to duilib/StdAfx.cpp diff --git a/tool_kits/duilib/StdAfx.h b/duilib/StdAfx.h similarity index 100% rename from tool_kits/duilib/StdAfx.h rename to duilib/StdAfx.h diff --git a/tool_kits/duilib/UIlib.cpp b/duilib/UIlib.cpp similarity index 100% rename from tool_kits/duilib/UIlib.cpp rename to duilib/UIlib.cpp diff --git a/tool_kits/duilib/UIlib.h b/duilib/UIlib.h similarity index 100% rename from tool_kits/duilib/UIlib.h rename to duilib/UIlib.h diff --git a/tool_kits/duilib/Utils/ApiWrapper.cpp b/duilib/Utils/ApiWrapper.cpp similarity index 100% rename from tool_kits/duilib/Utils/ApiWrapper.cpp rename to duilib/Utils/ApiWrapper.cpp diff --git a/tool_kits/duilib/Utils/ApiWrapper.h b/duilib/Utils/ApiWrapper.h similarity index 100% rename from tool_kits/duilib/Utils/ApiWrapper.h rename to duilib/Utils/ApiWrapper.h diff --git a/tool_kits/duilib/Utils/Delegate.h b/duilib/Utils/Delegate.h similarity index 100% rename from tool_kits/duilib/Utils/Delegate.h rename to duilib/Utils/Delegate.h diff --git a/tool_kits/duilib/Utils/DpiManager.cpp b/duilib/Utils/DpiManager.cpp similarity index 100% rename from tool_kits/duilib/Utils/DpiManager.cpp rename to duilib/Utils/DpiManager.cpp diff --git a/tool_kits/duilib/Utils/DpiManager.h b/duilib/Utils/DpiManager.h similarity index 100% rename from tool_kits/duilib/Utils/DpiManager.h rename to duilib/Utils/DpiManager.h diff --git a/tool_kits/duilib/Utils/Macros.h b/duilib/Utils/Macros.h similarity index 100% rename from tool_kits/duilib/Utils/Macros.h rename to duilib/Utils/Macros.h diff --git a/tool_kits/duilib/Utils/MultiLangSupport.cpp b/duilib/Utils/MultiLangSupport.cpp similarity index 100% rename from tool_kits/duilib/Utils/MultiLangSupport.cpp rename to duilib/Utils/MultiLangSupport.cpp diff --git a/tool_kits/duilib/Utils/MultiLangSupport.h b/duilib/Utils/MultiLangSupport.h similarity index 100% rename from tool_kits/duilib/Utils/MultiLangSupport.h rename to duilib/Utils/MultiLangSupport.h diff --git a/tool_kits/duilib/Utils/OnScreenKeyboardManager.cpp b/duilib/Utils/OnScreenKeyboardManager.cpp similarity index 100% rename from tool_kits/duilib/Utils/OnScreenKeyboardManager.cpp rename to duilib/Utils/OnScreenKeyboardManager.cpp diff --git a/tool_kits/duilib/Utils/OnScreenKeyboardManager.h b/duilib/Utils/OnScreenKeyboardManager.h similarity index 100% rename from tool_kits/duilib/Utils/OnScreenKeyboardManager.h rename to duilib/Utils/OnScreenKeyboardManager.h diff --git a/tool_kits/duilib/Utils/Shadow.cpp b/duilib/Utils/Shadow.cpp similarity index 100% rename from tool_kits/duilib/Utils/Shadow.cpp rename to duilib/Utils/Shadow.cpp diff --git a/tool_kits/duilib/Utils/Shadow.h b/duilib/Utils/Shadow.h similarity index 100% rename from tool_kits/duilib/Utils/Shadow.h rename to duilib/Utils/Shadow.h diff --git a/tool_kits/duilib/Utils/StringUtil.cpp b/duilib/Utils/StringUtil.cpp similarity index 100% rename from tool_kits/duilib/Utils/StringUtil.cpp rename to duilib/Utils/StringUtil.cpp diff --git a/tool_kits/duilib/Utils/StringUtil.h b/duilib/Utils/StringUtil.h similarity index 100% rename from tool_kits/duilib/Utils/StringUtil.h rename to duilib/Utils/StringUtil.h diff --git a/tool_kits/duilib/Utils/TimerManager.cpp b/duilib/Utils/TimerManager.cpp similarity index 100% rename from tool_kits/duilib/Utils/TimerManager.cpp rename to duilib/Utils/TimerManager.cpp diff --git a/tool_kits/duilib/Utils/TimerManager.h b/duilib/Utils/TimerManager.h similarity index 100% rename from tool_kits/duilib/Utils/TimerManager.h rename to duilib/Utils/TimerManager.h diff --git a/tool_kits/duilib/Utils/UnZip.cpp b/duilib/Utils/UnZip.cpp similarity index 100% rename from tool_kits/duilib/Utils/UnZip.cpp rename to duilib/Utils/UnZip.cpp diff --git a/tool_kits/duilib/Utils/UnZip.h b/duilib/Utils/UnZip.h similarity index 100% rename from tool_kits/duilib/Utils/UnZip.h rename to duilib/Utils/UnZip.h diff --git a/tool_kits/duilib/Utils/Utils.h b/duilib/Utils/Utils.h similarity index 100% rename from tool_kits/duilib/Utils/Utils.h rename to duilib/Utils/Utils.h diff --git a/tool_kits/duilib/Utils/VersionHelpers.h b/duilib/Utils/VersionHelpers.h similarity index 100% rename from tool_kits/duilib/Utils/VersionHelpers.h rename to duilib/Utils/VersionHelpers.h diff --git a/tool_kits/duilib/Utils/WinImplBase.cpp b/duilib/Utils/WinImplBase.cpp similarity index 100% rename from tool_kits/duilib/Utils/WinImplBase.cpp rename to duilib/Utils/WinImplBase.cpp diff --git a/tool_kits/duilib/Utils/WinImplBase.h b/duilib/Utils/WinImplBase.h similarity index 100% rename from tool_kits/duilib/Utils/WinImplBase.h rename to duilib/Utils/WinImplBase.h diff --git a/tool_kits/duilib/Utils/flash11.tlh b/duilib/Utils/flash11.tlh similarity index 100% rename from tool_kits/duilib/Utils/flash11.tlh rename to duilib/Utils/flash11.tlh diff --git a/tool_kits/duilib/duilib.sln b/duilib/duilib.sln similarity index 100% rename from tool_kits/duilib/duilib.sln rename to duilib/duilib.sln diff --git a/tool_kits/duilib/duilib.vcxproj b/duilib/duilib.vcxproj similarity index 96% rename from tool_kits/duilib/duilib.vcxproj rename to duilib/duilib.vcxproj index 6177fdf3..aab42c50 100644 --- a/tool_kits/duilib/duilib.vcxproj +++ b/duilib/duilib.vcxproj @@ -1,422 +1,422 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E} - duilib - - - - StaticLibrary - false - Unicode - v120_xp - - - StaticLibrary - false - Unicode - v120_xp - - - StaticLibrary - false - Unicode - v120_xp - - - StaticLibrary - false - Unicode - v120_xp - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(ProjectDir)..\..\libs\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - false - false - false - false - false - false - $(ProjectDir)..\..\libs\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - false - false - false - false - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - $(ProjectName)_d - $(ProjectName)_d - - - $(ProjectDir)..\..\libs\x64\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - - - $(ProjectDir)..\..\libs\x64\ - $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/duilib.tlb - - - - - Disabled - .\;..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - Use - stdafx.h - $(IntDir)$(TargetName).pch - Level4 - true - EditAndContinue - false - 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - $(ProjectDir)..\..\..\bin\$(ProjectName)_d.dll - true - %(AdditionalLibraryDirectories) - %(DelayLoadDLLs) - true - $(ProjectDir)..\..\..\bin\$(TargetName).pdb - 0x11000000 - $(ProjectDir)..\..\..\libs\duilib_d.lib - MachineX86 - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) - - - true - .\Debug/duilib.bsc - - - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib - /IGNORE:4006,4221 %(AdditionalOptions) - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - .\Debug/duilib.tlb - - - - - Disabled - .\;..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - stdafx.h - $(IntDir)$(TargetName).pch - Level4 - true - ProgramDatabase - false - 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - $(ProjectDir)..\..\..\bin\$(ProjectName)_d.dll - true - %(AdditionalLibraryDirectories) - %(DelayLoadDLLs) - true - $(ProjectDir)..\..\..\bin\$(TargetName).pdb - 0x11000000 - $(ProjectDir)..\..\..\libs\duilib_d.lib - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) - - - true - .\Debug/duilib.bsc - - - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib - /IGNORE:4006,4221 %(AdditionalOptions) - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/duilib.tlb - - - - - MaxSpeed - Default - .\;..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - true - Use - $(IntDir)$(TargetName).pch - Level4 - true - true - true - MultiThreaded - 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0406 - - - $(ProjectDir)..\..\..\bin\$(ProjectName).dll - true - %(AdditionalLibraryDirectories) - %(DelayLoadDLLs) - 0x11000000 - $(ProjectDir)..\..\..\libs\duilib.lib - MachineX86 - $(ProjectDir)..\..\..\bin\$(TargetName).pdb - true - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) - - - true - .\Release/duilib.bsc - - - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib - /IGNORE:4006,4221 %(AdditionalOptions) - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - .\Release/duilib.tlb - - - - - MaxSpeed - Default - .\;..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - true - Use - $(IntDir)$(TargetName).pch - Level4 - true - true - true - MultiThreaded - 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0406 - - - $(ProjectDir)..\..\..\bin\$(ProjectName).dll - true - %(AdditionalLibraryDirectories) - %(DelayLoadDLLs) - 0x11000000 - $(ProjectDir)..\..\..\libs\duilib.lib - $(ProjectDir)..\..\..\bin\$(TargetName).pdb - true - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) - - - true - .\Release/duilib.bsc - - - comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib - /IGNORE:4006,4221 %(AdditionalOptions) - - - - - - - false - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E} + duilib + + + + StaticLibrary + false + Unicode + v120_xp + + + StaticLibrary + false + Unicode + v120_xp + + + StaticLibrary + false + Unicode + v120_xp + + + StaticLibrary + false + Unicode + v120_xp + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(ProjectDir)..\libs\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + false + false + false + false + false + false + $(ProjectDir)..\libs\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + false + false + false + false + false + false + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + $(ProjectName)_d + $(ProjectName)_d + + + $(ProjectDir)..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + + + $(ProjectDir)..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/duilib.tlb + + + + + Disabled + .\;..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Use + stdafx.h + $(IntDir)$(TargetName).pch + Level4 + true + EditAndContinue + false + 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(ProjectDir)..\..\..\bin\$(ProjectName)_d.dll + true + %(AdditionalLibraryDirectories) + %(DelayLoadDLLs) + true + $(ProjectDir)..\..\..\bin\$(TargetName).pdb + 0x11000000 + $(ProjectDir)..\..\..\libs\duilib_d.lib + MachineX86 + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) + + + true + .\Debug/duilib.bsc + + + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib + /IGNORE:4006,4221 %(AdditionalOptions) + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/duilib.tlb + + + + + Disabled + .\;..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + stdafx.h + $(IntDir)$(TargetName).pch + Level4 + true + ProgramDatabase + false + 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(ProjectDir)..\..\..\bin\$(ProjectName)_d.dll + true + %(AdditionalLibraryDirectories) + %(DelayLoadDLLs) + true + $(ProjectDir)..\..\..\bin\$(TargetName).pdb + 0x11000000 + $(ProjectDir)..\..\..\libs\duilib_d.lib + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) + + + true + .\Debug/duilib.bsc + + + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib + /IGNORE:4006,4221 %(AdditionalOptions) + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release/duilib.tlb + + + + + MaxSpeed + Default + .\;..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + true + Use + $(IntDir)$(TargetName).pch + Level4 + true + true + true + MultiThreaded + 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0406 + + + $(ProjectDir)..\..\..\bin\$(ProjectName).dll + true + %(AdditionalLibraryDirectories) + %(DelayLoadDLLs) + 0x11000000 + $(ProjectDir)..\..\..\libs\duilib.lib + MachineX86 + $(ProjectDir)..\..\..\bin\$(TargetName).pdb + true + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) + + + true + .\Release/duilib.bsc + + + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib + /IGNORE:4006,4221 %(AdditionalOptions) + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/duilib.tlb + + + + + MaxSpeed + Default + .\;..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + true + Use + $(IntDir)$(TargetName).pch + Level4 + true + true + true + MultiThreaded + 4100;4121;4127;4244;4310;4355;4481;4505;4512;4702;%(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0406 + + + $(ProjectDir)..\..\..\bin\$(ProjectName).dll + true + %(AdditionalLibraryDirectories) + %(DelayLoadDLLs) + 0x11000000 + $(ProjectDir)..\..\..\libs\duilib.lib + $(ProjectDir)..\..\..\bin\$(TargetName).pdb + true + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;%(AdditionalDependencies) + + + true + .\Release/duilib.bsc + + + comctl32.lib;gdiplus.lib;msimg32.lib;winmm.lib;imm32.lib;shlwapi.lib + /IGNORE:4006,4221 %(AdditionalOptions) + + + + + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tool_kits/duilib/duilib.vcxproj.filters b/duilib/duilib.vcxproj.filters similarity index 97% rename from tool_kits/duilib/duilib.vcxproj.filters rename to duilib/duilib.vcxproj.filters index ab7a238e..219366eb 100644 --- a/tool_kits/duilib/duilib.vcxproj.filters +++ b/duilib/duilib.vcxproj.filters @@ -1,347 +1,347 @@ - - - - - {8fc45193-00aa-405d-8445-6f6619d94834} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {b7a95a7b-1188-487e-b75b-a6e6fe6055f7} - - - {ef45879d-87a5-4d7f-9a92-fdf97778b304} - - - {f70f6171-d9fd-4189-b1d7-5250e2d6f0fd} - - - {b7a7aeb7-2adb-4395-b80d-4922bd4efc19} - h;hpp;hxx;hm;inl - - - {3472fe0b-1976-4ada-9c67-2f07b06068d2} - - - {1a8a45f1-b601-4178-b118-b282f71c4dec} - - - {6eb00376-1e2b-4faf-9eaa-bdc915049307} - - - {38a8cc27-53b9-4413-8919-ae7448229ad2} - - - {101719c8-36d9-454c-be9a-d0f158cf21b4} - - - {4f978102-2279-42b9-ab99-8a719e9fdf53} - - - {2069d257-49fd-4283-9999-19e7dda732c8} - - - {ab59d168-e65b-4cf4-aff6-a2a07e35d058} - - - {93308611-e7ba-4331-845a-700f5b457c52} - - - - - Source Files - - - Source Files - - - Source Files\Utils - - - Source Files\Control - - - Source Files\Control - - - Source Files\Control - - - Source Files\Control - - - Source Files\Control - - - Source Files\Control - - - Source Files\Control - - - Source Files\Core - - - Source Files\Core - - - Source Files\Utils - - - Source Files\Core - - - Source Files\Core - - - Source Files\Core - - - Source Files\Box - - - Source Files\Box - - - Source Files\Box - - - Source Files\Box - - - Source Files\Box - - - Source Files\Utils - - - Source Files\Animation - - - Source Files\Core - - - Source Files\Utils - - - Source Files\Core - - - Source Files\Animation - - - Source Files\Utils - - - Source Files\Core - - - Source Files\Utils - - - Source Files\Control - - - Source Files\Utils - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Utils - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Render - - - Source Files\Utils - - - Source Files\Control - - - - - Header Files - - - Header Files - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Control - - - Header Files\Core - - - Header Files\Core - - - Header Files\Core - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Core - - - Header Files\Core - - - Header Files\Core - - - Header Files\Box - - - Header Files\Box - - - Header Files\Box - - - Header Files\Box - - - Header Files\Box - - - Header Files\Animation - - - Header Files\Core - - - Header Files\Utils - - - Header Files\Core - - - Header Files\Animation - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Utils - - - Header Files\Control - - - Header Files\Utils - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Utils - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Render - - - Header Files\Utils - - - Header Files\Control - - + + + + + {8fc45193-00aa-405d-8445-6f6619d94834} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {b7a95a7b-1188-487e-b75b-a6e6fe6055f7} + + + {ef45879d-87a5-4d7f-9a92-fdf97778b304} + + + {f70f6171-d9fd-4189-b1d7-5250e2d6f0fd} + + + {b7a7aeb7-2adb-4395-b80d-4922bd4efc19} + h;hpp;hxx;hm;inl + + + {3472fe0b-1976-4ada-9c67-2f07b06068d2} + + + {1a8a45f1-b601-4178-b118-b282f71c4dec} + + + {6eb00376-1e2b-4faf-9eaa-bdc915049307} + + + {38a8cc27-53b9-4413-8919-ae7448229ad2} + + + {101719c8-36d9-454c-be9a-d0f158cf21b4} + + + {4f978102-2279-42b9-ab99-8a719e9fdf53} + + + {2069d257-49fd-4283-9999-19e7dda732c8} + + + {ab59d168-e65b-4cf4-aff6-a2a07e35d058} + + + {93308611-e7ba-4331-845a-700f5b457c52} + + + + + Source Files + + + Source Files + + + Source Files\Utils + + + Source Files\Control + + + Source Files\Control + + + Source Files\Control + + + Source Files\Control + + + Source Files\Control + + + Source Files\Control + + + Source Files\Control + + + Source Files\Core + + + Source Files\Core + + + Source Files\Utils + + + Source Files\Core + + + Source Files\Core + + + Source Files\Core + + + Source Files\Box + + + Source Files\Box + + + Source Files\Box + + + Source Files\Box + + + Source Files\Box + + + Source Files\Utils + + + Source Files\Animation + + + Source Files\Core + + + Source Files\Utils + + + Source Files\Core + + + Source Files\Animation + + + Source Files\Utils + + + Source Files\Core + + + Source Files\Utils + + + Source Files\Control + + + Source Files\Utils + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Utils + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Render + + + Source Files\Utils + + + Source Files\Control + + + + + Header Files + + + Header Files + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Control + + + Header Files\Core + + + Header Files\Core + + + Header Files\Core + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Core + + + Header Files\Core + + + Header Files\Core + + + Header Files\Box + + + Header Files\Box + + + Header Files\Box + + + Header Files\Box + + + Header Files\Box + + + Header Files\Animation + + + Header Files\Core + + + Header Files\Utils + + + Header Files\Core + + + Header Files\Animation + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Utils + + + Header Files\Control + + + Header Files\Utils + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Utils + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Render + + + Header Files\Utils + + + Header Files\Control + + \ No newline at end of file diff --git a/samples/README.md b/examples/README.md similarity index 95% rename from samples/README.md rename to examples/README.md index a8063264..e54aa7f4 100644 --- a/samples/README.md +++ b/examples/README.md @@ -8,6 +8,7 @@ - `layouts` 包含一个登录窗口和一个模拟微信 PC 聊天布局的窗口示例 - `multi_browser` 基于 CEF 的自定义多标签可拖曳浏览器示例 - `richlist` 演示了一个列表控件中插入自定义列表项的用法 + - `virtualbox` 演示了多列虚拟列表的使用 ## Demos @@ -16,4 +17,3 @@ - [NetEase IM Demo](https://github.com/netease-im/NIM_PC_Demo) - [NetEase Interact Live Demo](https://yx-web-nosdn.netease.im/package/1542889389/NIM_InteractLive_PC_Demo_v2.9.0.zip?download=NIM_InteractLive_PC_Demo_v2.9.0.zip) - [NetEase Education Demo](https://yx-web-nosdn.netease.im/package/1537445692/NIM_Education_PC_Demo_v2.3.0.zip?download=NIM_Education_PC_Demo_v2.3.0.zip) - \ No newline at end of file diff --git a/samples/basic/basic.ico b/examples/basic/basic.ico similarity index 100% rename from samples/basic/basic.ico rename to examples/basic/basic.ico diff --git a/samples/basic/basic.rc b/examples/basic/basic.rc similarity index 100% rename from samples/basic/basic.rc rename to examples/basic/basic.rc diff --git a/samples/basic/basic.vcxproj b/examples/basic/basic.vcxproj similarity index 94% rename from samples/basic/basic.vcxproj rename to examples/basic/basic.vcxproj index c3f39261..7b88b773 100644 --- a/samples/basic/basic.vcxproj +++ b/examples/basic/basic.vcxproj @@ -1,4 +1,4 @@ - + @@ -75,7 +75,7 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) @@ -83,21 +83,21 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) $(ProjectName)64 @@ -194,18 +194,15 @@ - - {8d9a6595-717a-41c8-b468-0011a72be3d1} - - - {e106acd7-4e53-4aee-942b-d0dd426db34e} - - - {9951345f-620b-4bed-bb51-4f928cafd454} - + - + + {8d9a6595-717a-41c8-b468-0011a72be3d1} + + + {e106acd7-4e53-4aee-942b-d0dd426db34e} + diff --git a/samples/basic/basic.vcxproj.filters b/examples/basic/basic.vcxproj.filters similarity index 100% rename from samples/basic/basic.vcxproj.filters rename to examples/basic/basic.vcxproj.filters diff --git a/samples/basic/basic_form.cpp b/examples/basic/basic_form.cpp similarity index 100% rename from samples/basic/basic_form.cpp rename to examples/basic/basic_form.cpp diff --git a/samples/basic/basic_form.h b/examples/basic/basic_form.h similarity index 100% rename from samples/basic/basic_form.h rename to examples/basic/basic_form.h diff --git a/samples/basic/main.cpp b/examples/basic/main.cpp similarity index 93% rename from samples/basic/main.cpp rename to examples/basic/main.cpp index 1fee9cfe..feab5a63 100644 --- a/samples/basic/main.cpp +++ b/examples/basic/main.cpp @@ -24,10 +24,10 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // 获取资源路径,初始化全局参数 - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); #ifdef _DEBUG // Debug 模式下使用本地文件夹作为资源 // 默认皮肤使用 resources\\themes\\default diff --git a/samples/basic/main.h b/examples/basic/main.h similarity index 100% rename from samples/basic/main.h rename to examples/basic/main.h diff --git a/samples/basic/resource.h b/examples/basic/resource.h similarity index 100% rename from samples/basic/resource.h rename to examples/basic/resource.h diff --git a/samples/basic/small.ico b/examples/basic/small.ico similarity index 100% rename from samples/basic/small.ico rename to examples/basic/small.ico diff --git a/samples/basic/stdafx.cpp b/examples/basic/stdafx.cpp similarity index 100% rename from samples/basic/stdafx.cpp rename to examples/basic/stdafx.cpp diff --git a/samples/layouts/stdafx.h b/examples/basic/stdafx.h similarity index 88% rename from samples/layouts/stdafx.h rename to examples/basic/stdafx.h index 9fae117e..95611366 100644 --- a/samples/layouts/stdafx.h +++ b/examples/basic/stdafx.h @@ -16,8 +16,5 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/basic/targetver.h b/examples/basic/targetver.h similarity index 100% rename from samples/basic/targetver.h rename to examples/basic/targetver.h diff --git a/samples/cef/cef.ico b/examples/cef/cef.ico similarity index 100% rename from samples/cef/cef.ico rename to examples/cef/cef.ico diff --git a/samples/cef/cef.rc b/examples/cef/cef.rc similarity index 100% rename from samples/cef/cef.rc rename to examples/cef/cef.rc diff --git a/samples/cef/cef.vcxproj b/examples/cef/cef.vcxproj similarity index 92% rename from samples/cef/cef.vcxproj rename to examples/cef/cef.vcxproj index e563046e..98cd777f 100644 --- a/samples/cef/cef.vcxproj +++ b/examples/cef/cef.vcxproj @@ -75,7 +75,7 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d ..\..\bin\ - ..\..\tool_kits\;..\..\third_party\cef_wrapper\;$(IncludePath) + ..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\;$(LibraryPath) @@ -83,21 +83,21 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d ..\..\bin\ - ..\..\tool_kits\;..\..\third_party\cef_wrapper\;$(IncludePath) + ..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\x64\;$(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;..\..\third_party\cef_wrapper\;$(IncludePath) + ..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\;$(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;..\..\third_party\cef_wrapper\;$(IncludePath) + ..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\x64\;$(LibraryPath) $(ProjectName)64 @@ -198,16 +198,13 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - - + {0149ba6e-3c0a-426d-aa0a-0b9ec7742f19} diff --git a/samples/cef/cef.vcxproj.filters b/examples/cef/cef.vcxproj.filters similarity index 100% rename from samples/cef/cef.vcxproj.filters rename to examples/cef/cef.vcxproj.filters diff --git a/samples/cef/cef_form.cpp b/examples/cef/cef_form.cpp similarity index 96% rename from samples/cef/cef_form.cpp rename to examples/cef/cef_form.cpp index bc3c23f8..1a7fd3d6 100644 --- a/samples/cef/cef_form.cpp +++ b/examples/cef/cef_form.cpp @@ -62,7 +62,7 @@ void CefForm::InitWindow() cef_control_->AttachDevTools(cef_control_dev_); // ƤĿ¼µ html ļ - cef_control_->LoadURL(QPath::GetAppPath() + L"resources\\themes\\default\\cef\\cef.html"); + cef_control_->LoadURL(nbase::win32::GetCurrentModuleDirectory() + L"resources\\themes\\default\\cef\\cef.html"); if (!nim_cef::CefManager::GetInstance()->IsEnableOffsetRender()) cef_control_dev_->SetVisible(false); diff --git a/samples/cef/cef_form.h b/examples/cef/cef_form.h similarity index 100% rename from samples/cef/cef_form.h rename to examples/cef/cef_form.h diff --git a/samples/cef/main.cpp b/examples/cef/main.cpp similarity index 87% rename from samples/cef/main.cpp rename to examples/cef/main.cpp index e740026a..0f199790 100644 --- a/samples/cef/main.cpp +++ b/examples/cef/main.cpp @@ -25,7 +25,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, // 初始化 CEF CefSettings settings; - if (!nim_cef::CefManager::GetInstance()->Initialize(QPath::GetAppPath() + L"cef_temp\\", settings, kEnableOffsetRender)) + if (!nim_cef::CefManager::GetInstance()->Initialize(nbase::win32::GetCurrentModuleDirectory() + L"cef_temp\\", settings, kEnableOffsetRender)) { return 0; } @@ -46,13 +46,13 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // 获取资源路径,初始化全局参数 // 默认皮肤使用 resources\\themes\\default // 默认语言使用 resources\\lang\\zh_CN // 如需修改请指定 Startup 最后两个参数 - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(theme_dir + L"resources\\", ui::CreateControlCallback(), false); // 创建一个默认带有阴影的居中窗口 diff --git a/samples/cef/main.h b/examples/cef/main.h similarity index 100% rename from samples/cef/main.h rename to examples/cef/main.h diff --git a/samples/cef/resource.h b/examples/cef/resource.h similarity index 100% rename from samples/cef/resource.h rename to examples/cef/resource.h diff --git a/samples/cef/small.ico b/examples/cef/small.ico similarity index 100% rename from samples/cef/small.ico rename to examples/cef/small.ico diff --git a/samples/cef/stdafx.cpp b/examples/cef/stdafx.cpp similarity index 100% rename from samples/cef/stdafx.cpp rename to examples/cef/stdafx.cpp diff --git a/samples/cef/stdafx.h b/examples/cef/stdafx.h similarity index 90% rename from samples/cef/stdafx.h rename to examples/cef/stdafx.h index f0832686..4a9d4a42 100644 --- a/samples/cef/stdafx.h +++ b/examples/cef/stdafx.h @@ -16,9 +16,6 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/cef/targetver.h b/examples/cef/targetver.h similarity index 100% rename from samples/cef/targetver.h rename to examples/cef/targetver.h diff --git a/samples/controls/controls.ico b/examples/controls/controls.ico similarity index 100% rename from samples/controls/controls.ico rename to examples/controls/controls.ico diff --git a/samples/controls/controls.rc b/examples/controls/controls.rc similarity index 100% rename from samples/controls/controls.rc rename to examples/controls/controls.rc diff --git a/samples/controls/controls.vcxproj b/examples/controls/controls.vcxproj similarity index 93% rename from samples/controls/controls.vcxproj rename to examples/controls/controls.vcxproj index 246ad58a..456957b6 100644 --- a/samples/controls/controls.vcxproj +++ b/examples/controls/controls.vcxproj @@ -75,7 +75,7 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) @@ -83,21 +83,21 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) $(ProjectName)64 @@ -194,16 +194,13 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - - + {0149ba6e-3c0a-426d-aa0a-0b9ec7742f19} diff --git a/samples/controls/controls.vcxproj.filters b/examples/controls/controls.vcxproj.filters similarity index 100% rename from samples/controls/controls.vcxproj.filters rename to examples/controls/controls.vcxproj.filters diff --git a/samples/controls/controls_form.cpp b/examples/controls/controls_form.cpp similarity index 90% rename from samples/controls/controls_form.cpp rename to examples/controls/controls_form.cpp index 03ed699e..257bfe5e 100644 --- a/samples/controls/controls_form.cpp +++ b/examples/controls/controls_form.cpp @@ -103,17 +103,15 @@ void ControlForm::InitWindow() } // Post task to UI thread - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&ControlForm::OnLoadedResourceFile, this, xml)); // or Post2UI(nbase::Bind(&ControlForm::OnLoadedResourceFile, this, xml)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&ControlForm::OnLoadedResourceFile, this, xml)); // or Post2UI(nbase::Bind(&ControlForm::OnLoadedResourceFile, this, xml)); }; // Using ToWeakCallback to protect closure when if [ControlForm] was destoryed nbase::ThreadManager::PostTask(kThreadGlobalMisc, ToWeakCallback(closure)); // or Post2GlobalMisc(ToWeakCallback(closure)); /* Post repeat task to update progress value 200 milliseconds once */ StdClosure repeat_task = [this]() { - auto timestamp = shared::tools::GenerateTimeStamp(); - int64_t timestamp_num = 0; - nbase::StringToInt64(timestamp, ×tamp_num); - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&ControlForm::OnProgressValueChagned, this, timestamp_num % 100)); + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&ControlForm::OnProgressValueChagned, this, time_delta.ToMilliseconds() % 100)); }; nbase::ThreadManager::PostRepeatedTask(kThreadGlobalMisc, ToWeakCallback(repeat_task), nbase::TimeDelta::FromMilliseconds(200)); @@ -156,7 +154,7 @@ void ControlForm::OnProgressValueChagned(float value) progress->SetValue(value); auto circleprogress = dynamic_cast(FindControl(L"circleprogress")); circleprogress->SetValue(value); - TCHAR szBuffer[32] = {0}; + TCHAR szBuffer[32] = {0}; swprintf_s(szBuffer, _T("%.0f%%"), value); circleprogress->SetText(szBuffer); } diff --git a/samples/controls/controls_form.h b/examples/controls/controls_form.h similarity index 100% rename from samples/controls/controls_form.h rename to examples/controls/controls_form.h diff --git a/samples/controls/main.cpp b/examples/controls/main.cpp similarity index 81% rename from samples/controls/main.cpp rename to examples/controls/main.cpp index 4006ff65..97608de5 100644 --- a/samples/controls/main.cpp +++ b/examples/controls/main.cpp @@ -18,16 +18,26 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, return 0; } +void MiscThread::Init() +{ + nbase::ThreadManager::RegisterThread(thread_id_); +} + +void MiscThread::Cleanup() +{ + nbase::ThreadManager::UnregisterThread(); +} + void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // 启动杂事处理线程 misc_thread_.reset(new MiscThread(kThreadGlobalMisc, "Global Misc Thread")); misc_thread_->Start(); // 获取资源路径,初始化全局参数 - std::wstring app_dir = QPath::GetAppPath(); + std::wstring app_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(app_dir + L"resources\\", ui::CreateControlCallback(), false); // 创建一个默认带有阴影的居中窗口 diff --git a/samples/controls/main.h b/examples/controls/main.h similarity index 51% rename from samples/controls/main.h rename to examples/controls/main.h index 40980e10..cc822498 100644 --- a/samples/controls/main.h +++ b/examples/controls/main.h @@ -2,10 +2,40 @@ #include "resource.h" +/** @class ߳ +* @brief ̳߳࣬ nbase::FrameworkThread +* @copyright (c) 2015, NetEase Inc. All rights reserved +* @date 2015/1/1 +*/ +class MiscThread : public nbase::FrameworkThread +{ +public: + MiscThread(enum ThreadIds thread_id, const char *name) + : FrameworkThread(name) + , thread_id_(thread_id) {} + + ~MiscThread(void) {} + +private: + /** + * 麯ʼ߳ + * @return void ޷ֵ + */ + virtual void Init() override; + + /** + * 麯߳˳ʱһЩ + * @return void ޷ֵ + */ + virtual void Cleanup() override; + +private: + enum ThreadIds thread_id_; +}; + /** @class MainThread * @brief ̣߳UỊ̳߳࣬ nbase::FrameworkThread * @copyright (c) 2015, NetEase Inc. All rights reserved -* @author towik * @date 2015/1/1 */ class MainThread : public nbase::FrameworkThread diff --git a/samples/controls/resource.h b/examples/controls/resource.h similarity index 100% rename from samples/controls/resource.h rename to examples/controls/resource.h diff --git a/samples/controls/small.ico b/examples/controls/small.ico similarity index 100% rename from samples/controls/small.ico rename to examples/controls/small.ico diff --git a/samples/controls/stdafx.cpp b/examples/controls/stdafx.cpp similarity index 100% rename from samples/controls/stdafx.cpp rename to examples/controls/stdafx.cpp diff --git a/samples/controls/stdafx.h b/examples/controls/stdafx.h similarity index 89% rename from samples/controls/stdafx.h rename to examples/controls/stdafx.h index d15652aa..337ee2a2 100644 --- a/samples/controls/stdafx.h +++ b/examples/controls/stdafx.h @@ -16,9 +16,6 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/controls/targetver.h b/examples/controls/targetver.h similarity index 100% rename from samples/controls/targetver.h rename to examples/controls/targetver.h diff --git a/samples/samples.sln b/examples/examples.sln similarity index 84% rename from samples/samples.sln rename to examples/examples.sln index b6b79bde..639e2c63 100644 --- a/samples/samples.sln +++ b/examples/examples.sln @@ -1,15 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tool_kits", "tool_kits", "{66F85B8F-11B7-4964-B51E-99DF85D8FE00}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duilib", "..\tool_kits\duilib\duilib.vcxproj", "{E106ACD7-4E53-4AEE-942B-D0DD426DB34E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "base", "..\tool_kits\base\base.vcxproj", "{8D9A6595-717A-41C8-B468-0011A72BE3D1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{B2087994-3DF6-4A57-B8C6-6F744520D7FA}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{B2087994-3DF6-4A57-B8C6-6F744520D7FA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic", "basic\basic.vcxproj", "{F1A9371F-9A34-45A0-98EB-83FF371F067F}" EndProject @@ -21,17 +15,19 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "richlist", "richlist\richli EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_browser", "multi_browser\multi_browser.vcxproj", "{FDB5539F-1060-4975-B603-B66454C8C897}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared", "..\tool_kits\shared\shared.vcxproj", "{9951345F-620B-4BED-BB51-4F928CAFD454}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui_components", "..\tool_kits\ui_components\ui_components.vcxproj", "{0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "third_party", "third_party", "{1DA0A8E2-5832-42FC-83F7-2CDCAD379C90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcef_dll_wrapper", "..\third_party\cef_wrapper\libcef_dll_wrapper.vcxproj", "{A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "controls", "controls\controls.vcxproj", "{8BD95440-9000-4745-8011-27DD553EF06F}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VirtualBox", "VirtualBox\VirtualBox.vcxproj", "{E35589C6-9509-4116-996F-1D045C2DACAE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "virtualbox", "VirtualBox\VirtualBox.vcxproj", "{E35589C6-9509-4116-996F-1D045C2DACAE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "base", "..\base\base.vcxproj", "{8D9A6595-717A-41C8-B468-0011A72BE3D1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duilib", "..\duilib\duilib.vcxproj", "{E106ACD7-4E53-4AEE-942B-D0DD426DB34E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui_components", "..\ui_components\ui_components.vcxproj", "{0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -41,22 +37,6 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|Win32.ActiveCfg = Debug|Win32 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|Win32.Build.0 = Debug|Win32 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|x64.ActiveCfg = Debug|x64 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|x64.Build.0 = Debug|x64 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|Win32.ActiveCfg = Release|Win32 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|Win32.Build.0 = Release|Win32 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|x64.ActiveCfg = Release|x64 - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|x64.Build.0 = Release|x64 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|Win32.ActiveCfg = Debug|Win32 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|Win32.Build.0 = Debug|Win32 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|x64.ActiveCfg = Debug|x64 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|x64.Build.0 = Debug|x64 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|Win32.ActiveCfg = Release|Win32 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|Win32.Build.0 = Release|Win32 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|x64.ActiveCfg = Release|x64 - {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|x64.Build.0 = Release|x64 {F1A9371F-9A34-45A0-98EB-83FF371F067F}.Debug|Win32.ActiveCfg = Debug|Win32 {F1A9371F-9A34-45A0-98EB-83FF371F067F}.Debug|Win32.Build.0 = Debug|Win32 {F1A9371F-9A34-45A0-98EB-83FF371F067F}.Debug|x64.ActiveCfg = Debug|x64 @@ -97,22 +77,6 @@ Global {FDB5539F-1060-4975-B603-B66454C8C897}.Release|Win32.Build.0 = Release|Win32 {FDB5539F-1060-4975-B603-B66454C8C897}.Release|x64.ActiveCfg = Release|x64 {FDB5539F-1060-4975-B603-B66454C8C897}.Release|x64.Build.0 = Release|x64 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Debug|Win32.ActiveCfg = Debug|Win32 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Debug|Win32.Build.0 = Debug|Win32 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Debug|x64.ActiveCfg = Debug|x64 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Debug|x64.Build.0 = Debug|x64 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Release|Win32.ActiveCfg = Release|Win32 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Release|Win32.Build.0 = Release|Win32 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Release|x64.ActiveCfg = Release|x64 - {9951345F-620B-4BED-BB51-4F928CAFD454}.Release|x64.Build.0 = Release|x64 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|Win32.ActiveCfg = Debug|Win32 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|Win32.Build.0 = Debug|Win32 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|x64.ActiveCfg = Debug|x64 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|x64.Build.0 = Debug|x64 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|Win32.ActiveCfg = Release|Win32 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|Win32.Build.0 = Release|Win32 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|x64.ActiveCfg = Release|x64 - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|x64.Build.0 = Release|x64 {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9}.Debug|Win32.ActiveCfg = Debug|Win32 {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9}.Debug|Win32.Build.0 = Debug|Win32 {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9}.Debug|x64.ActiveCfg = Debug|x64 @@ -135,23 +99,43 @@ Global {E35589C6-9509-4116-996F-1D045C2DACAE}.Release|Win32.ActiveCfg = Release|Win32 {E35589C6-9509-4116-996F-1D045C2DACAE}.Release|Win32.Build.0 = Release|Win32 {E35589C6-9509-4116-996F-1D045C2DACAE}.Release|x64.ActiveCfg = Release|Win32 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|Win32.ActiveCfg = Debug|Win32 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|Win32.Build.0 = Debug|Win32 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|x64.ActiveCfg = Debug|x64 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Debug|x64.Build.0 = Debug|x64 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|Win32.ActiveCfg = Release|Win32 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|Win32.Build.0 = Release|Win32 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|x64.ActiveCfg = Release|x64 + {8D9A6595-717A-41C8-B468-0011A72BE3D1}.Release|x64.Build.0 = Release|x64 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|Win32.Build.0 = Debug|Win32 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|x64.ActiveCfg = Debug|x64 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Debug|x64.Build.0 = Debug|x64 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|Win32.ActiveCfg = Release|Win32 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|Win32.Build.0 = Release|Win32 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|x64.ActiveCfg = Release|x64 + {E106ACD7-4E53-4AEE-942B-D0DD426DB34E}.Release|x64.Build.0 = Release|x64 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|Win32.ActiveCfg = Debug|Win32 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|Win32.Build.0 = Debug|Win32 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|x64.ActiveCfg = Debug|x64 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Debug|x64.Build.0 = Debug|x64 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|Win32.ActiveCfg = Release|Win32 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|Win32.Build.0 = Release|Win32 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|x64.ActiveCfg = Release|x64 + {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {E106ACD7-4E53-4AEE-942B-D0DD426DB34E} = {66F85B8F-11B7-4964-B51E-99DF85D8FE00} - {8D9A6595-717A-41C8-B468-0011A72BE3D1} = {66F85B8F-11B7-4964-B51E-99DF85D8FE00} - {9951345F-620B-4BED-BB51-4F928CAFD454} = {66F85B8F-11B7-4964-B51E-99DF85D8FE00} - {0149BA6E-3C0A-426D-AA0A-0B9EC7742F19} = {66F85B8F-11B7-4964-B51E-99DF85D8FE00} {F1A9371F-9A34-45A0-98EB-83FF371F067F} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} {2BFFA1EE-039D-479E-9BCC-2D12F8AEDD16} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} {B8588C07-9CE2-456C-83B1-86E4B65D4108} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} {878F5BF0-652A-4FDB-992B-BB7F26D62F0D} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} {FDB5539F-1060-4975-B603-B66454C8C897} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} + {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9} = {1DA0A8E2-5832-42FC-83F7-2CDCAD379C90} {8BD95440-9000-4745-8011-27DD553EF06F} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} {E35589C6-9509-4116-996F-1D045C2DACAE} = {B2087994-3DF6-4A57-B8C6-6F744520D7FA} - {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9} = {1DA0A8E2-5832-42FC-83F7-2CDCAD379C90} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {68CA0970-4242-4E4F-94D2-C19760FCA05D} diff --git a/samples/layouts/layouts.ico b/examples/layouts/layouts.ico similarity index 100% rename from samples/layouts/layouts.ico rename to examples/layouts/layouts.ico diff --git a/samples/layouts/layouts.rc b/examples/layouts/layouts.rc similarity index 100% rename from samples/layouts/layouts.rc rename to examples/layouts/layouts.rc diff --git a/samples/layouts/layouts.vcxproj b/examples/layouts/layouts.vcxproj similarity index 94% rename from samples/layouts/layouts.vcxproj rename to examples/layouts/layouts.vcxproj index c4e738f2..09e6bd26 100644 --- a/samples/layouts/layouts.vcxproj +++ b/examples/layouts/layouts.vcxproj @@ -1,4 +1,4 @@ - + @@ -75,7 +75,7 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) @@ -83,21 +83,21 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) $(ProjectName)64 @@ -194,15 +194,12 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - diff --git a/samples/layouts/layouts.vcxproj.filters b/examples/layouts/layouts.vcxproj.filters similarity index 100% rename from samples/layouts/layouts.vcxproj.filters rename to examples/layouts/layouts.vcxproj.filters diff --git a/samples/layouts/layouts_form.cpp b/examples/layouts/layouts_form.cpp similarity index 100% rename from samples/layouts/layouts_form.cpp rename to examples/layouts/layouts_form.cpp diff --git a/samples/layouts/layouts_form.h b/examples/layouts/layouts_form.h similarity index 100% rename from samples/layouts/layouts_form.h rename to examples/layouts/layouts_form.h diff --git a/samples/layouts/main.cpp b/examples/layouts/main.cpp similarity index 91% rename from samples/layouts/main.cpp rename to examples/layouts/main.cpp index 806a015f..d4e08fa4 100644 --- a/samples/layouts/main.cpp +++ b/examples/layouts/main.cpp @@ -24,13 +24,13 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // 获取资源路径,初始化全局参数 // 默认皮肤使用 resources\\themes\\default // 默认语言使用 resources\\lang\\zh_CN // 如需修改请指定 Startup 最后两个参数 - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(theme_dir + L"resources\\", ui::CreateControlCallback(), false); // 一个仿微信的布局示例 diff --git a/samples/layouts/main.h b/examples/layouts/main.h similarity index 100% rename from samples/layouts/main.h rename to examples/layouts/main.h diff --git a/samples/layouts/resource.h b/examples/layouts/resource.h similarity index 100% rename from samples/layouts/resource.h rename to examples/layouts/resource.h diff --git a/samples/layouts/small.ico b/examples/layouts/small.ico similarity index 100% rename from samples/layouts/small.ico rename to examples/layouts/small.ico diff --git a/samples/layouts/stdafx.cpp b/examples/layouts/stdafx.cpp similarity index 100% rename from samples/layouts/stdafx.cpp rename to examples/layouts/stdafx.cpp diff --git a/samples/basic/stdafx.h b/examples/layouts/stdafx.h similarity index 88% rename from samples/basic/stdafx.h rename to examples/layouts/stdafx.h index 9fae117e..95611366 100644 --- a/samples/basic/stdafx.h +++ b/examples/layouts/stdafx.h @@ -16,8 +16,5 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/layouts/targetver.h b/examples/layouts/targetver.h similarity index 100% rename from samples/layouts/targetver.h rename to examples/layouts/targetver.h diff --git a/samples/multi_browser/Resource.h b/examples/multi_browser/Resource.h similarity index 100% rename from samples/multi_browser/Resource.h rename to examples/multi_browser/Resource.h diff --git a/samples/multi_browser/browser/browser_box.cpp b/examples/multi_browser/browser/browser_box.cpp similarity index 97% rename from samples/multi_browser/browser/browser_box.cpp rename to examples/multi_browser/browser/browser_box.cpp index ef1cd5c7..234d36fd 100644 --- a/samples/multi_browser/browser/browser_box.cpp +++ b/examples/multi_browser/browser/browser_box.cpp @@ -48,7 +48,7 @@ void BrowserBox::InitBrowserBox(const std::wstring &url) // Ĭҳ std::wstring html_path = url; if (html_path.empty()) - html_path = QPath::GetAppPath() + L"resources\\themes\\default\\cef\\cef.html"; + html_path = nbase::win32::GetCurrentModuleDirectory() + L"resources\\themes\\default\\cef\\cef.html"; cef_control_->LoadURL(html_path); diff --git a/samples/multi_browser/browser/browser_box.h b/examples/multi_browser/browser/browser_box.h similarity index 100% rename from samples/multi_browser/browser/browser_box.h rename to examples/multi_browser/browser/browser_box.h diff --git a/samples/multi_browser/browser/custom_layout.cpp b/examples/multi_browser/browser/custom_layout.cpp similarity index 100% rename from samples/multi_browser/browser/custom_layout.cpp rename to examples/multi_browser/browser/custom_layout.cpp diff --git a/samples/multi_browser/browser/custom_layout.h b/examples/multi_browser/browser/custom_layout.h similarity index 100% rename from samples/multi_browser/browser/custom_layout.h rename to examples/multi_browser/browser/custom_layout.h diff --git a/samples/multi_browser/browser/multi_browser_form.cpp b/examples/multi_browser/browser/multi_browser_form.cpp similarity index 96% rename from samples/multi_browser/browser/multi_browser_form.cpp rename to examples/multi_browser/browser/multi_browser_form.cpp index 54aaf5df..e7aa0b92 100644 --- a/samples/multi_browser/browser/multi_browser_form.cpp +++ b/examples/multi_browser/browser/multi_browser_form.cpp @@ -249,7 +249,9 @@ bool MultiBrowserForm::OnClicked( ui::EventArgs* arg ) } else if (name == L"btn_add") { - MultiBrowserManager::GetInstance()->CreateBorwserBox(this, shared::tools::GenerateTimeStamp(), L""); + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + std::string timeStamp = nbase::StringPrintf("%I64u", time_delta.ToMilliseconds()); + MultiBrowserManager::GetInstance()->CreateBorwserBox(this, timeStamp, L""); } else if (active_browser_box_) { @@ -279,12 +281,16 @@ bool MultiBrowserForm::OnReturn(ui::EventArgs* arg) std::wstring name = arg->pSender->GetName(); if (name == L"edit_url") { -// // ڵǰҳת -// auto cef_control = active_browser_box_->GetCefControl(); -// if (cef_control) -// cef_control->LoadURL(edit_url_->GetText()); +#if 0 + // ڵǰҳת + auto cef_control = active_browser_box_->GetCefControl(); + if (cef_control) + cef_control->LoadURL(edit_url_->GetText()); +#endif + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + std::string timeStamp = nbase::StringPrintf("%I64u", time_delta.ToMilliseconds()); // ½ǩҳ - MultiBrowserManager::GetInstance()->CreateBorwserBox(this, shared::tools::GenerateTimeStamp(), edit_url_->GetText()); + MultiBrowserManager::GetInstance()->CreateBorwserBox(this, timeStamp, edit_url_->GetText()); } return false; diff --git a/samples/multi_browser/browser/multi_browser_form.h b/examples/multi_browser/browser/multi_browser_form.h similarity index 100% rename from samples/multi_browser/browser/multi_browser_form.h rename to examples/multi_browser/browser/multi_browser_form.h diff --git a/samples/multi_browser/browser/multi_browser_form_dragdrop.cpp b/examples/multi_browser/browser/multi_browser_form_dragdrop.cpp similarity index 92% rename from samples/multi_browser/browser/multi_browser_form_dragdrop.cpp rename to examples/multi_browser/browser/multi_browser_form_dragdrop.cpp index bc6d6332..6c8fb66d 100644 --- a/samples/multi_browser/browser/multi_browser_form_dragdrop.cpp +++ b/examples/multi_browser/browser/multi_browser_form_dragdrop.cpp @@ -23,17 +23,14 @@ bool MultiBrowserForm::InitDragDrop() IID_IDropTargetHelper, (void**)&drop_helper_))) { - QLOG_ERR(L"MultiBrowserForm::InitDragDrop Create CLSID_DragDropHelper faild"); return false; } if (FAILED(RegisterDragDrop(this->GetHWND(), this))) { - QLOG_ERR(L"MultiBrowserForm::InitDragDrop RegisterDragDrop faild"); return false; } - QLOG_APP(L"MultiBrowserForm::InitDragDrop succeed"); return true; } @@ -85,7 +82,6 @@ HRESULT MultiBrowserForm::DragEnter(IDataObject * pDataObject, DWORD grfKeyState } else { - QLOG_APP(L"MultiBrowserForm::Drop receive a BrowserBox"); *pdwEffect = DROPEFFECT_MOVE; } @@ -138,14 +134,15 @@ HRESULT MultiBrowserForm::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL // 如果不是拖拽浏览器盒子 if (!MultiBrowserManager::GetInstance()->IsDragingBorwserBox()) { -// if (NULL != active_browser_box_ && active_browser_box_->CheckDropEnable(pt)) -// { -// /ctive_browser_box_->Drop(pDataObj, grfKeyState, pt, pdwEffect); -// } +#if 0 + if (NULL != active_browser_box_ && active_browser_box_->CheckDropEnable(pt)) + { + active_browser_box_->Drop(pDataObj, grfKeyState, pt, pdwEffect); + } +#endif } else { - QLOG_APP(L"MultiBrowserForm::Drop drop a BrowserBox"); *pdwEffect = DROPEFFECT_MOVE; MultiBrowserManager::GetInstance()->SetDropForm(this); } @@ -189,7 +186,7 @@ bool MultiBrowserForm::OnProcessTabItemDrag(ui::EventArgs* param) StdClosure cb = [=]{ MultiBrowserManager::GetInstance()->DoDragBorwserBox(active_browser_box_, bitmap, pt); }; - nbase::ThreadManager::PostTask(kThreadUI, cb); + nbase::ThreadManager::PostTask(kThreadMain, cb); } } break; diff --git a/samples/multi_browser/browser/multi_browser_manager.cpp b/examples/multi_browser/browser/multi_browser_manager.cpp similarity index 100% rename from samples/multi_browser/browser/multi_browser_manager.cpp rename to examples/multi_browser/browser/multi_browser_manager.cpp diff --git a/samples/multi_browser/browser/multi_browser_manager.h b/examples/multi_browser/browser/multi_browser_manager.h similarity index 100% rename from samples/multi_browser/browser/multi_browser_manager.h rename to examples/multi_browser/browser/multi_browser_manager.h diff --git a/samples/multi_browser/control/browser_tab_item.cpp b/examples/multi_browser/control/browser_tab_item.cpp similarity index 100% rename from samples/multi_browser/control/browser_tab_item.cpp rename to examples/multi_browser/control/browser_tab_item.cpp diff --git a/samples/multi_browser/control/browser_tab_item.h b/examples/multi_browser/control/browser_tab_item.h similarity index 100% rename from samples/multi_browser/control/browser_tab_item.h rename to examples/multi_browser/control/browser_tab_item.h diff --git a/samples/multi_browser/dragdrop/bitmap_control.cpp b/examples/multi_browser/dragdrop/bitmap_control.cpp similarity index 100% rename from samples/multi_browser/dragdrop/bitmap_control.cpp rename to examples/multi_browser/dragdrop/bitmap_control.cpp diff --git a/samples/multi_browser/dragdrop/bitmap_control.h b/examples/multi_browser/dragdrop/bitmap_control.h similarity index 100% rename from samples/multi_browser/dragdrop/bitmap_control.h rename to examples/multi_browser/dragdrop/bitmap_control.h diff --git a/samples/multi_browser/dragdrop/drag_drop.cpp b/examples/multi_browser/dragdrop/drag_drop.cpp similarity index 100% rename from samples/multi_browser/dragdrop/drag_drop.cpp rename to examples/multi_browser/dragdrop/drag_drop.cpp diff --git a/samples/multi_browser/dragdrop/drag_drop.h b/examples/multi_browser/dragdrop/drag_drop.h similarity index 100% rename from samples/multi_browser/dragdrop/drag_drop.h rename to examples/multi_browser/dragdrop/drag_drop.h diff --git a/samples/multi_browser/dragdrop/drag_form.cpp b/examples/multi_browser/dragdrop/drag_form.cpp similarity index 100% rename from samples/multi_browser/dragdrop/drag_form.cpp rename to examples/multi_browser/dragdrop/drag_form.cpp diff --git a/samples/multi_browser/dragdrop/drag_form.h b/examples/multi_browser/dragdrop/drag_form.h similarity index 100% rename from samples/multi_browser/dragdrop/drag_form.h rename to examples/multi_browser/dragdrop/drag_form.h diff --git a/samples/multi_browser/main.cpp b/examples/multi_browser/main.cpp similarity index 74% rename from samples/multi_browser/main.cpp rename to examples/multi_browser/main.cpp index 1b0dc600..86003e91 100644 --- a/samples/multi_browser/main.cpp +++ b/examples/multi_browser/main.cpp @@ -34,7 +34,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, // 初始化 CEF CefSettings settings; - if (!nim_cef::CefManager::GetInstance()->Initialize(QPath::GetAppPath() + L"cef_temp\\", settings, true)) + if (!nim_cef::CefManager::GetInstance()->Initialize(nbase::win32::GetCurrentModuleDirectory() + L"cef_temp\\", settings, true)) { return 0; } @@ -55,12 +55,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(theme_dir + L"resources\\", ui::CreateControlCallback(), false); - MultiBrowserManager::GetInstance()->CreateBorwserBox(NULL, shared::tools::GenerateTimeStamp(), L""); + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + std::string timeStamp = nbase::StringPrintf("%I64u", time_delta.ToMilliseconds()); + MultiBrowserManager::GetInstance()->CreateBorwserBox(NULL, timeStamp, L""); } void MainThread::Cleanup() diff --git a/samples/multi_browser/main.h b/examples/multi_browser/main.h similarity index 100% rename from samples/multi_browser/main.h rename to examples/multi_browser/main.h diff --git a/samples/multi_browser/multi_browser.ico b/examples/multi_browser/multi_browser.ico similarity index 100% rename from samples/multi_browser/multi_browser.ico rename to examples/multi_browser/multi_browser.ico diff --git a/samples/multi_browser/multi_browser.rc b/examples/multi_browser/multi_browser.rc similarity index 100% rename from samples/multi_browser/multi_browser.rc rename to examples/multi_browser/multi_browser.rc diff --git a/samples/multi_browser/multi_browser.vcxproj b/examples/multi_browser/multi_browser.vcxproj similarity index 90% rename from samples/multi_browser/multi_browser.vcxproj rename to examples/multi_browser/multi_browser.vcxproj index 450fdedc..71731080 100644 --- a/samples/multi_browser/multi_browser.vcxproj +++ b/examples/multi_browser/multi_browser.vcxproj @@ -59,12 +59,12 @@ ..\..\bin\ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d - .\;..\;..\..\;..\..\tool_kits\;..\..\tool_kits\ui_components\;..\..\third_party\cef_wrapper\;$(IncludePath) + .\;..\;..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\;$(LibraryPath) false - .\;..\;..\..\;..\..\tool_kits\;..\..\tool_kits\ui_components\;..\..\third_party\cef_wrapper\;$(IncludePath) + .\;..\;..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\;$(LibraryPath) ..\..\bin\ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ @@ -73,11 +73,11 @@ ..\..\bin\ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d - .\;..\;..\..\;..\..\tool_kits\;..\..\tool_kits\ui_components\;..\..\third_party\cef_wrapper\;$(IncludePath) + .\;..\;..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\x64\;$(LibraryPath) - .\;..\;..\..\;..\..\tool_kits\;..\..\tool_kits\ui_components\;..\..\third_party\cef_wrapper\;$(IncludePath) + .\;..\;..\..\;..\..\third_party\cef_wrapper\;$(IncludePath) ..\..\libs\x64\;$(LibraryPath) ..\..\bin\ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ @@ -180,16 +180,13 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - - + {0149ba6e-3c0a-426d-aa0a-0b9ec7742f19} diff --git a/samples/multi_browser/multi_browser.vcxproj.filters b/examples/multi_browser/multi_browser.vcxproj.filters similarity index 100% rename from samples/multi_browser/multi_browser.vcxproj.filters rename to examples/multi_browser/multi_browser.vcxproj.filters diff --git a/samples/multi_browser/small.ico b/examples/multi_browser/small.ico similarity index 100% rename from samples/multi_browser/small.ico rename to examples/multi_browser/small.ico diff --git a/samples/multi_browser/stdafx.cpp b/examples/multi_browser/stdafx.cpp similarity index 100% rename from samples/multi_browser/stdafx.cpp rename to examples/multi_browser/stdafx.cpp diff --git a/samples/multi_browser/stdafx.h b/examples/multi_browser/stdafx.h similarity index 89% rename from samples/multi_browser/stdafx.h rename to examples/multi_browser/stdafx.h index 014638e1..4afaa671 100644 --- a/samples/multi_browser/stdafx.h +++ b/examples/multi_browser/stdafx.h @@ -16,9 +16,6 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/multi_browser/targetver.h b/examples/multi_browser/targetver.h similarity index 100% rename from samples/multi_browser/targetver.h rename to examples/multi_browser/targetver.h diff --git a/samples/multi_browser/taskbar/dwm_util.cpp b/examples/multi_browser/taskbar/dwm_util.cpp similarity index 100% rename from samples/multi_browser/taskbar/dwm_util.cpp rename to examples/multi_browser/taskbar/dwm_util.cpp diff --git a/samples/multi_browser/taskbar/dwm_util.h b/examples/multi_browser/taskbar/dwm_util.h similarity index 100% rename from samples/multi_browser/taskbar/dwm_util.h rename to examples/multi_browser/taskbar/dwm_util.h diff --git a/samples/multi_browser/taskbar/taskbar_manager.cpp b/examples/multi_browser/taskbar/taskbar_manager.cpp similarity index 99% rename from samples/multi_browser/taskbar/taskbar_manager.cpp rename to examples/multi_browser/taskbar/taskbar_manager.cpp index ab00cb45..a0280bf5 100644 --- a/samples/multi_browser/taskbar/taskbar_manager.cpp +++ b/examples/multi_browser/taskbar/taskbar_manager.cpp @@ -37,7 +37,6 @@ void TaskbarTabItem::Init(const std::wstring &taskbar_title, const std::string & if (ret != S_OK) { is_win7_or_greater_ = false; - QLOG_ERR(L"DwmSetWindowAttribute error: {0}") << ret; } } diff --git a/samples/multi_browser/taskbar/taskbar_manager.h b/examples/multi_browser/taskbar/taskbar_manager.h similarity index 100% rename from samples/multi_browser/taskbar/taskbar_manager.h rename to examples/multi_browser/taskbar/taskbar_manager.h diff --git a/samples/richlist/item.cpp b/examples/richlist/item.cpp similarity index 80% rename from samples/richlist/item.cpp rename to examples/richlist/item.cpp index 9072186b..ee50c78c 100644 --- a/samples/richlist/item.cpp +++ b/examples/richlist/item.cpp @@ -20,14 +20,12 @@ void Item::InitSubControls(const std::wstring& img, const std::wstring& title) btn_del_ = dynamic_cast(FindSubControl(L"btn_del")); // ģ - auto timestamp = shared::tools::GenerateTimeStamp(); - int64_t timestamp_num = 0; - nbase::StringToInt64(timestamp, ×tamp_num); - progress_->SetValue((double)(timestamp_num % 100)); + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + progress_->SetValue((double)(time_delta.ToMilliseconds() % 100)); // ͼ control_img_->SetBkImage(img); - label_title_->SetText(nbase::StringPrintf(L"%s %d%%", title.c_str(), timestamp_num % 100)); + label_title_->SetText(nbase::StringPrintf(L"%s %d%%", title.c_str(), time_delta.ToMilliseconds() % 100)); // ɾ btn_del_->AttachClick(nbase::Bind(&Item::OnRemove, this, std::placeholders::_1)); diff --git a/samples/richlist/item.h b/examples/richlist/item.h similarity index 100% rename from samples/richlist/item.h rename to examples/richlist/item.h diff --git a/samples/richlist/main.cpp b/examples/richlist/main.cpp similarity index 90% rename from samples/richlist/main.cpp rename to examples/richlist/main.cpp index 2de54cd6..4ffa5464 100644 --- a/samples/richlist/main.cpp +++ b/examples/richlist/main.cpp @@ -24,10 +24,10 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // 获取资源路径,初始化全局参数 - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(theme_dir + L"resources\\", ui::CreateControlCallback(), false); // 创建一个默认带有阴影的居中窗口 diff --git a/samples/richlist/main.h b/examples/richlist/main.h similarity index 100% rename from samples/richlist/main.h rename to examples/richlist/main.h diff --git a/samples/richlist/resource.h b/examples/richlist/resource.h similarity index 100% rename from samples/richlist/resource.h rename to examples/richlist/resource.h diff --git a/samples/richlist/richlist.ico b/examples/richlist/richlist.ico similarity index 100% rename from samples/richlist/richlist.ico rename to examples/richlist/richlist.ico diff --git a/samples/richlist/richlist.rc b/examples/richlist/richlist.rc similarity index 100% rename from samples/richlist/richlist.rc rename to examples/richlist/richlist.rc diff --git a/samples/richlist/richlist.vcxproj b/examples/richlist/richlist.vcxproj similarity index 93% rename from samples/richlist/richlist.vcxproj rename to examples/richlist/richlist.vcxproj index 21dd5e21..176fa5f7 100644 --- a/samples/richlist/richlist.vcxproj +++ b/examples/richlist/richlist.vcxproj @@ -75,7 +75,7 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) @@ -83,21 +83,21 @@ $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ $(ProjectName)64_d ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) false $(ProjectDir)..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ ..\..\bin\ - ..\..\tool_kits\;$(IncludePath) + ..\..\;$(IncludePath) $(LibraryPath) $(ProjectName)64 @@ -196,16 +196,13 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - - + {0149ba6e-3c0a-426d-aa0a-0b9ec7742f19} diff --git a/samples/richlist/richlist.vcxproj.filters b/examples/richlist/richlist.vcxproj.filters similarity index 100% rename from samples/richlist/richlist.vcxproj.filters rename to examples/richlist/richlist.vcxproj.filters diff --git a/samples/richlist/richlist_form.cpp b/examples/richlist/richlist_form.cpp similarity index 100% rename from samples/richlist/richlist_form.cpp rename to examples/richlist/richlist_form.cpp diff --git a/samples/richlist/richlist_form.h b/examples/richlist/richlist_form.h similarity index 100% rename from samples/richlist/richlist_form.h rename to examples/richlist/richlist_form.h diff --git a/samples/richlist/small.ico b/examples/richlist/small.ico similarity index 100% rename from samples/richlist/small.ico rename to examples/richlist/small.ico diff --git a/samples/richlist/stdafx.cpp b/examples/richlist/stdafx.cpp similarity index 100% rename from samples/richlist/stdafx.cpp rename to examples/richlist/stdafx.cpp diff --git a/samples/richlist/stdafx.h b/examples/richlist/stdafx.h similarity index 89% rename from samples/richlist/stdafx.h rename to examples/richlist/stdafx.h index d15652aa..337ee2a2 100644 --- a/samples/richlist/stdafx.h +++ b/examples/richlist/stdafx.h @@ -16,9 +16,6 @@ // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/richlist/targetver.h b/examples/richlist/targetver.h similarity index 100% rename from samples/richlist/targetver.h rename to examples/richlist/targetver.h diff --git a/samples/virtualbox/Resource.h b/examples/virtualbox/Resource.h similarity index 100% rename from samples/virtualbox/Resource.h rename to examples/virtualbox/Resource.h diff --git a/samples/virtualbox/VirtualTileBox.cpp b/examples/virtualbox/VirtualTileBox.cpp similarity index 100% rename from samples/virtualbox/VirtualTileBox.cpp rename to examples/virtualbox/VirtualTileBox.cpp diff --git a/samples/virtualbox/VirtualTileBox.h b/examples/virtualbox/VirtualTileBox.h similarity index 97% rename from samples/virtualbox/VirtualTileBox.h rename to examples/virtualbox/VirtualTileBox.h index ecd8913f..6566e35b 100644 --- a/samples/virtualbox/VirtualTileBox.h +++ b/examples/virtualbox/VirtualTileBox.h @@ -1,7 +1,7 @@ #pragma once -typedef function DataChangedNotify; -typedef function CountChangedNotify; +typedef std::function DataChangedNotify; +typedef std::function CountChangedNotify; class UILIB_API VirtualTileInterface: public nbase::SupportWeakCallback { diff --git a/samples/virtualbox/item.cpp b/examples/virtualbox/item.cpp similarity index 84% rename from samples/virtualbox/item.cpp rename to examples/virtualbox/item.cpp index 8af32a0e..d9dff7a3 100644 --- a/samples/virtualbox/item.cpp +++ b/examples/virtualbox/item.cpp @@ -22,11 +22,9 @@ void Item::InitSubControls(const std::wstring& img, const std::wstring& title, i progress_ = dynamic_cast(FindSubControl(L"progress")); btn_del_ = dynamic_cast(FindSubControl(L"btn_del")); // ģ - auto timestamp = shared::tools::GenerateTimeStamp(); - int64_t timestamp_num = 0; - nbase::StringToInt64(timestamp, ×tamp_num); - t_time = timestamp_num; - progress_->SetValue((double)(timestamp_num % 100)); + nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); + t_time = time_delta.ToMilliseconds(); + progress_->SetValue((double)(time_delta.ToMilliseconds() % 100)); // ͼ control_img_->SetBkImage(img); // ɾ diff --git a/samples/virtualbox/item.h b/examples/virtualbox/item.h similarity index 100% rename from samples/virtualbox/item.h rename to examples/virtualbox/item.h diff --git a/samples/virtualbox/main.cpp b/examples/virtualbox/main.cpp similarity index 90% rename from samples/virtualbox/main.cpp rename to examples/virtualbox/main.cpp index d316f2e8..4f9993b0 100644 --- a/samples/virtualbox/main.cpp +++ b/examples/virtualbox/main.cpp @@ -34,10 +34,10 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, void MainThread::Init() { - nbase::ThreadManager::RegisterThread(kThreadUI); + nbase::ThreadManager::RegisterThread(kThreadMain); // ȡԴ·ʼȫֲ - std::wstring theme_dir = QPath::GetAppPath(); + std::wstring theme_dir = nbase::win32::GetCurrentModuleDirectory(); ui::GlobalManager::Startup(theme_dir + L"resources\\", MyCreateControlCallback, false); // һĬϴӰľд diff --git a/samples/virtualbox/main.h b/examples/virtualbox/main.h similarity index 100% rename from samples/virtualbox/main.h rename to examples/virtualbox/main.h diff --git a/samples/virtualbox/main_form.cpp b/examples/virtualbox/main_form.cpp similarity index 100% rename from samples/virtualbox/main_form.cpp rename to examples/virtualbox/main_form.cpp diff --git a/samples/virtualbox/main_form.h b/examples/virtualbox/main_form.h similarity index 100% rename from samples/virtualbox/main_form.h rename to examples/virtualbox/main_form.h diff --git a/samples/virtualbox/provider.cpp b/examples/virtualbox/provider.cpp similarity index 91% rename from samples/virtualbox/provider.cpp rename to examples/virtualbox/provider.cpp index ea40c1b2..b60a734b 100644 --- a/samples/virtualbox/provider.cpp +++ b/examples/virtualbox/provider.cpp @@ -74,9 +74,9 @@ void Provider::RemoveTask(int nIndex) EmitCountChanged(); } -void Provider::ChangeTaskName(int nIndex, const wstring& sName) +void Provider::ChangeTaskName(int nIndex, const std::wstring& sName) { - if (nIndex > 0 && nIndex < m_vTasks.size()) + if (nIndex > 0 && nIndex < (int)m_vTasks.size()) { m_vTasks[nIndex].sName = sName; } diff --git a/samples/virtualbox/provider.h b/examples/virtualbox/provider.h similarity index 89% rename from samples/virtualbox/provider.h rename to examples/virtualbox/provider.h index 5fdb8b60..f18205e9 100644 --- a/samples/virtualbox/provider.h +++ b/examples/virtualbox/provider.h @@ -6,7 +6,7 @@ struct DownloadTask { int nId; - wstring sName; + std::wstring sName; }; class Provider : public VirtualTileInterface @@ -34,7 +34,7 @@ public: public: void SetTotal(int nTotal); void RemoveTask(int nIndex); - void ChangeTaskName(int nIndex, const wstring& sName); + void ChangeTaskName(int nIndex, const std::wstring& sName); private: int m_nTotal; diff --git a/samples/virtualbox/small.ico b/examples/virtualbox/small.ico similarity index 100% rename from samples/virtualbox/small.ico rename to examples/virtualbox/small.ico diff --git a/samples/virtualbox/stdafx.cpp b/examples/virtualbox/stdafx.cpp similarity index 100% rename from samples/virtualbox/stdafx.cpp rename to examples/virtualbox/stdafx.cpp diff --git a/samples/virtualbox/stdafx.h b/examples/virtualbox/stdafx.h similarity index 90% rename from samples/virtualbox/stdafx.h rename to examples/virtualbox/stdafx.h index e0159f3f..35e2d627 100644 --- a/samples/virtualbox/stdafx.h +++ b/examples/virtualbox/stdafx.h @@ -16,15 +16,11 @@ #include #include #include - - +#include // base header #include "base/base.h" -// shared project -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/samples/virtualbox/targetver.h b/examples/virtualbox/targetver.h similarity index 100% rename from samples/virtualbox/targetver.h rename to examples/virtualbox/targetver.h diff --git a/samples/virtualbox/virtualbox.filters b/examples/virtualbox/virtualbox.filters similarity index 100% rename from samples/virtualbox/virtualbox.filters rename to examples/virtualbox/virtualbox.filters diff --git a/samples/virtualbox/virtualbox.ico b/examples/virtualbox/virtualbox.ico similarity index 100% rename from samples/virtualbox/virtualbox.ico rename to examples/virtualbox/virtualbox.ico diff --git a/samples/virtualbox/virtualbox.rc b/examples/virtualbox/virtualbox.rc similarity index 100% rename from samples/virtualbox/virtualbox.rc rename to examples/virtualbox/virtualbox.rc diff --git a/samples/virtualbox/virtualbox.vcxproj b/examples/virtualbox/virtualbox.vcxproj similarity index 92% rename from samples/virtualbox/virtualbox.vcxproj rename to examples/virtualbox/virtualbox.vcxproj index 688aa885..0fbb98c1 100644 --- a/samples/virtualbox/virtualbox.vcxproj +++ b/examples/virtualbox/virtualbox.vcxproj @@ -59,7 +59,7 @@ WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreadedDebug - ..\..\tool_kits\; + ..\..\ Windows @@ -76,7 +76,7 @@ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreaded - ..\..\tool_kits\; + ..\..\ Windows @@ -114,15 +114,12 @@ - + {8d9a6595-717a-41c8-b468-0011a72be3d1} - + {e106acd7-4e53-4aee-942b-d0dd426db34e} - - {9951345f-620b-4bed-bb51-4f928cafd454} - diff --git a/tool_kits/shared/base.h b/tool_kits/shared/base.h deleted file mode 100644 index cf63ddde..00000000 --- a/tool_kits/shared/base.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "log.h" -#include "closure.h" -#include "zoom_image.h" \ No newline at end of file diff --git a/tool_kits/shared/closure.cpp b/tool_kits/shared/closure.cpp deleted file mode 100644 index d0fa3ca4..00000000 --- a/tool_kits/shared/closure.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "stdafx.h" -#include "closure.h" -#include "shared/threads.h" -#include "base/thread/thread_manager.h" - -void Post2UI(const StdClosure &closure) -{ - nbase::ThreadManager::PostTask(kThreadUI, closure); -} - -void Post2GlobalMisc(const StdClosure &closure) -{ - nbase::ThreadManager::PostTask(kThreadGlobalMisc, closure); -} - -void Post2Database(const StdClosure &closure) -{ - nbase::ThreadManager::PostTask(kThreadDatabase, closure); -} diff --git a/tool_kits/shared/closure.h b/tool_kits/shared/closure.h deleted file mode 100644 index 38eaf562..00000000 --- a/tool_kits/shared/closure.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -//#include "util.h" -#include "base/callback/callback.h" - -//ͶUI߳ -void Post2UI(const StdClosure &closure); - -//ͶȫMisc߳ -void Post2GlobalMisc(const StdClosure &closure); - -//ͶDB߳ -void Post2Database(const StdClosure &closure); \ No newline at end of file diff --git a/tool_kits/shared/cmd_line.cpp b/tool_kits/shared/cmd_line.cpp deleted file mode 100644 index 887ded7e..00000000 --- a/tool_kits/shared/cmd_line.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "stdafx.h" -#include "cmd_line.h" -#include "base/util/string_util.h" - -namespace shared -{ -CommandLine::CommandLine(const std::wstring &cmd) : cmd_(cmd) -{ - Parse(cmd_, map_); -} - -CommandLine::~CommandLine() -{ - -} - -bool CommandLine::Parse(const std::wstring &cmd, std::map ¶m_map) -{ - std::list param_list; - if (nbase::StringTokenize(cmd, L"/", param_list) == 0) - return false; - - std::wstring token, key, value; - size_t pos; - for (std::list::iterator it = param_list.begin(); it != param_list.end(); ++it) - { - token = *it; - key = L""; - value = L""; - pos = token.find(L' ', 0); - if (pos < 0 || pos >= token.size()) - pos = token.size(); - key = token.substr(0, pos); - if (pos < token.size()) - { - value = token.substr(pos, token.size() - pos); - value = nbase::StringTrim(value.c_str()); - if (value.size() >= 2 && value[0] == '"' && value[value.size()-1] == '"') - { - std::wstring str = value.substr(1, value.size() - 2); - value = str; - } - } - param_map[key] = value; - } - - return true; -} - -bool CommandLine::Get(const std::wstring &key, std::wstring &value) -{ - value = L""; - if (map_.size() == 0) - return false; - - std::map::iterator it = map_.find(key); - if (it == map_.end()) - return false; - - value = it->second; - - return true; -} - -std::map CommandLine::GetMap(void) -{ - return map_; -} - -bool CommandLine::IsExist(const std::wstring &key) -{ - return (map_.find(key) != map_.end()); -} -}//namespace shared \ No newline at end of file diff --git a/tool_kits/shared/cmd_line.h b/tool_kits/shared/cmd_line.h deleted file mode 100644 index 0f2bd9f0..00000000 --- a/tool_kits/shared/cmd_line.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef SHARED_CMD_LINE_H_ -#define SHARED_CMD_LINE_H_ - -#include -#include - -namespace shared -{ -class CommandLine -{ -public: - CommandLine(const std::wstring &cmd); - ~CommandLine(); - - bool Get(const std::wstring &key, std::wstring &value); - bool IsExist(const std::wstring &key); - std::map GetMap(void); - -protected: - // 򵥽cmd'/'ָ'/' - static bool Parse(const std::wstring &cmd, std::map ¶m_map); - -protected: - std::wstring cmd_; - std::map map_; -}; -}//namespace shared - -#endif //SHARED_CMD_LINE_H_ diff --git a/tool_kits/shared/db_helper.cpp b/tool_kits/shared/db_helper.cpp deleted file mode 100644 index b9694dbc..00000000 --- a/tool_kits/shared/db_helper.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "stdafx.h" -#include "shared/db_helper.h" -#include "shared/utf8_file_util.h" -#include "base/util/string_util.h" -namespace shared -{ - - bool NimDBPretreatment::FilePathIsExist(const std::string& file_path, bool is_directory) - { - return shared::FilePathIsExist(file_path, is_directory); - } - bool NimDBPretreatment::DeleteFile(const std::string& file_path) - { - return shared::DeleteFile(file_path) && (GetLastError() == 0); - } - bool NimDBPretreatment::CopyFile(const std::string &from_path, const std::string &to_path, bool fail_if_exists) - { - return shared::CopyFile(from_path, to_path) && (GetLastError() == 0); - } - bool NimDBPretreatment::CreateDir(const std::string& dir_path) - { - return shared::CreateDirectory(dir_path); - } - bool NimDBPretreatment::GetDirFromPath(const std::string& file_path, std::string& dir) - { - return shared::FilePathApartDirectory(file_path, dir); - } - bool NimDBPretreatment::GetFileNameFromPath(const std::string& file_path, std::string& name, std::string& ext) - { - std::string file_name; - if (!shared::FilePathApartFileName(file_path, name)) - return false; - if (name.empty()) - return false; - shared::FilePathExtension(file_name, ext); - return true; - } - bool NimDBPretreatment::MoveFile(const std::string &from_path, const std::string &to_path) - { - std::wstring w_from_path = nbase::UTF8ToUTF16(from_path); - std::wstring w_to_path = nbase::UTF8ToUTF16(to_path); - return (::MoveFile(w_from_path.c_str(), w_to_path.c_str()) == TRUE); - //return (::MoveFileA(from_path.c_str(), to_path.c_str()) == TRUE); - } - void NimDBPretreatment::ClearTLSLastError() - { - ::SetLastError(0); - } - unsigned int NimDBPretreatment::GetTLSLastError() - { - return (unsigned int)GetLastError(); - } - void NimDBPretreatment::LockDBFile() - { - db_lock_.Lock(); - } - void NimDBPretreatment::UnLockDBFile() - { - db_lock_.Unlock(); - } -} \ No newline at end of file diff --git a/tool_kits/shared/db_helper.h b/tool_kits/shared/db_helper.h deleted file mode 100644 index 68c59388..00000000 --- a/tool_kits/shared/db_helper.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include "base/memory/singleton.h" -#include "base/synchronization/lock.h" -#include "base/callback/callback.h" -#include "db/db_pretreatment.h" -#include "shared/tool.h" -namespace shared -{ -typedef int NimDBVersionType; -class NimDBPretreatment : public ndb::DBPretreatment, public ndb::DBPretreatment::FileSystem -{ -public: - virtual bool FilePathIsExist(const std::string& file_path, bool is_directory) override; - virtual bool DeleteFile(const std::string& file_path) override; - virtual bool CopyFile(const std::string &from_path, const std::string &to_path, bool fail_if_exists) override; - virtual bool CreateDir(const std::string& dir_path) override; - virtual bool GetDirFromPath(const std::string& file_path, std::string& dir) override;//dir δβ"/" or "\\" - virtual bool GetFileNameFromPath(const std::string& file_path, std::string& name, std::string& ext) override; - virtual bool MoveFile(const std::string &from_path, const std::string &to_path) override; - virtual void ClearTLSLastError() override; - virtual unsigned int GetTLSLastError() override; - virtual void LockDBFile() override; - virtual void UnLockDBFile() override; -protected: - nbase::NLock db_lock_; -}; -class NimDatabase : public NimDBPretreatment, virtual public nbase::SupportWeakCallback -{ -public: - NimDatabase(NimDBVersionType base_version, NimDBVersionType newest_version) : - base_version_(base_version), newest_version_(newest_version) - { - } -public: - bool CreateDB() - { - PretreatmentConfig&& config = CreatePretreatmentConfig(); - config.db_path_ = std::move(GetDBPath()); - config.base_version_ = base_version_; - config.newest_version_ = newest_version_; - if (config.newest_version_ < config.base_version_) - config.newest_version_ = config.base_version_; - if (!config.db_path_.empty() && OnBeforCreateDatabase(config)) - { - NimDBPretreatment::Init(config); - return NimDBPretreatment::DoPretreatment(this, GetEncryptKey(), create_db_sqls_, update_function_list_); - } - return false; - }; - virtual bool CloseDB() override - { - OnBeforCloseDatabase(); - return NimDBPretreatment::CloseDB();; - }; -protected: - virtual void AddCreateDBSql(const std::string& sql) - { - create_db_sqls_.push_back(sql); - } - virtual void AddCreateDBSql(std::string&& sql) - { - create_db_sqls_.push_back(std::forward(sql)); - } - virtual void AddUpdateFunction(NimDBVersionType version, const DBUpdateFunc& opration) - { - update_function_list_.insert(std::make_pair(version, opration)); - } - virtual void AddUpdateFunction(NimDBVersionType version, DBUpdateFunc&& opration) - { - update_function_list_.insert(std::make_pair(version, std::forward(opration))); - } - virtual void OnClear() override - { - create_db_sqls_.clear(); - update_function_list_.clear(); - } - virtual bool OnBeforCreateDatabase(PretreatmentConfig& config) - { - return true; - } - virtual bool OnBeforCloseDatabase() - { - return true; - } - virtual std::string GetEncryptKey() const - { - return ""; - } - virtual std::string GetDBPath() const = 0; -private: - inline PretreatmentConfig CreatePretreatmentConfig() - { - PretreatmentConfig config; - config.back_db_dir_ = ""; - config.enable_backup_ = true; - config.enable_restore_ = false; - config.enable_def_restore_ = false; - return config; - } -private: - std::list create_db_sqls_; - DBUpdateFuncList update_function_list_; - NimDBVersionType base_version_; - NimDBVersionType newest_version_; -}; -} \ No newline at end of file diff --git a/tool_kits/shared/image_ole_i.c b/tool_kits/shared/image_ole_i.c deleted file mode 100644 index eda4a288..00000000 --- a/tool_kits/shared/image_ole_i.c +++ /dev/null @@ -1,94 +0,0 @@ - - -/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ - -/* link this file in with the server and any clients */ - - - /* File created by MIDL compiler version 7.00.0555 */ -/* at Thu Jul 20 13:21:34 2017 - */ -/* Compiler settings for image_ole.idl: - Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -/* @@MIDL_FILE_HEADING( ) */ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - - -#ifdef __cplusplus -extern "C"{ -#endif - - -#include -#include - -#ifdef _MIDL_USE_GUIDDEF_ - -#ifndef INITGUID -#define INITGUID -#include -#undef INITGUID -#else -#include -#endif - -#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) - -#else // !_MIDL_USE_GUIDDEF_ - -#ifndef __IID_DEFINED__ -#define __IID_DEFINED__ - -typedef struct _IID -{ - unsigned long x; - unsigned short s1; - unsigned short s2; - unsigned char c[8]; -} IID; - -#endif // __IID_DEFINED__ - -#ifndef CLSID_DEFINED -#define CLSID_DEFINED -typedef IID CLSID; -#endif // CLSID_DEFINED - -#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} - -#endif !_MIDL_USE_GUIDDEF_ - -MIDL_DEFINE_GUID(IID, IID_IComponentRegistrar,0xa817e7a2,0x43fa,0x11d0,0x9e,0x44,0x00,0xaa,0x00,0xb6,0x77,0x0a); - - -MIDL_DEFINE_GUID(IID, IID_IImageOle,0xFDEEBA15,0x2214,0x4AAA,0x82,0x22,0x73,0x54,0x49,0x1B,0xE2,0x6C); - - -MIDL_DEFINE_GUID(IID, LIBID_image_oleLib,0x20667E6E,0x41AD,0x40D0,0xBF,0xE9,0x94,0x84,0x0D,0x87,0x2C,0xD4); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CompReg,0x070D3F66,0x491B,0x4F0D,0x9E,0xCC,0x53,0x58,0xBB,0x7B,0x03,0x03); - - -MIDL_DEFINE_GUID(IID, DIID__IImageOleEvents,0x280EB118,0xCF3F,0x49C4,0xA6,0xE2,0xDE,0x4B,0x00,0x8C,0x5B,0xBB); - - -MIDL_DEFINE_GUID(CLSID, CLSID_ImageOle,0xB0C73E85,0x1599,0x4705,0xBD,0x6B,0xDB,0x1D,0xF7,0x67,0xFC,0x6D); - -#undef MIDL_DEFINE_GUID - -#ifdef __cplusplus -} -#endif - - - diff --git a/tool_kits/shared/image_ole_i.h b/tool_kits/shared/image_ole_i.h deleted file mode 100644 index c958ffb6..00000000 --- a/tool_kits/shared/image_ole_i.h +++ /dev/null @@ -1,729 +0,0 @@ - - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 7.00.0555 */ -/* at Thu Jul 20 13:21:34 2017 - */ -/* Compiler settings for image_ole.idl: - Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -/* @@MIDL_FILE_HEADING( ) */ - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __image_ole_i_h__ -#define __image_ole_i_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IComponentRegistrar_FWD_DEFINED__ -#define __IComponentRegistrar_FWD_DEFINED__ -typedef interface IComponentRegistrar IComponentRegistrar; -#endif /* __IComponentRegistrar_FWD_DEFINED__ */ - - -#ifndef __IImageOle_FWD_DEFINED__ -#define __IImageOle_FWD_DEFINED__ -typedef interface IImageOle IImageOle; -#endif /* __IImageOle_FWD_DEFINED__ */ - - -#ifndef __CompReg_FWD_DEFINED__ -#define __CompReg_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class CompReg CompReg; -#else -typedef struct CompReg CompReg; -#endif /* __cplusplus */ - -#endif /* __CompReg_FWD_DEFINED__ */ - - -#ifndef ___IImageOleEvents_FWD_DEFINED__ -#define ___IImageOleEvents_FWD_DEFINED__ -typedef interface _IImageOleEvents _IImageOleEvents; -#endif /* ___IImageOleEvents_FWD_DEFINED__ */ - - -#ifndef __ImageOle_FWD_DEFINED__ -#define __ImageOle_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class ImageOle ImageOle; -#else -typedef struct ImageOle ImageOle; -#endif /* __cplusplus */ - -#endif /* __ImageOle_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" - -#ifdef __cplusplus -extern "C"{ -#endif - - -#ifndef __IComponentRegistrar_INTERFACE_DEFINED__ -#define __IComponentRegistrar_INTERFACE_DEFINED__ - -/* interface IComponentRegistrar */ -/* [unique][dual][uuid][object] */ - - -EXTERN_C const IID IID_IComponentRegistrar; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("a817e7a2-43fa-11d0-9e44-00aa00b6770a") - IComponentRegistrar : public IDispatch - { - public: - virtual /* [id] */ HRESULT STDMETHODCALLTYPE Attach( - /* [in] */ BSTR bstrPath) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE RegisterAll( void) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE UnregisterAll( void) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetComponents( - /* [out] */ SAFEARRAY * *pbstrCLSIDs, - /* [out] */ SAFEARRAY * *pbstrDescriptions) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE RegisterComponent( - /* [in] */ BSTR bstrCLSID) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE UnregisterComponent( - /* [in] */ BSTR bstrCLSID) = 0; - - }; - -#else /* C style interface */ - - typedef struct IComponentRegistrarVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IComponentRegistrar * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IComponentRegistrar * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IComponentRegistrar * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IComponentRegistrar * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IComponentRegistrar * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IComponentRegistrar * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [range][in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IComponentRegistrar * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *Attach )( - IComponentRegistrar * This, - /* [in] */ BSTR bstrPath); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *RegisterAll )( - IComponentRegistrar * This); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *UnregisterAll )( - IComponentRegistrar * This); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetComponents )( - IComponentRegistrar * This, - /* [out] */ SAFEARRAY * *pbstrCLSIDs, - /* [out] */ SAFEARRAY * *pbstrDescriptions); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *RegisterComponent )( - IComponentRegistrar * This, - /* [in] */ BSTR bstrCLSID); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *UnregisterComponent )( - IComponentRegistrar * This, - /* [in] */ BSTR bstrCLSID); - - END_INTERFACE - } IComponentRegistrarVtbl; - - interface IComponentRegistrar - { - CONST_VTBL struct IComponentRegistrarVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IComponentRegistrar_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define IComponentRegistrar_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define IComponentRegistrar_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define IComponentRegistrar_GetTypeInfoCount(This,pctinfo) \ - ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) - -#define IComponentRegistrar_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) - -#define IComponentRegistrar_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) - -#define IComponentRegistrar_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) - - -#define IComponentRegistrar_Attach(This,bstrPath) \ - ( (This)->lpVtbl -> Attach(This,bstrPath) ) - -#define IComponentRegistrar_RegisterAll(This) \ - ( (This)->lpVtbl -> RegisterAll(This) ) - -#define IComponentRegistrar_UnregisterAll(This) \ - ( (This)->lpVtbl -> UnregisterAll(This) ) - -#define IComponentRegistrar_GetComponents(This,pbstrCLSIDs,pbstrDescriptions) \ - ( (This)->lpVtbl -> GetComponents(This,pbstrCLSIDs,pbstrDescriptions) ) - -#define IComponentRegistrar_RegisterComponent(This,bstrCLSID) \ - ( (This)->lpVtbl -> RegisterComponent(This,bstrCLSID) ) - -#define IComponentRegistrar_UnregisterComponent(This,bstrCLSID) \ - ( (This)->lpVtbl -> UnregisterComponent(This,bstrCLSID) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IComponentRegistrar_INTERFACE_DEFINED__ */ - - -#ifndef __IImageOle_INTERFACE_DEFINED__ -#define __IImageOle_INTERFACE_DEFINED__ - -/* interface IImageOle */ -/* [unique][nonextensible][dual][uuid][object] */ - - -EXTERN_C const IID IID_IImageOle; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("FDEEBA15-2214-4AAA-8222-7354491BE26C") - IImageOle : public IDispatch - { - public: - virtual /* [id] */ HRESULT STDMETHODCALLTYPE LoadFromFile( - /* [in] */ BSTR lpszPathName) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetFaceId( - /* [in] */ LONG face_id) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetFaceId( - LONG *face_id) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetFaceIndex( - LONG face_index) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetFaceIndex( - LONG *face_index) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetImageFile( - BSTR *file_name) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetImageRect( - LPRECT rect) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetImageFomat( - GUID *guid) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SaveAsFile( - BSTR file_path) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetScaleSize( - BOOL bScale, - int nWidth, - int nHeight) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetBgColor( - COLORREF clrBg) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE Draw( void) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetFaceTag( - /* [in] */ BSTR face_tag) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetFaceTag( - /* [out] */ BSTR *face_tag) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetFont( - /* [in] */ BSTR font_name, - /* [in] */ LONG font_size, - /* [in] */ COLORREF clrText) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetGUID( - BSTR guid) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetGUID( - BSTR *guid) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetScale( - LONG *scale) = 0; - - virtual /* [id] */ HRESULT STDMETHODCALLTYPE LoadFromDescription( - /* [in] */ BSTR des) = 0; - - }; - -#else /* C style interface */ - - typedef struct IImageOleVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IImageOle * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IImageOle * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IImageOle * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IImageOle * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IImageOle * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IImageOle * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [range][in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IImageOle * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *LoadFromFile )( - IImageOle * This, - /* [in] */ BSTR lpszPathName); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetFaceId )( - IImageOle * This, - /* [in] */ LONG face_id); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetFaceId )( - IImageOle * This, - LONG *face_id); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetFaceIndex )( - IImageOle * This, - LONG face_index); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetFaceIndex )( - IImageOle * This, - LONG *face_index); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetImageFile )( - IImageOle * This, - BSTR *file_name); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetImageRect )( - IImageOle * This, - LPRECT rect); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetImageFomat )( - IImageOle * This, - GUID *guid); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SaveAsFile )( - IImageOle * This, - BSTR file_path); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetScaleSize )( - IImageOle * This, - BOOL bScale, - int nWidth, - int nHeight); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetBgColor )( - IImageOle * This, - COLORREF clrBg); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *Draw )( - IImageOle * This); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetFaceTag )( - IImageOle * This, - /* [in] */ BSTR face_tag); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetFaceTag )( - IImageOle * This, - /* [out] */ BSTR *face_tag); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetFont )( - IImageOle * This, - /* [in] */ BSTR font_name, - /* [in] */ LONG font_size, - /* [in] */ COLORREF clrText); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetGUID )( - IImageOle * This, - BSTR guid); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetGUID )( - IImageOle * This, - BSTR *guid); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *GetScale )( - IImageOle * This, - LONG *scale); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *LoadFromDescription )( - IImageOle * This, - /* [in] */ BSTR des); - - END_INTERFACE - } IImageOleVtbl; - - interface IImageOle - { - CONST_VTBL struct IImageOleVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IImageOle_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define IImageOle_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define IImageOle_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define IImageOle_GetTypeInfoCount(This,pctinfo) \ - ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) - -#define IImageOle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) - -#define IImageOle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) - -#define IImageOle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) - - -#define IImageOle_LoadFromFile(This,lpszPathName) \ - ( (This)->lpVtbl -> LoadFromFile(This,lpszPathName) ) - -#define IImageOle_SetFaceId(This,face_id) \ - ( (This)->lpVtbl -> SetFaceId(This,face_id) ) - -#define IImageOle_GetFaceId(This,face_id) \ - ( (This)->lpVtbl -> GetFaceId(This,face_id) ) - -#define IImageOle_SetFaceIndex(This,face_index) \ - ( (This)->lpVtbl -> SetFaceIndex(This,face_index) ) - -#define IImageOle_GetFaceIndex(This,face_index) \ - ( (This)->lpVtbl -> GetFaceIndex(This,face_index) ) - -#define IImageOle_GetImageFile(This,file_name) \ - ( (This)->lpVtbl -> GetImageFile(This,file_name) ) - -#define IImageOle_GetImageRect(This,rect) \ - ( (This)->lpVtbl -> GetImageRect(This,rect) ) - -#define IImageOle_GetImageFomat(This,guid) \ - ( (This)->lpVtbl -> GetImageFomat(This,guid) ) - -#define IImageOle_SaveAsFile(This,file_path) \ - ( (This)->lpVtbl -> SaveAsFile(This,file_path) ) - -#define IImageOle_SetScaleSize(This,bScale,nWidth,nHeight) \ - ( (This)->lpVtbl -> SetScaleSize(This,bScale,nWidth,nHeight) ) - -#define IImageOle_SetBgColor(This,clrBg) \ - ( (This)->lpVtbl -> SetBgColor(This,clrBg) ) - -#define IImageOle_Draw(This) \ - ( (This)->lpVtbl -> Draw(This) ) - -#define IImageOle_SetFaceTag(This,face_tag) \ - ( (This)->lpVtbl -> SetFaceTag(This,face_tag) ) - -#define IImageOle_GetFaceTag(This,face_tag) \ - ( (This)->lpVtbl -> GetFaceTag(This,face_tag) ) - -#define IImageOle_SetFont(This,font_name,font_size,clrText) \ - ( (This)->lpVtbl -> SetFont(This,font_name,font_size,clrText) ) - -#define IImageOle_SetGUID(This,guid) \ - ( (This)->lpVtbl -> SetGUID(This,guid) ) - -#define IImageOle_GetGUID(This,guid) \ - ( (This)->lpVtbl -> GetGUID(This,guid) ) - -#define IImageOle_GetScale(This,scale) \ - ( (This)->lpVtbl -> GetScale(This,scale) ) - -#define IImageOle_LoadFromDescription(This,des) \ - ( (This)->lpVtbl -> LoadFromDescription(This,des) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IImageOle_INTERFACE_DEFINED__ */ - - - -#ifndef __image_oleLib_LIBRARY_DEFINED__ -#define __image_oleLib_LIBRARY_DEFINED__ - -/* library image_oleLib */ -/* [custom][version][uuid] */ - - -EXTERN_C const IID LIBID_image_oleLib; - -EXTERN_C const CLSID CLSID_CompReg; - -#ifdef __cplusplus - -class DECLSPEC_UUID("070D3F66-491B-4F0D-9ECC-5358BB7B0303") -CompReg; -#endif - -#ifndef ___IImageOleEvents_DISPINTERFACE_DEFINED__ -#define ___IImageOleEvents_DISPINTERFACE_DEFINED__ - -/* dispinterface _IImageOleEvents */ -/* [uuid] */ - - -EXTERN_C const IID DIID__IImageOleEvents; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("280EB118-CF3F-49C4-A6E2-DE4B008C5BBB") - _IImageOleEvents : public IDispatch - { - }; - -#else /* C style interface */ - - typedef struct _IImageOleEventsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - _IImageOleEvents * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - _IImageOleEvents * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - _IImageOleEvents * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - _IImageOleEvents * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - _IImageOleEvents * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - _IImageOleEvents * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [range][in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - _IImageOleEvents * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - END_INTERFACE - } _IImageOleEventsVtbl; - - interface _IImageOleEvents - { - CONST_VTBL struct _IImageOleEventsVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define _IImageOleEvents_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define _IImageOleEvents_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define _IImageOleEvents_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define _IImageOleEvents_GetTypeInfoCount(This,pctinfo) \ - ( (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) ) - -#define _IImageOleEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - ( (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) ) - -#define _IImageOleEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - ( (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) ) - -#define _IImageOleEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - ( (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - -#endif /* ___IImageOleEvents_DISPINTERFACE_DEFINED__ */ - - -EXTERN_C const CLSID CLSID_ImageOle; - -#ifdef __cplusplus - -class DECLSPEC_UUID("B0C73E85-1599-4705-BD6B-DB1DF767FC6D") -ImageOle; -#endif -#endif /* __image_oleLib_LIBRARY_DEFINED__ */ - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -unsigned long __RPC_USER LPSAFEARRAY_UserSize( unsigned long *, unsigned long , LPSAFEARRAY * ); -unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal( unsigned long *, unsigned char *, LPSAFEARRAY * ); -unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); -void __RPC_USER LPSAFEARRAY_UserFree( unsigned long *, LPSAFEARRAY * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/tool_kits/shared/ipc_manager.cpp b/tool_kits/shared/ipc_manager.cpp deleted file mode 100644 index 1069b66b..00000000 --- a/tool_kits/shared/ipc_manager.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "stdafx.h" -#include "ipc_manager.h" -#include "base/macros.h" - -namespace shared -{ - -IPCManager::IPCManager() -{ - -} - -IPCManager::~IPCManager() -{ - nbase::NAutoLock auto_lock(&lock_); - - for (std::map::const_iterator it = shared_memory_handle_map_.begin(); - it != shared_memory_handle_map_.end(); ++it) - { - ::CloseHandle(it->second); - } - shared_memory_handle_map_.clear(); -} - -bool IPCManager::CreateSharedMemory(const std::wstring &tag, const std::string &data) -{ - DestroySharedMemory(tag); - - nbase::NAutoLock auto_lock(&lock_); - - PSECURITY_DESCRIPTOR pSec = (PSECURITY_DESCRIPTOR)::LocalAlloc(LMEM_FIXED, SECURITY_DESCRIPTOR_MIN_LENGTH); - if (!pSec) - { - return false; - } - if (!::InitializeSecurityDescriptor(pSec, SECURITY_DESCRIPTOR_REVISION)) - { - ::LocalFree(pSec); - return false; - } - if (!::SetSecurityDescriptorDacl(pSec, true, NULL, true)) - { - ::LocalFree(pSec); - return false; - } - - SECURITY_ATTRIBUTES attr; - attr.bInheritHandle = false; - attr.lpSecurityDescriptor = pSec; - attr.nLength = sizeof(SECURITY_ATTRIBUTES); - - HANDLE h = ::CreateFileMapping(INVALID_HANDLE_VALUE, &attr, PAGE_READWRITE, 0, MAX_PATH, tag.c_str()); - if (h == NULL) - return false; - - PVOID pView = ::MapViewOfFile(h, FILE_MAP_WRITE, 0, 0, 0); - if (pView == NULL) - { - ::CloseHandle(h); - return false; - } - - memset(pView, 0, MAX_PATH); - memcpy(pView, data.c_str(), data.length()); - - ::UnmapViewOfFile(pView); - shared_memory_handle_map_[tag] = h; - return true; -} - -void IPCManager::DestroySharedMemory(const std::wstring &tag) -{ - nbase::NAutoLock auto_lock(&lock_); - - if (shared_memory_handle_map_.find(tag) == shared_memory_handle_map_.end()) - return; - - ::CloseHandle(shared_memory_handle_map_[tag]); - shared_memory_handle_map_.erase(tag); -} -}//namespace shared \ No newline at end of file diff --git a/tool_kits/shared/ipc_manager.h b/tool_kits/shared/ipc_manager.h deleted file mode 100644 index e268fbae..00000000 --- a/tool_kits/shared/ipc_manager.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SHARED_IPC_MANAGER_H_ -#define SHARED_IPC_MANAGER_H_ - -#include "base/synchronization/lock.h" -#include "base/memory/singleton.h" -#include -#include - -namespace shared -{ -// IPC -class IPCManager -{ -public: - SINGLETON_DEFINE(IPCManager); - IPCManager(); - ~IPCManager(); - bool CreateSharedMemory(const std::wstring &tag, const std::string &data); - void DestroySharedMemory(const std::wstring &tag); - -private: - std::map shared_memory_handle_map_; - nbase::NLock lock_; -}; -}//namespace shared - -#endif //SHARED_IPC_MANAGER_H_ diff --git a/tool_kits/shared/log.cpp b/tool_kits/shared/log.cpp deleted file mode 100644 index 786f80f1..00000000 --- a/tool_kits/shared/log.cpp +++ /dev/null @@ -1,251 +0,0 @@ -#include "stdafx.h" -#include "log.h" - - - -void QLogImpl::SetLogFile( const std::wstring &file_path ) -{ - log_file_ = file_path; -} - -std::wstring QLogImpl::GetLogFile() -{ - return log_file_; -} - -void QLogImpl::SetLogLevel( LOG_LEVEL lv ) -{ - log_level_ = lv; -} - -void QLogImpl::WriteLog( LOG_LEVEL lv, const std::wstring &log ) -{ -#ifdef _DEBUG - fwprintf_s( stdout, L"%s", log.c_str() ); -#endif - -#ifdef _WINDOWS - OutputDebugStringW( log.c_str() ); -#endif - - if( lv > log_level_ ) - return; - - if( log_file_.empty() ) - return; - - std::string str = nbase::UTF16ToUTF8(log); - - nbase::NAutoLock auto_lock( &lock_ ); - - bool exist = nbase::FilePathIsExist(log_file_, false); - - std::unique_ptr fp; - FILE* fp_file = nullptr; - _wfopen_s(&fp_file, log_file_.c_str(), L"a+"); - fp.reset(fp_file); - if( !fp ) - return; - - if( !exist ) - { - const char utf8[3] = { (char) 0xEF, (char) 0xBB, (char) 0xBF }; - fwrite(utf8, sizeof(char), 3, fp.get() ); - } - - fwrite(str.c_str(), sizeof(char), str.size(), fp.get()); - fp.reset(NULL); -} - -void QLogImpl::HalfTo( long max, long to ) -{ - nbase::NAutoLock auto_lock( &lock_); - - //ļ - std::unique_ptr fp; - FILE* fp_file = nullptr; - _wfopen_s(&fp_file, log_file_.c_str(), L"r"); - fp.reset(fp_file); - if(!fp) - { - fp.reset(NULL); - return; - } - - //ȡ - int ret = fseek(fp.get(), 0L, SEEK_END); - if (ret != 0) - { - return; - } - - //Сmaxֱӷ - long len = ftell(fp.get()); - if(len <= max) - { - return; - } - - //maxֻto - len = max * (-1); - ret = fseek(fp.get(), len, SEEK_END); - if (ret != 0) - { - return; - } - - //ļ - nbase::PathString new_file = log_file_ + L".old"; - std::unique_ptr fp2; - FILE* fp_file2 = nullptr; - _wfopen_s(&fp_file2, new_file.c_str(), L"w"); - fp2.reset(fp_file2); - if(!fp2) - { - return; - } - - //дļ - char cbuf[12 * 1024] = { 0 }; - int cn = sizeof(cbuf), n = 0; - while(!feof(fp.get())) - { - n = fread_s(cbuf, cn, sizeof(char), cn, fp.get()); - if(n > 0) - { - fwrite(cbuf, sizeof(char), n, fp2.get()); - } - else - { - break; - } - } - fp.reset(NULL); - fp2.reset(NULL); - - //ļ滻 - bool del = nbase::DeleteFileW(log_file_); - if(del) - { - ::_wrename(new_file.c_str(), log_file_.c_str()); - } - else - { - nbase::DeleteFileW(new_file); - } -} - - -QLogHelper::QLogHelper( const char* file, long line ) -{ - index_ = 0; - level_ = LV_PRO; - - nbase::Time::TimeStruct qt = nbase::Time::Now().ToTimeStruct(true); - time_ = nbase::StringPrintf( L"[%04d-%02d-%02d %02d:%02d:%02d", - qt.year_, qt.month_, qt.day_of_month_, qt.hour_, qt.minute_, qt.second_); - - std::wstring str = nbase::UTF8ToUTF16(file); - std::wstring file_name; - nbase::FilePathApartFileName(str, file_name); - - file_line_ = nbase::StringPrintf( L" %s:%ld ", file_name.c_str(), line ); -} - -QLogHelper::~QLogHelper() -{ - std::wstring lv; - switch( level_ ) - { - case LV_ERR: - lv = L"LV_ERR"; - break; - case LV_WAR: - lv = L"LV_WAR"; - break; - case LV_APP: - lv = L"LV_APP"; - break; - case LV_PRO: - lv = L"LV_PRO"; - break; - default: - assert( 0 ); - break; - } - lv.append( L"] " ); - - if( string_.empty() ) - string_ = fmt_; - else if( !fmt_.empty() ) - string_.append(fmt_); - - std::wstring log = time_ + file_line_ + lv + string_ + L"\r\n"; - QLogImpl::GetInstance()->WriteLog( level_, log ); -} - -QLogHelper& QLogHelper::VLog( LOG_LEVEL lv, const std::wstring &fmt ) -{ - level_ = lv; - fmt_ = fmt; - return *this; -} - -QLogHelper& QLogHelper::operator<<(const std::wstring &str) -{ - int len = 0; - size_t pos = FindArg( len ); - if( pos == fmt_.npos ) - { - assert( 0 ); - } - else - { - string_.append( fmt_.substr( 0, pos ) ); - string_.append( str ); - - fmt_.erase( 0, pos + len ); - } - - index_++; - return *this; -} - -QLogHelper& QLogHelper::operator<<(const std::string &str) -{ - std::wstring wstr = nbase::UTF8ToUTF16(str); - return this->operator<<(wstr); -} - -QLogHelper& QLogHelper::operator<<(const long long lld) -{ - int len = 0; - size_t pos = FindArg( len ); - if( pos == fmt_.npos ) - { - assert( 0 ); - } - else - { - std::wstring data = nbase::Int64ToString16(lld); - - string_.append( fmt_.substr( 0, pos ) ); - string_.append( data ); - - fmt_.erase( 0, pos + len ); - } - - index_++; - return *this; -} - -size_t QLogHelper::FindArg( int &len ) -{ - assert( !fmt_.empty() ); - assert( index_ >= 0 && index_ <= 20 ); - - std::wstring str = nbase::StringPrintf(L"{%d}", index_); - len = str.size(); - - return fmt_.find( str ); -} \ No newline at end of file diff --git a/tool_kits/shared/log.h b/tool_kits/shared/log.h deleted file mode 100644 index 2cec416e..00000000 --- a/tool_kits/shared/log.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -//#include "util.h" - - -/* c#coutlog - * ʾ - * QLOG_ERR(L"I am {0},this is {1} year,you can also call me {2}") <= HANZI_MIN && ch <= HANZI_MAX) - { - pinyin_char = pinyin_.get() + code_index_[ch - HANZI_MIN]; - str_firstLetters_ += pinyin_char[0]; - } - else - { - str_firstLetters_.push_back((char)ch); - } - } - - return str_firstLetters_.c_str(); -} - - -std::wstring PinYinHelper::GetPinyinFilePath() -{ - std::wstring full_path; - std::wstring path = nbase::win32::GetCurrentModuleDirectory(); - full_path = path + kFileName; - return full_path; -} - -bool PinYinHelper::LoadPinyinTable() -{ - if (code_index_.get() && pinyin_.get()) - return true; - std::wstring path = GetPinyinFilePath(); - - file_handle_.reset(nbase::OpenFile(path, L"rb")); - if (!file_handle_) - { - //LOG_ERR("Open translator file error!"); - return false; - } - int hanzi_num = 0; - int pinyin_size = 0; - fread(&hanzi_num, 4, 1, file_handle_.get()); - fread(&pinyin_size, 4, 1, file_handle_.get()); - code_index_.reset(new int[4 * hanzi_num]); - if (!code_index_.get()) - { - //LOG_ERR("code_index_ New memory error!"); - return false; - } - pinyin_.reset(new char[pinyin_size]); - if (!pinyin_.get()) - { - //LOG_ERR("pinyin_ New memory error!"); - return false; - } - int ret; - ret = fread(code_index_.get(), 4, hanzi_num, file_handle_.get()); - if (ret != hanzi_num) - { - //LOG_ERR("code_index_ Read file error!"); - return false; - } - ret = fread(pinyin_.get(), 1, pinyin_size, file_handle_.get()); - if (ret != pinyin_size) - { - //LOG_ERR("pinyin_ Read file error!"); - return false; - } - return true; -} - -const char* PinYinHelper::ConvertToFullSpell(const std::wstring& chinese) -{ - if (chinese.empty() || !code_index_.get() || !pinyin_.get()) - { - return ""; - } - str_pinyin_.clear(); - for(unsigned int i = 0; i < chinese.length(); i++) - { - wchar_t ch = chinese[i]; - const char *pinyin_char = NULL; - if(ch >= HANZI_MIN && ch <= HANZI_MAX) - { - pinyin_char = pinyin_.get() + code_index_[ch - HANZI_MIN]; - str_pinyin_.append(pinyin_char); - } - else - { - str_pinyin_.push_back((char)ch); - } - } - - return str_pinyin_.c_str(); -} diff --git a/tool_kits/shared/pin_yin_helper.h b/tool_kits/shared/pin_yin_helper.h deleted file mode 100644 index 1e68bf0b..00000000 --- a/tool_kits/shared/pin_yin_helper.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef CHINESE_PIN_YIN_H_ -#define CHINESE_PIN_YIN_H_ - -/* - * - * Author tom|yuzj - * Date 2013-10-10 - * Brief 拼音 - * - */ - -using namespace std; - -class PinYinHelper -{ -public: - SINGLETON_DEFINE(PinYinHelper); - - PinYinHelper(); - ~PinYinHelper(); - const char* ConvertToFullSpell(const std::wstring& chinese); - const char* ConvertToSimpleSpell(const std::wstring& chinese); -private: - std::wstring GetPinyinFilePath(); - bool LoadPinyinTable(); - -private: - std::unique_ptr file_handle_; - std::unique_ptr code_index_; - std::unique_ptr pinyin_; - std::string str_pinyin_; - std::string str_firstLetters_; -}; -#endif//CHINESE_PIN_YIN_H_ \ No newline at end of file diff --git a/tool_kits/shared/ring.cpp b/tool_kits/shared/ring.cpp deleted file mode 100644 index 603d6c65..00000000 --- a/tool_kits/shared/ring.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "stdafx.h" -#include "ring.h" -#include "log.h" -#include "util.h" - -static const std::wstring kNewMessage = L"new_message.wav"; -static const std::wstring kVoipConnecting = L"voip_connecting.wav"; -static const std::wstring kVoipNoResponse = L"voip_no_response.wav"; -static const std::wstring kVoipPeerBusy = L"voip_peer_busy.wav"; -static const std::wstring kVoipPeerReject = L"voip_peer_reject.wav"; -static const std::wstring kVoipRing = L"voip_ring.wav"; - -namespace shared -{ -Ring::Ring() -{ - hwnd_ = NULL; -} - -Ring::~Ring() -{ - Destroy(); -} - -bool Ring::Init(HWND hwnd) -{ - hwnd_ = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG | MCIWNDF_NOTIFYMODE, NULL); - if (hwnd_ == NULL) - { - QLOG_ERR(L"MCIWndCreateW error {0}") << GetLastError(); - return false; - } - return true; -} - -void Ring::Play(RingType type, bool replay) -{ - assert(hwnd_); - if (hwnd_ == NULL) - return; - - Stop(); - replay_ = replay; - - std::wstring dir = QPath::GetAppPath() + L"res\\audio\\"; - switch (type) - { - case RING_NEW_MESSAGE: - dir.append(kNewMessage); - break; - case RING_VOIP_CONNTETING: - dir.append(kVoipConnecting); - break; - case RING_VOIP_NORESPONSE: - dir.append(kVoipNoResponse); - break; - case RING_VOIP_PEERBUSY: - dir.append(kVoipPeerBusy); - break; - case RING_VOIP_PEERREJECT: - dir.append(kVoipPeerReject); - break; - case RING_VOIP_RING: - dir.append(kVoipRing); - break; - } - - DWORD ret = MCIWndOpen(hwnd_, dir.c_str(), 0); - if (ret == 0) - MCIWndPlay(hwnd_); - else - QLOG_ERR(L"MCIWndOpen error {0}") << ret; -} - -void Ring::Replay() -{ - if (hwnd_ != NULL && MCIWndCanPlay(hwnd_)) - { - MCIWndSeek(hwnd_, 0); - MCIWndPlay(hwnd_); - } -} - - -void Ring::Stop() -{ - replay_ = false; - if (hwnd_) - { - MCIWndStop(hwnd_); - MCIWndClose(hwnd_); - } -} - -void Ring::Destroy() -{ - if (hwnd_) - { - Stop(); - } -} - -LRESULT Ring::Notify(UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (uMsg == MCIWNDM_NOTIFYMODE) - { - if (lParam == MCI_MODE_STOP && replay_) - { - Replay(); - } - } - return 0; -} -} \ No newline at end of file diff --git a/tool_kits/shared/ring.h b/tool_kits/shared/ring.h deleted file mode 100644 index 0c8ee5ad..00000000 --- a/tool_kits/shared/ring.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#include - -enum RingType -{ - RING_NEW_MESSAGE = 0, - RING_VOIP_CONNTETING, - RING_VOIP_NORESPONSE, - RING_VOIP_PEERBUSY, - RING_VOIP_PEERREJECT, - RING_VOIP_RING, -}; - -namespace shared -{ -/** @class Ring - * @brief 提示音播放类 - * @copyright (c) 2016, NetEase Inc. All rights reserved - * @date 2016/09/18 - */ -class Ring -{ -public: - Ring(); - virtual ~Ring(); - - /** - * 初始化提示音播放窗口 - * @param[in] hwnd 父窗口句柄 - * @return bool true 成功,false 失败 - */ - bool Init(HWND hwnd); - - /** - * 播放提示音 - * @param[in] type 提示类型 - * @param[in] replay 是否重复提示 - * @return void 无返回值 - */ - void Play(RingType type, bool replay = false); - - /** - * 重放提示音 - * @return void 无返回值 - */ - void Replay(); - - /** - * 停止提示音 - * @return void 无返回值 - */ - void Stop(); - - /** - * 提示窗口消息处理函数 - * @param[in] uMsg 消息类型 - * @param[in] wParam 附加参数 - * @param[in] lParam 附加参数 - * @return LRESULT 返回值 - */ - LRESULT Notify(UINT uMsg, WPARAM wParam, LPARAM lParam); -private: - /** - * 消息提示音窗口 - * @return void 无返回值 - */ - void Destroy(); -private: - HWND hwnd_; - bool replay_; -}; -} \ No newline at end of file diff --git a/tool_kits/shared/shared.h b/tool_kits/shared/shared.h deleted file mode 100644 index c3af6bac..00000000 --- a/tool_kits/shared/shared.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "auto_unregister.h" -#include "closure.h" -#include "cmd_line.h" -#include "image_ole_i.h" -#include "ipc_manager.h" -#include "log.h" -#include "misc_thread.h" -#include "pin_yin_helper.h" -#include "ring.h" -#include "templated_object_factory.h" -#include "threads.h" -#include "tool.h" -#include "utf8_file_util.h" -#include "util.h" -#include "zoom_image.h" diff --git a/tool_kits/shared/shared.vcxproj b/tool_kits/shared/shared.vcxproj deleted file mode 100644 index 1179eb57..00000000 --- a/tool_kits/shared/shared.vcxproj +++ /dev/null @@ -1,215 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9951345F-620B-4BED-BB51-4F928CAFD454} - shared - - - - StaticLibrary - true - Unicode - v120_xp - - - StaticLibrary - true - Unicode - v120_xp - - - StaticLibrary - false - true - Unicode - v120_xp - - - StaticLibrary - false - true - Unicode - v120_xp - - - - - - - - - - - - - - - - - - - ..\..\libs\ - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - $(ProjectName)_d - - - $(ProjectName)_d - ..\..\libs\x64\ - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - - - ..\..\libs\ - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - - - ..\..\libs\x64\ - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - - - - Level3 - Disabled - .\;..\ - WIN32;NIM_WIN_DESKTOP_ONLY_SDK;%(PreprocessorDefinitions) - MultiThreadedDebug - Use - - - - - true - - - - - Level3 - Disabled - .\;..\ - WIN32;NIM_WIN_DESKTOP_ONLY_SDK;%(PreprocessorDefinitions) - MultiThreadedDebug - Use - - - - - true - - - - - Level3 - MaxSpeed - true - true - .\;..\ - WIN32;NIM_WIN_DESKTOP_ONLY_SDK;%(PreprocessorDefinitions) - MultiThreaded - Use - - - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - .\;..\ - WIN32;NIM_WIN_DESKTOP_ONLY_SDK;%(PreprocessorDefinitions) - MultiThreaded - Use - - - - - true - true - true - - - - - {8d9a6595-717a-41c8-b468-0011a72be3d1} - - - - - - - false - false - false - false - NotUsing - NotUsing - NotUsing - NotUsing - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - false - false - false - false - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tool_kits/shared/shared.vcxproj.filters b/tool_kits/shared/shared.vcxproj.filters deleted file mode 100644 index 0f646a3f..00000000 --- a/tool_kits/shared/shared.vcxproj.filters +++ /dev/null @@ -1,43 +0,0 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tool_kits/shared/stdafx.cpp b/tool_kits/shared/stdafx.cpp deleted file mode 100644 index f4cec5da..00000000 --- a/tool_kits/shared/stdafx.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "stdafx.h" - -// TODO: STDAFX.H -// κĸͷļڴļ diff --git a/tool_kits/shared/stdafx.h b/tool_kits/shared/stdafx.h deleted file mode 100644 index 9fe979d0..00000000 --- a/tool_kits/shared/stdafx.h +++ /dev/null @@ -1,23 +0,0 @@ -#define _CRT_SECURE_NO_WARNINGS -#pragma once - -//c++ header -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//base header -#include "base/base.h" - -//third_party -#include "duilib/UIlib.h" diff --git a/tool_kits/shared/templated_object_factory.h b/tool_kits/shared/templated_object_factory.h deleted file mode 100644 index fce32056..00000000 --- a/tool_kits/shared/templated_object_factory.h +++ /dev/null @@ -1,114 +0,0 @@ -#pragma once -namespace shared -{ - class TemplatedObjectFactoryWrapper; - /* - TemplatedObjectFactory - ܣע͵ϢһTOBJFLGʵTBaseӦTOBJFLGĸ - */ - template - class TemplatedObjectFactory : public nbase::Singleton> - { - private: - using _ParentType = nbase::Singleton>; - using _MyType = TemplatedObjectFactory; - friend class TemplatedObjectFactoryWrapper; - - public: - TemplatedObjectFactory() = default; - ~TemplatedObjectFactory() = default; - private: - /* - TClassʵķ, TClass : public TBaseĹϵ - params TClassĹ - TBase͵ָ - */ - template - TBase* Create(const TParam&... params) - { - return dynamic_cast(new TClass(params...)); - } - template - void AddCreateFunction(TOBJFLG flg, const TParam&... params) - { - auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ - return flg == item.first; - }); - if (it == crate_function_list_.end()) - crate_function_list_.emplace_back(std::make_pair(flg, std::bind(&TemplatedObjectFactory::Create, this, params...))); - } - auto CreateSharedObject(TOBJFLG flg)->std::shared_ptr - { - auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ - return flg == item.first; - }); - if (it != crate_function_list_.end()) - return std::shared_ptr((*it).second()); - return nullptr; - } - TBase* CreateObject(TOBJFLG flg) - { - TBase* ret = nullptr; - auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ - return flg == item.first; - }); - if (it != crate_function_list_.end()) - ret = (*it).second(); - return ret; - } - void CreateAllSharedObject(std::list>& objects) - { - for (auto it : crate_function_list_) - objects.emplace_back(std::shared_ptr(it.second())); - } - private: - std::list>> crate_function_list_; - }; - class TemplatedObjectFactoryWrapper - { - public: - //ע - template - static void RegisteredOjbect(const TOBJFLG& flg, const TParam&... params) - { - using TDecayType = typename std::decay::type; - if (std::is_base_of::value) - { - auto&& manager = TemplatedObjectFactory::GetInstance(); - if (manager != nullptr) - manager->AddCreateFunction(flg, params...); - } - } - //üʵ - template - static auto InstantiateSharedRegisteredOjbect(const TFLG& flag)->std::shared_ptr - { - using TDecayType = typename std::decay::type; - auto&& manager = TemplatedObjectFactory::GetInstance(); - if (manager != nullptr) - return manager->CreateSharedObject(flag); - return nullptr; - } - //ʵ - template - static auto InstantiateRegisteredOjbect(const TFLG& flag)->TBase* - { - using TDecayType = typename std::decay::type; - auto&& manager = TemplatedObjectFactory::GetInstance(); - if (manager != nullptr) - return manager->CreateObject(flag); - return nullptr; - } - //עΪ TBase TFLG Ϊʶĵʵ - template - static auto InstantiateAllRegisteredSharedOjbect()->std::list> - { - using TDecayType = typename std::decay::type; - std::list> ret; - auto&& manager = TemplatedObjectFactory::GetInstance(); - if (manager != nullptr) - manager->CreateAllSharedObject(ret); - return ret; - } - }; -} diff --git a/tool_kits/shared/threads.h b/tool_kits/shared/threads.h deleted file mode 100644 index 3e282631..00000000 --- a/tool_kits/shared/threads.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef SHARED_THREADS_H_ -#define SHARED_THREADS_H_ - -// thread ids -enum ThreadId -{ - kThreadBegin = -1,//线程ID定义开始 - kThreadUI, //UI线程(主线程) - kThreadDatabase, //写DB线程 - kThreadGlobalMisc, //全局Misc线程(比如:打开url) - kThreadDuilibHelper,//Duilib专用,UI辅助线程 - kThreadLiveStreaming,//直播线程 - kThreadScreenCapture,//取屏线程 - kThreadApp,//用户自定义应用线程 - kThreadEnd,//线程ID定义结束 -}; - -#endif // SHARED_THREADS_H_ diff --git a/tool_kits/shared/tool.cpp b/tool_kits/shared/tool.cpp deleted file mode 100644 index d2a99435..00000000 --- a/tool_kits/shared/tool.cpp +++ /dev/null @@ -1,653 +0,0 @@ -#include "stdafx.h" -#include "tool.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "base/util/string_util.h" -#include "base/file/file_util.h" -#include "base/thread/framework_thread.h" -#include "base/macros.h" -#include "base/win32/path_util.h" - -UINT g_show_wnd_forgroud_message = 0; - -namespace shared -{ -namespace tools -{ -const wchar_t KShowWndForgroudMessageID[] = L"ShowWndForgroudMessageIdentifer"; - -////////////////////////////////////////////////////// -// 系统相关 -int GetOSVersion() -{ - static int os_version_ = -1; - if (os_version_ < 0) - { - OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; - if (!::GetVersionEx(&ovi)) - return -1; - - os_version_ = (ovi.dwMajorVersion * 100 + ovi.dwMinorVersion); - } - return os_version_; -} - -std::string GetOSVersionString() -{ - int ver = GetOSVersion(); - switch (ver) - { - case 500: - return "Windows 2000"; - case 501: - return "Windows XP"; - case 502: - return "Windows Server 2003"; - case 600: - return "Windows Vista"; - case 601: - return "Windows 7"; - case 602: - return "Windows 8"; - default: - return nbase::StringPrintf("[%d]", ver); - } -} - -typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); -LPFN_ISWOW64PROCESS fnIsWow64Process; -bool IsWow64() -{ - BOOL is_wow64 = FALSE; - fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( - GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); - - if(NULL != fnIsWow64Process) - { - if (!fnIsWow64Process(GetCurrentProcess(),&is_wow64)) - return false; - } - - return is_wow64 ? true : false; -} - -////////////////////////////////////////////////////// -// 字符串处理 -std::string FormatTime(nbase::Time::TimeStruct t) -{ - return nbase::StringPrintf("%04u-%02u-%02u %02u:%02u:%02u", - t.year(), t.month(), t.day_of_month(), - t.hour(), t.minute(), t.second()); -} - -std::wstring FormatBytes(double bytes) -{ - if (bytes < 1024 * 1024) - return nbase::StringPrintf(L"%.2fKB", bytes / 1024); - else if (bytes < 1024 * 1024 * 1024) - return nbase::StringPrintf(L"%.2fMB", bytes / 1024 / 1024); - else - return nbase::StringPrintf(L"%.2fGB", bytes / 1024 / 1024 / 1024); -} - -std::wstring FormatBps(double bytes) -{ - double bits = bytes * 8; - - if (bits < 100000) - return nbase::StringPrintf(L"%dbps", (int)bits); - else if (bits < 1024 * 1024) - return nbase::StringPrintf(L"%dKbps", (int)(bits / 1024)); - else if (bits < 1024 * 1024 * 1024) - return nbase::StringPrintf(L"%.2fMbps", bits / 1024 / 1024); - else - return nbase::StringPrintf(L"%.2fGbps", bits / 1024 / 1024 / 1024); -} - -void SplitString(const std::string &str, const std::string &seperator, std::vector &array) -{ - array.clear(); - if (str.empty() || seperator.empty()) - return; - - size_t position; - std::string tmp_str = str; - - position = tmp_str.find(seperator.c_str()); - while (position != tmp_str.npos) - { - if (position) - array.push_back(tmp_str.substr(0, position)); - tmp_str.erase(0, position + seperator.length()); - position = tmp_str.find(seperator); - } - - if (!tmp_str.empty()) - array.push_back(tmp_str); -} - -void SplitString(const std::wstring &str, const std::wstring &seperator, std::vector &array) -{ - array.clear(); - if (str.empty() || seperator.empty()) - return; - - size_t position; - std::wstring tmp_str = str; - - position = tmp_str.find(seperator.c_str()); - while (position != tmp_str.npos) - { - if (position) - array.push_back(tmp_str.substr(0, position)); - tmp_str.erase(0, position + seperator.length()); - position = tmp_str.find(seperator); - } - - if (!tmp_str.empty()) - array.push_back(tmp_str); -} - -std::string StringReverse(const std::string &input) -{ - int len = input.size(); - std::string output; - output.resize(len); - for (int i = 0; i < len; i++) - { - output[i] = input[len - 1 - i]; - } - - return output; -} - -std::string FilterUCS4(const std::string& str, bool replace_spaces) -{ - if (GetOSVersion() >= 602) - { - return str; - } - bool ret = true; - std::string str_out; - for (UINT i=0;i= 0xf0)//过滤0xffff+ - { - i += 4; - if (single_char >= 0xf8) - { - i++; - } - if (single_char >= 0xfc) - { - i++; - } - ret = false; - if (replace_spaces) - { - str_out += " "; - } - continue; - } - else - { - if (single_char == 0xe2 && i+2 < str.size())//过滤其他无法显示的字符表情 0x26xx为表情符 0x2700-0x27bf为印刷符 - { - UINT ch_u = 0x2000; - UINT single_char_temp = str.at(i+1); - single_char_temp &= 0x3f; - ch_u += single_char_temp<<6; - single_char_temp = str.at(i+2); - single_char_temp &= 0x3f; - ch_u += single_char_temp; - if (GetOSVersion() >= 600)//win7 vista - { - if (ch_u == 0x2614 || ch_u == 0x2615 || ch_u == 0x2618 || ch_u == 0x2619 - || ch_u == 0x2670 || ch_u == 0x2670 || ch_u == 0x2670 - || (ch_u >= 0x267e && ch_u < 0x27c0) ) - { - i += 3; - ret = false; - if (replace_spaces) - { - str_out += " "; - } - continue; - } - } - else//xp - { - if ((ch_u >= 0x2614 && ch_u <= 0x2619) || (ch_u >= 0x267e && ch_u < 0x27c0)) - { - i += 3; - ret = false; - if (replace_spaces) - { - str_out += " "; - } - continue; - } - } - } - str_out += str.at(i); - i++; - } - } - return str_out; -} - -UTF8String FormatSQLText(const UTF8String &sql_text) -{ - UTF8String formated_text(sql_text); - //SQL标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。 - nbase::StringReplaceAll("'", "''", formated_text); - return formated_text; -} - -////////////////////////////////////////////////////// -// 文件处理 -std::wstring GetSpecialFolder(int id) -{ - std::wstring path; - - LPITEMIDLIST idl; - LPMALLOC shell_malloc; - if (SHGetMalloc(&shell_malloc) == S_OK) - { - if (SHGetSpecialFolderLocation(NULL, id , &idl) == S_OK) - { - WCHAR *dir = new WCHAR[MAX_PATH]; - SHGetPathFromIDList(idl, dir); - shell_malloc->Free(idl); - path = dir; - delete dir; - } - shell_malloc->Release(); - } - - return path; -} - -std::wstring GetResourcePath(void) -{ - std::wstring app_path = nbase::win32::GetCurrentModuleDirectory(); - return app_path + L"res\\"; -} - -void MakeExtendPath(std::wstring &path) -{ - std::wstring temp = nbase::StringPrintf(L"\\\\?\\%s", path.c_str()); - path = temp; -} - -// 清空达到一定长度的文件 -void ClearFile(const wchar_t *path, long file_length_limit) -{ - int fd; - if ((fd = _wopen(path, O_CREAT | O_RDWR | O_APPEND, _S_IREAD | _S_IWRITE)) < 0) - return; - - long len = _filelength(fd); - _close(fd); - if (len < file_length_limit) - return; - - if ((fd = _wopen(path, O_CREAT | O_RDWR | O_TRUNC, _S_IREAD | _S_IWRITE)) >= 0) - _close(fd); -} - -bool FilePathIsExist(const std::string &utf8_filepath_in, bool is_directory) -{ - std::wstring filepath_in = nbase::UTF8ToUTF16(utf8_filepath_in); - return nbase::FilePathIsExist(filepath_in, is_directory); -} - -bool FindFile(const std::wstring &dir,const std::wstring &file_desc,std::wstring &file_path) -{ - WIN32_FIND_DATAW find_data; - HANDLE file_handle; - - file_handle = ::FindFirstFileW(nbase::StringPrintf(L"%s%s",dir.c_str(),L"*.*").c_str(),&find_data); - if (file_handle != INVALID_HANDLE_VALUE) - { - do - { - if (find_data.cFileName == nbase::StringPrintf(L"%s.lnk",file_desc.c_str())) - { - file_path = nbase::StringPrintf(L"%s%s",dir.c_str(),find_data.cFileName); - ::FindClose(file_handle); - return true; - } - // 如果是子文件夹 - if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && find_data.cFileName[0] != '.') - { - std::wstring in_dir = nbase::StringPrintf(L"%s%s\\",dir.c_str(),find_data.cFileName); - // 递归遍历 - if(FindFile(in_dir,file_desc,file_path)) - return true; - } - } while (::FindNextFileW(file_handle,&find_data)); - - ::FindClose(file_handle); - return false; - } - else - { - return false; - } -} - -std::wstring EnsureValidFileName(const std::wstring &file_name, const std::wstring &find /* = L"/:*?<>|" */, const std::wstring &replace /* = L"_" */) -{ - std::wstring valid = file_name; - const size_t replace_len = replace.length(); - const wchar_t *find_ptr = find.c_str(); - const wchar_t *replace_ptr = replace.c_str(); - - for (size_t pos = valid.find_first_of(find_ptr, 0); pos != std::wstring::npos && pos < valid.length(); pos = valid.find_first_of(find_ptr, pos)) - { - valid.replace(pos, 1, replace_ptr, replace_len); - pos += replace_len; - } - - return valid; -} - -////////////////////////////////////////////////////// -// 数学相关 -int CalcAvg(const std::vector &vec, bool is_revise/* = true*/) -{ - if (vec.empty()) - return 0; - - int sum = 0; - size_t count = vec.size(); - - if (count <= 5 || !is_revise) - { - for (size_t i = 0; i < count; i++) - { - sum += vec[i]; - } - return sum / count; - } - // 去掉最小值和最大值 - else - { - std::vector::const_iterator minIt = std::min_element(vec.begin(), vec.end()); - std::vector::const_iterator maxIt = std::max_element(vec.begin(), vec.end()); - - if (minIt == maxIt) - return *minIt; - - for (std::vector::const_iterator it = vec.begin(); it != vec.end(); ++it) - { - if (it == minIt || it == maxIt) - continue; - - sum += *it; - } - return sum / (count - 2); - } -} - -int CalcStDev(const std::vector &vec) -{ - if (vec.empty()) - return 0; - - int avg = CalcAvg(vec); - - double square_sum = 0; - size_t count = vec.size(); - for (size_t i = 0; i < count; i++) - { - int diff = abs(vec[i] - avg); - square_sum += pow((double)diff, 2); - } - square_sum = square_sum / count; - - return (int)(sqrt(square_sum)); -} - -void SafeOpenUrl(const std::wstring &url, int show_cmd) -{ - std::wstring url_temp = url; - std::wstring url_trim = nbase::StringTrimLeft(url_temp.c_str()); - url_trim = nbase::StringTrimRight(url_trim.c_str()); - HINSTANCE result = ::ShellExecute(NULL, _T("open"), url_trim.c_str(), NULL, NULL, show_cmd); - if ((DWORD)result <= 32) - { - ::ShellExecute(NULL, _T("open"), _T("IEXPLORE.EXE"), url_trim.c_str(), NULL, show_cmd); - } -} - -void SafeOpenUrlEx(const std::string &url, int show_cmd) -{ - std::string url_temp = url; - std::wstring open_url = nbase::UTF8ToUTF16(url_temp); - SafeOpenUrl(open_url, show_cmd); -} - -bool RunAppWithRedirection(const std::wstring &app_path, const std::wstring &app_cmd, std::string &output) -{ - SECURITY_ATTRIBUTES sa; - sa.nLength = sizeof(SECURITY_ATTRIBUTES); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - - // ChildIn_Write是子进程的输入句柄,ChildIn_Read是父进程用于写入子进程输入的句柄 - // ChildOut_Write是子进程的输出句柄,ChildOut_Read是父进程用于读取子进程输出的句柄 - HANDLE child_in_read = NULL; - HANDLE child_in_write = NULL; - HANDLE child_out_read = NULL; - HANDLE child_out_write = NULL; - BOOL ret1 = CreatePipe(&child_in_read, &child_in_write, &sa, 0); - BOOL ret2 = SetHandleInformation(child_in_write, HANDLE_FLAG_INHERIT, 0); - BOOL ret3 = CreatePipe(&child_out_read, &child_out_write, &sa, 0); - BOOL ret4 = SetHandleInformation(child_out_read, HANDLE_FLAG_INHERIT, 0); - - if (!ret1 || !ret2 || !ret3 || !ret4) - { - ::CloseHandle(child_in_read); - ::CloseHandle(child_in_write); - ::CloseHandle(child_out_read); - ::CloseHandle(child_out_write); - return false; - } - - STARTUPINFO si = {0}; - si.cb = sizeof(STARTUPINFO); - si.hStdError = child_out_write; - si.hStdOutput = child_out_write; - si.hStdInput = child_in_read; - si.dwFlags |= STARTF_USESTDHANDLES; - PROCESS_INFORMATION pi; - - if (!CreateProcess(app_path.c_str(), (LPWSTR)app_cmd.c_str(), NULL, NULL, TRUE, - CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) - { - ::CloseHandle(child_in_read); - ::CloseHandle(child_in_write); - ::CloseHandle(child_out_read); - ::CloseHandle(child_out_write); - return false; - } - ::CloseHandle(child_in_write); - ::CloseHandle(child_out_write); - - output.clear(); - while (true) - { - char buf[32 * 1024] = {0}; - DWORD len; - if (::ReadFile(child_out_read, buf, 32 * 1024, &len, NULL) == FALSE) - break; - output.append(buf, len); - } - ::CloseHandle(child_in_read); - ::CloseHandle(child_out_read); - - return true; -} - -std::string GenerateTimeStamp() -{ - nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue()); - std::string ret = nbase::StringPrintf("%I64u",time_delta.ToMilliseconds()); - return ret; -} - -BOOL DllRegisterServer(LPCTSTR lpszFileName, BOOL bUnregister) -{ - typedef HRESULT (WINAPI * FREG)(); - - HMODULE hDLL = ::LoadLibrary(lpszFileName); - if (NULL == hDLL) - return FALSE; - - CHAR * lpszFuncName; - if (!bUnregister) - lpszFuncName = "DllRegisterServer"; - else - lpszFuncName = "DllUnregisterServer"; - - BOOL bRet = FALSE; - FREG lpfunc = (FREG)::GetProcAddress(hDLL, lpszFuncName); - if (lpfunc != NULL) - { - lpfunc(); - bRet = TRUE; - } - - ::FreeLibrary(hDLL); - - return bRet; -} - -BOOL DllRegisterServer(LPCTSTR lpszFileName) -{ - return DllRegisterServer(lpszFileName, FALSE); -} - -BOOL DllUnregisterServer(LPCTSTR lpszFileName) -{ - return DllRegisterServer(lpszFileName, TRUE); -} - -void RegisterShowWndForgroudMessage() -{ - g_show_wnd_forgroud_message = ::RegisterWindowMessage(KShowWndForgroudMessageID); -} - -UINT GetShowWndForgroudMessageID() -{ - return g_show_wnd_forgroud_message; -} - -bool GetImageCLSID(const wchar_t* format, CLSID* pCLSID) -{ - UINT num = 0; - UINT size = 0; - Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL; - Gdiplus::GetImageEncodersSize(&num, &size); - - if (size == 0) - return false; - - pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); - if(pImageCodecInfo == NULL) - return false; - Gdiplus::GetImageEncoders(num, size, pImageCodecInfo); - - for (UINT i = 0; i < num; ++i) - { - if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 ) - { - *pCLSID = pImageCodecInfo[i].Clsid; - free(pImageCodecInfo); - return true; - } - } - free(pImageCodecInfo); - - return false; -} - -void File::GetFolder( const std::wstring &dir, StringVector &out, bool full_path /*= false*/ ) -{ - std::wstring path = dir + L"\\*.*"; - - WIN32_FIND_DATAW fd; - HANDLE hFind = ::FindFirstFileW(path.c_str(), &fd); - - DWORD attr = 0; - while(hFind != INVALID_HANDLE_VALUE) - { - attr = fd.dwFileAttributes; - if(attr & FILE_ATTRIBUTE_HIDDEN) { - } - else if(attr & FILE_ATTRIBUTE_DIRECTORY) - { - wchar_t* name = fd.cFileName; - if( wcscmp(name, L".") == 0 || wcscmp(name, L"..") == 0 ){ - } - else - { - if(full_path) - out.push_back( dir + L"\\" + name ); - else - out.push_back( name ); - } - } - - BOOL bRet = ::FindNextFileW(hFind, &fd); - if(!bRet) - break; - } - - ::FindClose(hFind); -} - -void File::GetFile( const std::wstring &dir, std::vector &out, bool full_path /*= false*/ ) -{ - std::wstring path = dir + L"\\*.*"; - - WIN32_FIND_DATAW fd; - HANDLE hFind = ::FindFirstFileW(path.c_str(), &fd); - - DWORD attr = 0; - while(hFind != INVALID_HANDLE_VALUE) - { - attr = fd.dwFileAttributes; - if(attr & FILE_ATTRIBUTE_HIDDEN || attr & FILE_ATTRIBUTE_DIRECTORY){ - } - else - { - FileItem fi = { fd.cFileName, fd.nFileSizeLow }; - if(full_path) - fi.file_ = dir + L"\\" + fd.cFileName; - out.push_back(fi); - } - - BOOL bRet = ::FindNextFileW(hFind, &fd); - if(!bRet) - break; - } - - ::FindClose(hFind); -} - - -}//namespace tools -}//namespace shared \ No newline at end of file diff --git a/tool_kits/shared/tool.h b/tool_kits/shared/tool.h deleted file mode 100644 index 3a2f33c5..00000000 --- a/tool_kits/shared/tool.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SHARED_TOOL_H_ -#define SHARED_TOOL_H_ - -#include -#include -#include "base/time/time.h" -#include "base/base_types.h" - -namespace shared -{ -namespace tools -{ -// ϵͳ -int GetOSVersion(); -std::string GetOSVersionString(); -bool IsWow64(); - -// ַ -std::string FormatTime(nbase::Time::TimeStruct t); -std::wstring FormatBytes(double bytes); -std::wstring FormatBps(double bytes); -void SplitString(const std::string &str, const std::string &seperator, std::vector &array); -void SplitString(const std::wstring &str, const std::wstring &seperator, std::vector &array); -std::string StringReverse(const std::string &input); - -// ޷ʾıַ -std::string FilterUCS4(const std::string& str, bool replace_spaces = true); - -// ʽSQLַת嵥ţִSQL׳쳣 -UTF8String FormatSQLText(const UTF8String &sql_text); - -// ܷ񷢶 -bool IsChinaPhoneNumber(const std::string &str); -bool IsAuthCode(const std::string &str); - -// ļ -std::wstring GetSpecialFolder(int id); -std::wstring GetResourcePath(void); -void MakeExtendPath(std::wstring &path); -void ClearFile(const wchar_t *path, long file_length_limit); -bool FilePathIsExist(const std::string &utf8_filepath_in, bool is_directory); - -// õݹķʽָĿµļ -bool FindFile(const std::wstring &dir,const std::wstring &file_desc,std::wstring &file_path); -std::wstring EnsureValidFileName(const std::wstring &file_name, const std::wstring &find = L"\\/:*?\"<>|", const std::wstring &replace = L"_"); - -// ѧ -int CalcAvg(const std::vector &vec, bool is_revise = true); -int CalcStDev(const std::vector &vec); - -// ַ -void SafeOpenUrl(const std::wstring &url, int show_cmd); -void SafeOpenUrlEx(const std::string &url, int show_cmd); - -bool RestartComputer(); -bool RunAppWithRedirection(const std::wstring &app_path, const std::wstring &app_cmd, std::string &output); - -// ʱȺ -std::string GenerateTimeStamp(); - -// Register Server -BOOL DllRegisterServer(LPCTSTR lpszFileName); -BOOL DllUnregisterServer(LPCTSTR lpszFileName); - -// ͨmessage -void RegisterShowWndForgroudMessage(); -UINT GetShowWndForgroudMessageID(); - -// ȡͼƬͶӦCLSID -bool GetImageCLSID(const wchar_t* format, CLSID* pCLSID); - -// ļµļ޵һ㣩 -struct FileItem -{ - std::wstring file_; - long size_; -}; - -typedef std::vector StringVector; -typedef std::vector FileItemVector; - -class File -{ -public: - //dirҪ"\\" - static void GetFolder(const std::wstring &dir, StringVector &out, bool full_path = false); - //dirҪ"\\" - static void GetFile(const std::wstring &dir, std::vector &out, bool full_path = false); -}; - -}//namespace tools -}//namespace shared - -#endif //SHARED_TOOL_H_ diff --git a/tool_kits/shared/utf8_file_util.cpp b/tool_kits/shared/utf8_file_util.cpp deleted file mode 100644 index f0a923e9..00000000 --- a/tool_kits/shared/utf8_file_util.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// File operation utilities for UTF-8 encoding support -#include "stdafx.h" -#include "shared/utf8_file_util.h" - -#include "base/file/file_util.h" -#include "base/util/string_util.h" - -#ifndef OS_WIN -#error "Only used on MS-Windows" -#endif - -namespace shared -{ - -static const UTF8Char kEndChar = '\0'; -static const UTF8Char kFilePathSeparators[] = "\\/"; -static const UTF8Char kFilePathCurrentDirectory[] = "."; -static const UTF8Char kFilePathParentDirectory[] = ".."; -static const UTF8Char kFilePathExtensionSeparator = '.'; - -bool IsFilePathSeparator(const UTF8Char separator) -{ - if (separator == kEndChar) - return false; - - size_t len = sizeof(kFilePathSeparators)/sizeof(UTF8Char); - for (size_t i = 0; i < len; i++) - { - if (separator == kFilePathSeparators[i]) - return true; - } - - return false; -} - -bool IsFilePathSeparator(const UTF8String &separator) -{ - if (separator.empty()) - return false; - UTF8Char c = separator[0]; - return IsFilePathSeparator(c); -} - -bool FilePathExtension(const UTF8String &filepath_in, - UTF8String &extension_out) -{ - if (filepath_in.size() == 0) - return false; - bool ret = false; - UTF8String file_name; - if (FilePathApartFileName(filepath_in, file_name)) - { - size_t pos = file_name.rfind(kFilePathExtensionSeparator); - if (pos != UTF8String::npos) - { - extension_out = file_name.substr(pos, UTF8String::npos); - ret = true; - } - } - return ret; -} - -bool FilePathApartDirectory(const UTF8String &filepath_in, - UTF8String &directory_out) -{ - size_t index = filepath_in.size() - 1; - if (index <= 0 || filepath_in.size() == 0) - return false; - for (; index != 0; index--) - { - if (IsFilePathSeparator(filepath_in[index])) - { - if (index == filepath_in.size() - 1) - directory_out = filepath_in; - else - directory_out = filepath_in.substr(0, index + 1); - return true; - } - } - return false; -} - -// Get the filename from the whole filepath -bool FilePathApartFileName(const UTF8String &filepath_in, - UTF8String &filename_out) -{ - if (filepath_in.size() == 0) - return false; - bool ret = true; - size_t separator_pos = UTF8String::npos; - size_t separators_count = sizeof(kFilePathSeparators) / sizeof(UTF8Char); - for (size_t index = 0; index < separators_count; index++) - { - separator_pos = filepath_in.rfind(kFilePathSeparators[index]); - if (separator_pos != UTF8String::npos) - break; - } - if (separator_pos++ != UTF8String::npos && separator_pos < filepath_in.size()) - filename_out = filepath_in.substr(separator_pos); - else if (separator_pos >= filepath_in.size()) - ret = false; - else - filename_out = filepath_in; - return ret; -} - -template -bool ParsePathComponentsT(const CharType *path, - const CharType *seperators, - std::list > &components) -{ - components.clear(); - if (path == NULL) - return false; - const CharType *prev = NULL; - const CharType *next = path; - const CharType *c; - while (*next) - { - prev = next; - // find the first seperator - for (;;) - { - for (c = seperators; *c && *next != *c; c++); - if (*c || !*next) - break; - next++; - } - components.push_back(std::basic_string(prev, next - prev)); - if (*next) - components.back().push_back(*seperators); - // skip duplicated seperators - for (++next;;) - { - for (c = seperators; *c && *next != *c; c++); - if (!*c) - break; - next++; - } - } - return true; -} - -bool ParsePathComponents(const UTF8Char *path, - std::list &components) -{ - return ParsePathComponentsT(path, - kFilePathSeparators, - components); -} - -bool IsDirectoryComponent(const UTF8String &component) -{ - if (component.empty()) - return false; - return *component.rbegin() == kFilePathSeparators[0] || - *component.rbegin() == kFilePathSeparators[1]; -} - -bool FilePathCompose(const UTF8String &directory_in, - const UTF8String &filename_in, - UTF8String &filepath_out) -{ - UTF8String directory; - if (!FilePathApartDirectory(directory_in, directory)) - return false; - filepath_out = directory + filename_in; - return true; -} - -bool FilePathIsExist(const UTF8String &filepath, bool is_directory) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::FilePathIsExist(filepath2, is_directory); -} - -bool CreateDirectory(const UTF8String& full_path) -{ - UTF16String full_path2 = nbase::UTF8ToUTF16(full_path); - return nbase::CreateDirectory(full_path2); -} - -FILE* OpenFile(const UTF8String &filepath, const nbase::PathChar *mode) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::OpenFile(filepath2, mode); -} - -int ReadFile(const UTF8String &filepath, void *data_out, int size) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::ReadFile(filepath2, data_out, size); -} - -bool ReadFileToString(const UTF8String &filepath, std::string &contents_out) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::ReadFileToString(filepath2, contents_out); -} - -int WriteFile(const UTF8String &filepath, const std::string &data) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::WriteFile(filepath2, data); -} - -bool CopyFile(const UTF8String &from_path, const UTF8String &to_path) -{ - UTF16String from_path2 = nbase::UTF8ToUTF16(from_path); - UTF16String to_path2 = nbase::UTF8ToUTF16(to_path); - return nbase::CopyFile(from_path2, to_path2); -} - -bool DeleteFile(const UTF8String &filepath) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::DeleteFile(filepath2); -} - -int64_t GetFileSize(const UTF8String &filepath) -{ - UTF16String filepath2 = nbase::UTF8ToUTF16(filepath); - return nbase::GetFileSize(filepath2); -} - -} // namespace shared diff --git a/tool_kits/shared/utf8_file_util.h b/tool_kits/shared/utf8_file_util.h deleted file mode 100644 index a49655db..00000000 --- a/tool_kits/shared/utf8_file_util.h +++ /dev/null @@ -1,70 +0,0 @@ -// File operation utilities for UTF-8 encoding support - -#ifndef SHARED_UTF8_FILE_UTIL_H_ -#define SHARED_UTF8_FILE_UTIL_H_ - -#include -#include "base/util/unicode.h" -#include "base/file/file_path.h" // for PathChar - -namespace shared -{ - -// Check the character is filepath separator -bool IsFilePathSeparator(const UTF8Char separator); -bool IsFilePathSeparator(const UTF8String &separator); - -// Get the file extension from filepath -bool FilePathExtension(const UTF8String &filepath_in, - UTF8String &extension_out); - -// Get the directory from the whole filepath -bool FilePathApartDirectory(const UTF8String &filepath_in, - UTF8String &directory_out); -// Get the filename from the whole filepath -bool FilePathApartFileName(const UTF8String &filepath_in, - UTF8String &filename_out); - -// Parse and extract all components of a path -bool ParsePathComponents(const UTF8Char *PathChar, - std::list &components); - -// Check if |component| is a directory -bool IsDirectoryComponent(const UTF8String &component); - -// Compose the filepath from directory and filename -bool FilePathCompose(const UTF8String &directory_in, - const UTF8String &filename_in, - UTF8String &filepath_out); - -// Check the filepath is exist -// If |is_directory| is true, check a directory, or check the path -bool FilePathIsExist(const UTF8String &filepath_in, bool is_directory); - -// Create a directory, all subdirs will be created if not existing -bool CreateDirectory(const UTF8String& full_path); - -// Wrapper for fopen-like calls. Returns non-NULL FILE* on success -FILE* OpenFile(const UTF8String &filepath, const nbase::PathChar *mode); - -// Reads the given number of bytes from the file into the buffer -int ReadFile(const UTF8String &filepath, void *data_out, int size); - -// Read the file at |path| into |contents|, returning true on success. -bool ReadFileToString(const UTF8String &filepath, std::string &contents_out); - -// Writes the content of given buffer into the file -int WriteFile(const UTF8String &filepath, const std::string &data); - -// Copies a single file. -bool CopyFile(const UTF8String &from_path, const UTF8String &to_path); - -// Deletes the given path. -bool DeleteFile(const UTF8String &filepath); - -// Get file size. -int64_t GetFileSize(const UTF8String &filepath); - -} // namespace shared - -#endif // SHARED_UTF8_FILE_UTIL_H_ diff --git a/tool_kits/shared/util.cpp b/tool_kits/shared/util.cpp deleted file mode 100644 index 10447110..00000000 --- a/tool_kits/shared/util.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "stdafx.h" -#include "util.h" -#include "shared/log.h" -#include "shellapi.h" - -std::wstring QPath::GetAppPath() -{ - return nbase::win32::GetCurrentModuleDirectory(); -} - -void QPath::AddNewEnvironment(const std::wstring& directory) -{ - TCHAR path_environment[4096]; - GetEnvironmentVariable(L"PATH", path_environment, 4096); - std::wstring new_path = directory + L";"; - std::wstring new_environment = new_path + path_environment; - SetEnvironmentVariable(L"PATH", new_environment.c_str()); -} - -// -std::map QCommand::key_value_; - -void QCommand::ParseCommand( const std::wstring &cmd ) -{ - std::list arrays = ui::StringHelper::Split(cmd, L"/"); - for(std::list::const_iterator i = arrays.begin(); i != arrays.end(); i++) - { - std::list object = ui::StringHelper::Split(*i, L" "); - assert(object.size() == 2); - key_value_[ *object.begin() ] = *object.rbegin(); - } -} - -std::wstring QCommand::Get( const std::wstring &key ) -{ - std::map::const_iterator i = key_value_.find(key); - if(i == key_value_.end()) - return L""; - else - return i->second; -} - -void QCommand::Set( const std::wstring &key, const std::wstring &value ) -{ - key_value_[key] = value; -} - -void QCommand::Erase(const std::wstring &key) -{ - key_value_.erase(key); -} - -bool QCommand::AppStartWidthCommand( const std::wstring &app, const std::wstring &cmd ) -{ - HINSTANCE hInst = ::ShellExecuteW(NULL, L"open", app.c_str(), cmd.c_str(), NULL, SW_SHOWNORMAL); - return (int)hInst > 32; -} - -bool QCommand::RestartApp(const std::wstring &cmd) -{ - wchar_t app[1024] = { 0 }; - GetModuleFileName(NULL, app, 1024); - HINSTANCE hInst = ::ShellExecuteW(NULL, L"open", app, cmd.c_str(), NULL, SW_SHOWNORMAL); - return (int)hInst > 32; -} \ No newline at end of file diff --git a/tool_kits/shared/util.h b/tool_kits/shared/util.h deleted file mode 100644 index 798d947d..00000000 --- a/tool_kits/shared/util.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include -#include - -class QString -{ -public: -}; - -class QPath -{ -public: - /** - * @brief ȡ exe Ŀ¼ - * @return exe Ŀ¼βб - */ - static std::wstring GetAppPath(); - - /** - * @brief һĿ¼ִгĻ - * @param[in] directory ҪӵĿ¼ - * @return - */ - static void AddNewEnvironment(const std::wstring& directory); -}; - -class QCommand -{ -public: - static void ParseCommand(const std::wstring &cmd); - static bool AppStartWidthCommand(const std::wstring &app, const std::wstring &cmd); - static bool RestartApp(const std::wstring &cmd); - static std::wstring Get(const std::wstring &key); - static void Set(const std::wstring &key, const std::wstring &value); - static void Erase(const std::wstring &key); -private: - static std::map key_value_; -}; \ No newline at end of file diff --git a/tool_kits/shared/xml_util.cpp b/tool_kits/shared/xml_util.cpp deleted file mode 100644 index a3fc4c0d..00000000 --- a/tool_kits/shared/xml_util.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2013, NetEase Inc. All rights reserved. -// -// wrt(guangguang) -// 2013/8/28 -// -// Xml document utilities -#include "stdafx.h" -#include "shared/xml_util.h" - -#include -#include -#include "base/memory/deleter.h" - -namespace shared -{ - -bool LoadXmlFromFile(TiXmlDocument &xml, const std::wstring &file_path) -{ - std::unique_ptr fp; - FILE* fp_file = nullptr; - if (_wfopen_s(&fp_file, file_path.c_str(), L"rb") != 0) { - return false; - } - fp.reset(fp_file); - if (!fp) { - return false; - } - if (!xml.LoadFile(fp.get())) { - return false; - } - return true; -} - -} \ No newline at end of file diff --git a/tool_kits/shared/xml_util.h b/tool_kits/shared/xml_util.h deleted file mode 100644 index 350faa2e..00000000 --- a/tool_kits/shared/xml_util.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2013, NetEase Inc. All rights reserved. -// -// wrt(guangguang) -// 2013/8/28 -// -// Xml document utilities - -#ifndef SHARED_XML_UTIL_H_ -#define SHARED_XML_UTIL_H_ - -#include -#include "third_party/tinyxml/tinyxml.h" - -namespace shared -{ - -bool LoadXmlFromFile(TiXmlDocument &xml, const std::wstring &file_path); - -} - - -#endif // SHARED_XML_UTIL_H_ diff --git a/tool_kits/shared/zoom_image.cpp b/tool_kits/shared/zoom_image.cpp deleted file mode 100644 index a2ee912d..00000000 --- a/tool_kits/shared/zoom_image.cpp +++ /dev/null @@ -1,455 +0,0 @@ -#include "stdafx.h" -#include "zoom_image.h" - -using namespace Gdiplus; - -ZoomImage::ZoomImage(void):width_(0),height_(0),ratio_(0),zoom_type_(by_none),area_zoom_(false) - ,auto_max_width_(1280),auto_max_height_(1280) -{ -} - - -ZoomImage::~ZoomImage(void) -{ -} - -void ZoomImage::SetImagePath(const std::wstring &image_path) -{ - image_path_ = image_path; -} - -void ZoomImage::SetAutoZoom(bool area_zoom,int auto_max_with,int auto_max_height) -{ - area_zoom_ = area_zoom; - auto_max_width_ = auto_max_with; - auto_max_height_ = auto_max_height; - zoom_type_ = by_auto; -} - -void ZoomImage::SetSize(int width,int height) -{ - width_ = width; - height_ = height; - zoom_type_ = by_fixed_size; - -} - -void ZoomImage::SetRatio(float ratio) -{ - ratio_ = ratio; - zoom_type_ = by_ratio; -} - -bool ZoomImage::Zoom(const std::wstring &filepath,std::wstring mime_type) -{ - if( !nbase::FilePathIsExist(filepath, false) ) - { - assert(0); - return false; - } - - if (zoom_type_ == by_none) - return false; - if (zoom_type_ == by_fixed_size && (width_ <= 0 ||height_ <= 0)) - return false; - if (zoom_type_ == by_ratio && ratio_ <= 0.0000001) - return false; - - Image image_src(filepath.c_str()); - if (image_src.GetLastStatus() != Ok) - return false; - GUID guid; - if (image_src.GetRawFormat(&guid) != Ok) - return false; - if (guid == ImageFormatGIF) //֧GIFļ; - return false; - - RotateFlipType type = GetRotateFlipType(image_src); - if (type != RotateNoneFlipNone) - image_src.RotateFlip(type); - - if (!IsNeedZoom(image_src.GetWidth(),image_src.GetHeight())) - return false; - - CalculateSize(image_src.GetWidth(),image_src.GetHeight()); - Bitmap canvas(width_,height_); - Graphics graphics(&canvas); - RectF rf(0.0f, 0.0f, (REAL)width_, (REAL)height_); - - graphics.SetSmoothingMode(SmoothingModeAntiAlias); -#if (GDIPVER >= 0x0110) - graphics.SetSmoothingMode(SmoothingModeAntiAlias8x8); -#endif - graphics.SetCompositingMode(CompositingModeSourceOver); - graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); - graphics.SetPixelOffsetMode(PixelOffsetModeHighQuality); - - if (Ok != graphics.DrawImage(&image_src,rf)) - { - int err = graphics.GetLastStatus(); - QLOG_APP(L"ZoomImage Error: {0}")< 1.0000000) - ret = true; - break; - case by_auto: - { - if (area_zoom_) - { - if (width * height> auto_max_width_ * auto_max_height_) - ret = true; - } - else - { - if (width > auto_max_width_ || height > auto_max_height_) - ret = true; - } - - } - - break; - default: - break; - } - - return ret; -} - -bool ZoomImage::CalculateSize(int width_src,int height_src) -{ - if (zoom_type_ == by_ratio) - { - width_ = (int) (width_src * ratio_); - height_ = (int) (height_src * ratio_); - } - else if (zoom_type_ == by_auto) - { - if (area_zoom_) - { - width_ = (int) ( sqrtf(auto_max_width_* (float)auto_max_height_*(float)width_src/height_src) ); - height_ = (int) ( sqrtf(auto_max_width_* (float)auto_max_height_*(float)height_src/width_src) ); - } - else - { - - float ratio = min((float)auto_max_width_/(float)width_src,(float)auto_max_height_/(float)height_src); - - width_ = (int) (width_src * ratio); - height_ = (int) (height_src * ratio); - } - } - return true; -} - -bool ZoomImage::SavePaddingImage(const std::wstring& image_path, const std::wstring& image_path_out, int width, int height, std::wstring mime_type) -{ - bool ret = false; - if (image_path.empty()) - { - return false; - } - Gdiplus::Image image_src(image_path.c_str()); - if (image_src.GetLastStatus() != Gdiplus::Ok) - { - return false; - } - Gdiplus::REAL width_src = (REAL) image_src.GetWidth(); - Gdiplus::REAL height_src = (REAL) image_src.GetHeight(); - if (width_src > 0 && height_src > 0) - { - int fixed_w = width; - int fixed_h = height; - if (fixed_h > 0 && fixed_w > 0) - { - Gdiplus::REAL left = 0; - Gdiplus::REAL top = 0; - if (width_src * fixed_h > height_src * fixed_w) - { - left = width_src - (height_src * fixed_w / fixed_h); - width_src -= left; - left /= 2; - } - else - { - top = height_src - (width_src * fixed_h / fixed_w); - height_src -= top; - top /= 2; - } - - HDC hdc = ::GetDC(NULL); - HDC hMemDC = CreateCompatibleDC(hdc); - HBITMAP hbmp = CreateCompatibleBitmap(hdc, fixed_w, fixed_h); - HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hbmp); - Gdiplus::Graphics graphics(hMemDC); - Gdiplus::RectF rectf(0.0f, 0.0f, (REAL)fixed_w, (REAL)fixed_h); - graphics.DrawImage(&image_src, rectf, left, top, width_src, height_src, Gdiplus::UnitPixel); - hbmp = (HBITMAP)SelectObject(hMemDC, hOldBitmap); - // - DeleteDC(hMemDC); - ::ReleaseDC(NULL, hdc); - Gdiplus::Bitmap bmp(hbmp, NULL); - ret = SaveImage(bmp, image_path_out, mime_type, 100); - DeleteObject(hbmp); - } - } - return ret; -} - -bool ZoomImage::GetImageCLSID(const wchar_t* format, CLSID* pCLSID) -{ - UINT num = 0; - UINT size = 0; - ImageCodecInfo* pImageCodecInfo = NULL; - GetImageEncodersSize(&num, &size); - - if (size == 0) - return false; - - pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); - if(pImageCodecInfo == NULL) - return false; - GetImageEncoders(num, size, pImageCodecInfo); - - for (UINT i = 0; i < num; ++i) - { - if ( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 ) - { - *pCLSID = pImageCodecInfo[i].Clsid; - free(pImageCodecInfo); - return true; - } - } - free(pImageCodecInfo); - - return false; -} - -bool ZoomImage::ConvertImageFormat(std::wstring& filepath,std::wstring mime_type) -{ - if( !nbase::FilePathIsExist(filepath, false) ) - { - assert(0); - return false; - } - - Image image(filepath.c_str()); - if (image.GetLastStatus() != Ok) - { - ASSERT(0); - return false; - } - return SaveImage(image,image_path_,mime_type); -} - -bool ZoomImage::SaveImage(Gdiplus::Image& image, const std::wstring& file_path,std::wstring mime_type,long quality_num/* = 90*/) -{ - CLSID clsid; - if (!GetImageCLSID(mime_type.c_str(),&clsid)) - return false; - - EncoderParameters encoder_paramters; - encoder_paramters.Count = 1; - encoder_paramters.Parameter[0].Guid = EncoderQuality; - encoder_paramters.Parameter[0].NumberOfValues = 1; - encoder_paramters.Parameter[0].Type = EncoderParameterValueTypeLong; - encoder_paramters.Parameter[0].Value = (void*)&quality_num; - Status status = image.Save(file_path.c_str(),&clsid,&encoder_paramters); - if (status != Ok) - { - int err = status; - QLOG_APP(L"SaveImage Error: {0}")< 0) - { - PropertyItem *property_item = (PropertyItem*) malloc( nSize ); - if (image.GetPropertyItem( PropertyTagOrientation, nSize, property_item ) == Ok) - { - orientation = *(short*)property_item->value; - } - - free(property_item); - } - return GetRotateFlipType(orientation); -} - -Gdiplus::RotateFlipType ZoomImage::GetRotateFlipType(short orientation) -{ - RotateFlipType type = RotateNoneFlipNone; - switch(orientation) - { - case 1: - break; - case 2: - type = RotateNoneFlipX; - break; - case 3: - type = RotateNoneFlipXY; - break; - case 4: - type = RotateNoneFlipY; - break; - case 5: - type = Rotate90FlipX; - break; - case 6: - type = Rotate90FlipNone; - break; - case 7: - type = Rotate90FlipY; - break; - case 8: - type = Rotate270FlipNone; - break; - default: - break; - } - return type; -} - -void ZoomImage::GetMimeType(const std::wstring& filepath, std::wstring& mime_type_out, std::wstring& exten_out) -{ - if (filepath.empty()) - { - return; - } - Image image_src(filepath.c_str()); - if (image_src.GetLastStatus() != Ok) - { - return; - } - GUID guid; - if (image_src.GetRawFormat(&guid) != Ok) - { - return; - } - mime_type_out = GetMimeType(guid); - if (mime_type_out.empty()) - { - return; - } - if (mime_type_out == kImageGIF) - { - exten_out = L".gif"; - } - else if (mime_type_out == kImageJPEG) - { - exten_out = L".jpg"; - } - else if (mime_type_out == kImagePNG) - { - exten_out = L".png"; - } - else if (mime_type_out == kImageBMP) - { - exten_out = L".bmp"; - } -} - -std::wstring ZoomImage::GetMimeType(const std::wstring& filepath) -{ - if (filepath.empty()) - return L""; - Image image_src(filepath.c_str()); - Gdiplus::Status status = image_src.GetLastStatus(); - if(status != Ok) - { - QLOG_ERR(L"Image {0} error {1}") < img; - img.reset( Gdiplus::Image::FromFile( file.c_str() ) ); - if(img.get() != NULL) - { - Gdiplus::RotateFlipType type = ZoomImage::GetRotateFlipType(*img); - if (type != RotateNoneFlipNone) //תͼƬ; - img->RotateFlip(type); - - size.cx = img->GetWidth(); - size.cy = img->GetHeight(); - if (size.cx == 0 || size.cy == 0) - { - size.cx = max_width; - size.cy = (int) (size.cx * 0.618); - need_resize = true; - } - else - { - if (size.cx > max_width || size.cy > max_height) - { - float index_x = (float)max_width / (float)size.cx; - float index_y = (float)max_height / (float)size.cy; - float index = min(index_x, index_y); - size.cx = (int)(size.cx * index); - size.cy = (int)(size.cy * index); - need_resize = true; - } - } - } - } - else - { - assert(0); - } - return need_resize; -} - -void ZoomImageF( const std::wstring &src, const std::wstring &dest, int cx, int cy ) -{ - ZoomImage zoom; - zoom.SetImagePath(dest); - zoom.SetSize(cx, cy); - zoom.Zoom(src); -} diff --git a/tool_kits/shared/zoom_image.h b/tool_kits/shared/zoom_image.h deleted file mode 100644 index 74250696..00000000 --- a/tool_kits/shared/zoom_image.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once -//#include "util.h" -#include "log.h" -#include -#include - -static const std::wstring kImageJPEG = L"image/jpeg"; -static const std::wstring kImagePNG = L"image/png"; -static const std::wstring kImageBMP = L"image/bmp"; -static const std::wstring kImageGIF = L"image/gif"; - - -class ZoomImage -{ -public: - ZoomImage(void); - ~ZoomImage(void); - //źͼƬ· - void SetImagePath(const std::wstring &image_path); - //ΪԶģʽ - void SetAutoZoom(bool area_zoom,int auto_max_with,int auto_max_height); - //Ϊ̶Сģʽ - void SetSize(int width,int height); - //Ϊģʽ - void SetRatio(float ratio); - - /* - * @brief ijһͼƬ浽Ϊָʽ - * @param filepath:ҪŵԴͼƬ· - * @param mime_type:ͼƬ - */ - bool Zoom(const std::wstring& filepath,std::wstring mime_type=L"image/jpeg"); - //ͼƬΪָͣͼƬ - bool ConvertImageFormat(std::wstring& filepath, std::wstring mime_type); - //ȡͼķת - static Gdiplus::RotateFlipType GetRotateFlipType(Gdiplus::Image& image); - static std::wstring GetMimeType(const std::wstring& filepath); - static void GetMimeType(const std::wstring& filepath, std::wstring& mime_type_out, std::wstring& exten_out); - /* - * @brief widthheightıȡԴͼƬͬΧͼƬ֣浽Ϊָʽ - * @param filepath:ԴͼƬ· - * @param image_path_out:ͼƬ· - * @param width:ҪŵԴͼƬ· - * @param height:ҪŵԴͼƬ· - * @param mime_type:ͼƬ - */ - static bool SavePaddingImage(const std::wstring& image_path, const std::wstring& image_path_out, int width, int height, std::wstring mime_type = L"image/jpeg"); - -protected: - //жǷҪ - bool IsNeedZoom(int width,int height); - //źĴС浽width_height_ - bool CalculateSize(int width_src,int height_src); - static bool GetImageCLSID(const wchar_t* format, CLSID* pCLSID); - static bool SaveImage(Gdiplus::Image& image, const std::wstring& file_path,std::wstring mime_type,long quality_num = 95); - static Gdiplus::RotateFlipType GetRotateFlipType(short orientation); - static std::wstring GetMimeType(GUID& clsid); - -private: - enum ZoomType - { - by_fixed_size = 0, - by_ratio, - by_auto,by_none - };//by_fixed_size:̶ߴ,by_ratio:; - - std::wstring file_path_save_; - ZoomType zoom_type_; - - bool area_zoom_; //Ƿwidth*height; - int auto_max_width_; - int auto_max_height_; - - int width_; - int height_; - - float ratio_; - - std::wstring image_path_; -}; - -//ͼmax_width * max_height£ֵΪtrueʾҪüͬʱͼƬsize -bool CalculateImageSize(const std::wstring& file, SIZE& size, int max_width, int max_height); - -//ͼСcx * cy -void ZoomImageF(const std::wstring &src, const std::wstring &dest, int cx, int cy); \ No newline at end of file diff --git a/tool_kits/ui_components/cef_control/app/cef_js_bridge.cpp b/ui_components/cef_control/app/cef_js_bridge.cpp similarity index 98% rename from tool_kits/ui_components/cef_control/app/cef_js_bridge.cpp rename to ui_components/cef_control/app/cef_js_bridge.cpp index 860dd184..0b95d408 100644 --- a/tool_kits/ui_components/cef_control/app/cef_js_bridge.cpp +++ b/ui_components/cef_control/app/cef_js_bridge.cpp @@ -245,7 +245,7 @@ bool CefJSBridge::ExecuteCppCallbackFunc(int cpp_callback_id, const CefString& j auto callback = it->second; if (callback) { - Post2UI([=]() { callback(json_string); }); + nbase::ThreadManager::PostTask(kThreadMain, [=]() { callback(json_string); }); } // ִɺӻƳ @@ -291,7 +291,7 @@ bool CefJSBridge::ExecuteCppFunc(const CefString& function_name, const CefString if (it != browser_registered_function_.cend()) { auto function = it->second; - Post2UI([=]() { + nbase::ThreadManager::PostTask(kThreadMain, [=]() { function(params, [=](bool has_error, const std::string& json_result) { // Դ룬Ҫװ args->SetInt(0, js_callback_id); @@ -307,7 +307,7 @@ bool CefJSBridge::ExecuteCppFunc(const CefString& function_name, const CefString if (it != browser_registered_function_.cend()) { auto function = it->second; - Post2UI([=]() { + nbase::ThreadManager::PostTask(kThreadMain, [=]() { function(params, [=](bool has_error, const std::string& json_result) { // Դ룬Ҫװ args->SetInt(0, js_callback_id); diff --git a/tool_kits/ui_components/cef_control/app/cef_js_bridge.h b/ui_components/cef_control/app/cef_js_bridge.h similarity index 100% rename from tool_kits/ui_components/cef_control/app/cef_js_bridge.h rename to ui_components/cef_control/app/cef_js_bridge.h diff --git a/tool_kits/ui_components/cef_control/app/client_app.cpp b/ui_components/cef_control/app/client_app.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/app/client_app.cpp rename to ui_components/cef_control/app/client_app.cpp diff --git a/tool_kits/ui_components/cef_control/app/client_app.h b/ui_components/cef_control/app/client_app.h similarity index 100% rename from tool_kits/ui_components/cef_control/app/client_app.h rename to ui_components/cef_control/app/client_app.h diff --git a/tool_kits/ui_components/cef_control/app/client_app_browser.cpp b/ui_components/cef_control/app/client_app_browser.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/app/client_app_browser.cpp rename to ui_components/cef_control/app/client_app_browser.cpp diff --git a/tool_kits/ui_components/cef_control/app/client_app_render.cpp b/ui_components/cef_control/app/client_app_render.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/app/client_app_render.cpp rename to ui_components/cef_control/app/client_app_render.cpp diff --git a/tool_kits/ui_components/cef_control/app/ipc_string_define.h b/ui_components/cef_control/app/ipc_string_define.h similarity index 100% rename from tool_kits/ui_components/cef_control/app/ipc_string_define.h rename to ui_components/cef_control/app/ipc_string_define.h diff --git a/tool_kits/ui_components/cef_control/app/js_handler.cpp b/ui_components/cef_control/app/js_handler.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/app/js_handler.cpp rename to ui_components/cef_control/app/js_handler.cpp diff --git a/tool_kits/ui_components/cef_control/app/js_handler.h b/ui_components/cef_control/app/js_handler.h similarity index 100% rename from tool_kits/ui_components/cef_control/app/js_handler.h rename to ui_components/cef_control/app/js_handler.h diff --git a/tool_kits/ui_components/cef_control/control/cef_control.cpp b/ui_components/cef_control/control/cef_control.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_control.cpp rename to ui_components/cef_control/control/cef_control.cpp diff --git a/tool_kits/ui_components/cef_control/control/cef_control.h b/ui_components/cef_control/control/cef_control.h similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_control.h rename to ui_components/cef_control/control/cef_control.h diff --git a/tool_kits/ui_components/cef_control/control/cef_control_base.cpp b/ui_components/cef_control/control/cef_control_base.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_control_base.cpp rename to ui_components/cef_control/control/cef_control_base.cpp diff --git a/tool_kits/ui_components/cef_control/control/cef_control_base.h b/ui_components/cef_control/control/cef_control_base.h similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_control_base.h rename to ui_components/cef_control/control/cef_control_base.h diff --git a/tool_kits/ui_components/cef_control/control/cef_control_base_ui.cpp b/ui_components/cef_control/control/cef_control_base_ui.cpp similarity index 97% rename from tool_kits/ui_components/cef_control/control/cef_control_base_ui.cpp rename to ui_components/cef_control/control/cef_control_base_ui.cpp index aeccb098..fc324801 100644 --- a/tool_kits/ui_components/cef_control/control/cef_control_base_ui.cpp +++ b/ui_components/cef_control/control/cef_control_base_ui.cpp @@ -206,7 +206,6 @@ bool CefControlBase::CallJSFunction(const std::wstring& js_function_name, const if (!js_bridge_->CallJSFunction(nbase::UTF16ToUTF8(js_function_name).c_str(), nbase::UTF16ToUTF8(params).c_str(), frame, callback)) { - QLOG_ERR(L"Failed to call JavaScript function {0}") << js_function_name; return false; } @@ -225,7 +224,6 @@ bool CefControlBase::CallJSFunction(const std::wstring& js_function_name, const if (!js_bridge_->CallJSFunction(nbase::UTF16ToUTF8(js_function_name).c_str(), nbase::UTF16ToUTF8(params).c_str(), frame, callback)) { - QLOG_ERR(L"Failed to call JavaScript function {0}") << js_function_name; return false; } diff --git a/tool_kits/ui_components/cef_control/control/cef_control_event.h b/ui_components/cef_control/control/cef_control_event.h similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_control_event.h rename to ui_components/cef_control/control/cef_control_event.h diff --git a/tool_kits/ui_components/cef_control/control/cef_control_ui.cpp b/ui_components/cef_control/control/cef_control_ui.cpp similarity index 99% rename from tool_kits/ui_components/cef_control/control/cef_control_ui.cpp rename to ui_components/cef_control/control/cef_control_ui.cpp index a50c59d4..b38be90c 100644 --- a/tool_kits/ui_components/cef_control/control/cef_control_ui.cpp +++ b/ui_components/cef_control/control/cef_control_ui.cpp @@ -280,7 +280,7 @@ bool CefControl::AttachDevTools(Control* control) { auto weak = view->GetWeakFlag(); auto task = [this, weak, view](){ - nbase::ThreadManager::PostTask(ThreadId::kThreadUI, ToWeakCallback([this, weak, view](){ + nbase::ThreadManager::PostTask(kThreadMain, ToWeakCallback([this, weak, view](){ if (weak.expired()) return; AttachDevTools(view); diff --git a/tool_kits/ui_components/cef_control/control/cef_native_control.cpp b/ui_components/cef_control/control/cef_native_control.cpp similarity index 98% rename from tool_kits/ui_components/cef_control/control/cef_native_control.cpp rename to ui_components/cef_control/control/cef_native_control.cpp index 653e584e..305c41fc 100644 --- a/tool_kits/ui_components/cef_control/control/cef_native_control.cpp +++ b/ui_components/cef_control/control/cef_native_control.cpp @@ -151,7 +151,7 @@ bool CefNativeControl::AttachDevTools(Control* /*view*/) { auto task = ToWeakCallback([this]() { - nbase::ThreadManager::PostTask(ThreadId::kThreadUI, ToWeakCallback([this](){ + nbase::ThreadManager::PostTask(kThreadMain, ToWeakCallback([this](){ AttachDevTools(nullptr); })); }); diff --git a/tool_kits/ui_components/cef_control/control/cef_native_control.h b/ui_components/cef_control/control/cef_native_control.h similarity index 100% rename from tool_kits/ui_components/cef_control/control/cef_native_control.h rename to ui_components/cef_control/control/cef_native_control.h diff --git a/tool_kits/ui_components/cef_control/handler/browser_handler.cpp b/ui_components/cef_control/handler/browser_handler.cpp similarity index 89% rename from tool_kits/ui_components/cef_control/handler/browser_handler.cpp rename to ui_components/cef_control/handler/browser_handler.cpp index b5996e93..5c30169d 100644 --- a/tool_kits/ui_components/cef_control/handler/browser_handler.cpp +++ b/ui_components/cef_control/handler/browser_handler.cpp @@ -135,7 +135,7 @@ bool BrowserHandler::OnBeforePopup(CefRefPtr browser, void BrowserHandler::OnAfterCreated(CefRefPtr browser) { REQUIRE_UI_THREAD(); - nbase::ThreadManager::PostTask(kThreadUI, ToWeakCallback([this, browser](){ + nbase::ThreadManager::PostTask(kThreadMain, ToWeakCallback([this, browser](){ browser_list_.emplace_back(browser); if (browser_ != nullptr) browser_->GetHost()->WasHidden(true); @@ -167,7 +167,7 @@ bool BrowserHandler::DoClose(CefRefPtr browser) void BrowserHandler::OnBeforeClose(CefRefPtr browser) { REQUIRE_UI_THREAD(); - nbase::ThreadManager::PostTask(kThreadUI, ToWeakCallback([this, browser](){ + nbase::ThreadManager::PostTask(kThreadMain, ToWeakCallback([this, browser](){ CefManager::GetInstance()->SubBrowserCount(); auto it = std::find_if(browser_list_.begin(), browser_list_.end(), [&](const CefRefPtr& item){ return item->IsSame(browser); @@ -248,13 +248,13 @@ bool BrowserHandler::GetScreenPoint(CefRefPtr browser, int viewX, in void BrowserHandler::OnPopupShow(CefRefPtr browser, bool show) { if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnPopupShow, handle_delegate_, browser, show)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnPopupShow, handle_delegate_, browser, show)); } void BrowserHandler::OnPopupSize(CefRefPtr browser, const CefRect& rect) { if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnPopupSize, handle_delegate_, browser, rect)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnPopupSize, handle_delegate_, browser, rect)); } void BrowserHandler::OnPaint(CefRefPtr browser, @@ -273,7 +273,7 @@ void BrowserHandler::OnPaint(CefRefPtr browser, paint_buffer_.resize(buffer_length + 1); memcpy(&paint_buffer_[0], (char*)buffer, width * height * 4); - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnPaint, handle_delegate_, browser, type, dirtyRects, &paint_buffer_, width, height)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnPaint, handle_delegate_, browser, type, dirtyRects, &paint_buffer_, width, height)); } } @@ -338,14 +338,14 @@ void BrowserHandler::OnAddressChange(CefRefPtr browser, CefRefPtr browser, const CefString& title) { // Update the browser window title... if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnTitleChange, handle_delegate_, browser, title)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnTitleChange, handle_delegate_, browser, title)); } bool BrowserHandler::OnConsoleMessage(CefRefPtr browser, const CefString& message, const CefString& source, int line) @@ -360,28 +360,28 @@ void BrowserHandler::OnLoadingStateChange(CefRefPtr browser, bool is { // Update UI for browser state... if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadingStateChange, handle_delegate_, browser, isLoading, canGoBack, canGoForward)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnLoadingStateChange, handle_delegate_, browser, isLoading, canGoBack, canGoForward)); } void BrowserHandler::OnLoadStart(CefRefPtr browser, CefRefPtr frame) { // A frame has started loading content... if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadStart, handle_delegate_, browser, frame)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnLoadStart, handle_delegate_, browser, frame)); } void BrowserHandler::OnLoadEnd(CefRefPtr browser, CefRefPtr frame, int httpStatusCode) { // A frame has finished loading content... if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadEnd, handle_delegate_, browser, frame, httpStatusCode)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnLoadEnd, handle_delegate_, browser, frame, httpStatusCode)); } void BrowserHandler::OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) { // A frame has failed to load content... if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadError, handle_delegate_, browser, frame, errorCode, errorText, failedUrl)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnLoadError, handle_delegate_, browser, frame, errorCode, errorText, failedUrl)); } bool BrowserHandler::OnJSDialog(CefRefPtr browser, const CefString& origin_url, const CefString& accept_lang, JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) @@ -424,7 +424,7 @@ CefRequestHandler::ReturnValue BrowserHandler::OnBeforeResourceLoad( void BrowserHandler::OnRenderProcessTerminated(CefRefPtr browser, TerminationStatus status) { if (handle_delegate_) - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnRenderProcessTerminated, handle_delegate_, browser, status)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&HandlerDelegate::OnRenderProcessTerminated, handle_delegate_, browser, status)); } diff --git a/tool_kits/ui_components/cef_control/handler/browser_handler.h b/ui_components/cef_control/handler/browser_handler.h similarity index 99% rename from tool_kits/ui_components/cef_control/handler/browser_handler.h rename to ui_components/cef_control/handler/browser_handler.h index a0de4b7d..3c12ed48 100644 --- a/tool_kits/ui_components/cef_control/handler/browser_handler.h +++ b/ui_components/cef_control/handler/browser_handler.h @@ -7,7 +7,7 @@ #pragma once #include "include/cef_client.h" #include "include/cef_browser.h" -#include "shared/auto_unregister.h" +#include "cef_control/util/auto_unregister.h" #include "cef_control/app/cef_js_bridge.h" namespace nim_cef diff --git a/tool_kits/ui_components/cef_control/manager/cef_manager.cpp b/ui_components/cef_control/manager/cef_manager.cpp similarity index 96% rename from tool_kits/ui_components/cef_control/manager/cef_manager.cpp rename to ui_components/cef_control/manager/cef_manager.cpp index 879412db..201b5e06 100644 --- a/tool_kits/ui_components/cef_control/manager/cef_manager.cpp +++ b/ui_components/cef_control/manager/cef_manager.cpp @@ -72,7 +72,7 @@ void CefManager::AddCefDllToPath() TCHAR path_envirom[4096] = { 0 }; GetEnvironmentVariable(L"path", path_envirom, 4096); - std::wstring cef_path = QPath::GetAppPath(); + std::wstring cef_path = nbase::win32::GetCurrentModuleDirectory(); #ifdef _DEBUG //cef_path += L"cef_debug"; // ڼʹdebugģʽҲʹcef release汾dllΪεcef˳ʱжϣҪcefĹܲҪʹdebug汾dll cef_path += L"cef"; @@ -133,7 +133,6 @@ void CefManager::UnInitialize() #if !defined(SUPPORT_CEF) return; #endif - QLOG_APP(L"shutting down cef..."); CefShutdown(); } @@ -174,10 +173,10 @@ void CefManager::PostQuitMessage(int nExitCode) // Ӧõٺٵ::PostQuitMessage if (browser_count_ == 0) { - Post2UI([nExitCode]() + nbase::ThreadManager::PostTask(kThreadMain, [nExitCode]() { ::PostQuitMessage(nExitCode); - }); + }); } else { @@ -186,7 +185,7 @@ void CefManager::PostQuitMessage(int nExitCode) CefManager::GetInstance()->PostQuitMessage(nExitCode); }; - nbase::ThreadManager::PostDelayedTask(kThreadUI, cb, nbase::TimeDelta::FromMilliseconds(500)); + nbase::ThreadManager::PostDelayedTask(kThreadMain, cb, nbase::TimeDelta::FromMilliseconds(500)); } } diff --git a/tool_kits/ui_components/cef_control/manager/cef_manager.h b/ui_components/cef_control/manager/cef_manager.h similarity index 100% rename from tool_kits/ui_components/cef_control/manager/cef_manager.h rename to ui_components/cef_control/manager/cef_manager.h diff --git a/tool_kits/shared/auto_unregister.h b/ui_components/cef_control/util/auto_unregister.h similarity index 100% rename from tool_kits/shared/auto_unregister.h rename to ui_components/cef_control/util/auto_unregister.h diff --git a/tool_kits/ui_components/cef_control/util/memory_dc.cpp b/ui_components/cef_control/util/memory_dc.cpp similarity index 100% rename from tool_kits/ui_components/cef_control/util/memory_dc.cpp rename to ui_components/cef_control/util/memory_dc.cpp diff --git a/tool_kits/ui_components/cef_control/util/memory_dc.h b/ui_components/cef_control/util/memory_dc.h similarity index 100% rename from tool_kits/ui_components/cef_control/util/memory_dc.h rename to ui_components/cef_control/util/memory_dc.h diff --git a/tool_kits/ui_components/cef_control/util/util.h b/ui_components/cef_control/util/util.h similarity index 100% rename from tool_kits/ui_components/cef_control/util/util.h rename to ui_components/cef_control/util/util.h diff --git a/tool_kits/ui_components/menu/ui_menu.cpp b/ui_components/menu/ui_menu.cpp similarity index 100% rename from tool_kits/ui_components/menu/ui_menu.cpp rename to ui_components/menu/ui_menu.cpp diff --git a/tool_kits/ui_components/menu/ui_menu.h b/ui_components/menu/ui_menu.h similarity index 100% rename from tool_kits/ui_components/menu/ui_menu.h rename to ui_components/menu/ui_menu.h diff --git a/tool_kits/ui_components/modal_wnd/async_do_modal.cpp b/ui_components/modal_wnd/async_do_modal.cpp similarity index 100% rename from tool_kits/ui_components/modal_wnd/async_do_modal.cpp rename to ui_components/modal_wnd/async_do_modal.cpp diff --git a/tool_kits/ui_components/modal_wnd/async_do_modal.h b/ui_components/modal_wnd/async_do_modal.h similarity index 100% rename from tool_kits/ui_components/modal_wnd/async_do_modal.h rename to ui_components/modal_wnd/async_do_modal.h diff --git a/tool_kits/ui_components/modal_wnd/async_modal_runner.cpp b/ui_components/modal_wnd/async_modal_runner.cpp similarity index 95% rename from tool_kits/ui_components/modal_wnd/async_modal_runner.cpp rename to ui_components/modal_wnd/async_modal_runner.cpp index c0c8986a..56f89faf 100644 --- a/tool_kits/ui_components/modal_wnd/async_modal_runner.cpp +++ b/ui_components/modal_wnd/async_modal_runner.cpp @@ -1,8 +1,8 @@ #include "stdafx.h" #include "async_modal_runner.h" -#include #include "base/thread/thread_manager.h" -#include "shared/threads.h" + +#include static const char kModalThreadName[] = "AsyncModalRunner"; @@ -102,7 +102,7 @@ void AsyncModalRunnerManager::CancelAllThreads() void AsyncModalRunnerManager::OnThreadWillExit(AsyncModalRunner *runner) { - nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&AsyncModalRunnerManager::Deregister, this, runner)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(&AsyncModalRunnerManager::Deregister, this, runner)); } void AsyncModalRunnerManager::Deregister(AsyncModalRunner *runner) diff --git a/tool_kits/ui_components/modal_wnd/async_modal_runner.h b/ui_components/modal_wnd/async_modal_runner.h similarity index 100% rename from tool_kits/ui_components/modal_wnd/async_modal_runner.h rename to ui_components/modal_wnd/async_modal_runner.h diff --git a/tool_kits/ui_components/modal_wnd/file_dialog_ex.cpp b/ui_components/modal_wnd/file_dialog_ex.cpp similarity index 96% rename from tool_kits/ui_components/modal_wnd/file_dialog_ex.cpp rename to ui_components/modal_wnd/file_dialog_ex.cpp index e5ed9f55..f629c7e5 100644 --- a/tool_kits/ui_components/modal_wnd/file_dialog_ex.cpp +++ b/ui_components/modal_wnd/file_dialog_ex.cpp @@ -5,7 +5,6 @@ #include "base/thread/thread_manager.h" #include "base/util/string_util.h" #include "base/file/file_util.h" -#include "shared/threads.h" CFileDialogEx::CFileDialogEx(void) { @@ -173,7 +172,7 @@ void CFileDialogEx::SyncShowModal() if (file_name.size() == 0) { StdClosure closure = nbase::Bind(file_dialog_callback2_, ret, file_directory); - nbase::ThreadManager::PostTask(kThreadUI, closure); + nbase::ThreadManager::PostTask(kThreadMain, closure); } else { @@ -183,7 +182,7 @@ void CFileDialogEx::SyncShowModal() if (nbase::FilePathIsExist(file_path, false)) { StdClosure closure = nbase::Bind(file_dialog_callback2_, ret, file_path); - nbase::ThreadManager::PostTask(kThreadUI, closure); + nbase::ThreadManager::PostTask(kThreadMain, closure); } get_length += file_name.size()+1; file_name = m_stOFN.lpstrFile + get_length; @@ -193,14 +192,14 @@ void CFileDialogEx::SyncShowModal() else { StdClosure closure = nbase::Bind(file_dialog_callback2_, ret, GetPathName()); - nbase::ThreadManager::PostTask(kThreadUI, closure); + nbase::ThreadManager::PostTask(kThreadMain, closure); } } else if (file_dialog_type_ == FDT_SaveFile) { BOOL ret = ::GetSaveFileName(&m_stOFN); StdClosure closure = nbase::Bind(file_dialog_callback2_, ret, GetPathName()); - nbase::ThreadManager::PostTask(kThreadUI, closure); + nbase::ThreadManager::PostTask(kThreadMain, closure); } else { diff --git a/tool_kits/ui_components/modal_wnd/file_dialog_ex.h b/ui_components/modal_wnd/file_dialog_ex.h similarity index 99% rename from tool_kits/ui_components/modal_wnd/file_dialog_ex.h rename to ui_components/modal_wnd/file_dialog_ex.h index f2434ef3..be249a54 100644 --- a/tool_kits/ui_components/modal_wnd/file_dialog_ex.h +++ b/ui_components/modal_wnd/file_dialog_ex.h @@ -1,9 +1,10 @@ #ifndef _TOOL_FILE_DIALOGEX_H_ #define _TOOL_FILE_DIALOGEX_H_ -#include #include "modal_wnd_base.h" +#include + struct __POSITION {}; typedef __POSITION* POSITION; diff --git a/tool_kits/ui_components/modal_wnd/modal_wnd_base.h b/ui_components/modal_wnd/modal_wnd_base.h similarity index 100% rename from tool_kits/ui_components/modal_wnd/modal_wnd_base.h rename to ui_components/modal_wnd/modal_wnd_base.h diff --git a/tool_kits/ui_components/msgbox/msgbox.cpp b/ui_components/msgbox/msgbox.cpp similarity index 97% rename from tool_kits/ui_components/msgbox/msgbox.cpp rename to ui_components/msgbox/msgbox.cpp index bc458c80..ecd75b3f 100644 --- a/tool_kits/ui_components/msgbox/msgbox.cpp +++ b/ui_components/msgbox/msgbox.cpp @@ -178,6 +178,6 @@ void MsgBox::EndMsgBox(MsgBoxRet ret) if (msgbox_callback_) { - Post2UI(nbase::Bind(msgbox_callback_, ret)); + nbase::ThreadManager::PostTask(kThreadMain, nbase::Bind(msgbox_callback_, ret)); } } diff --git a/tool_kits/ui_components/msgbox/msgbox.h b/ui_components/msgbox/msgbox.h similarity index 100% rename from tool_kits/ui_components/msgbox/msgbox.h rename to ui_components/msgbox/msgbox.h diff --git a/tool_kits/ui_components/shadow_wnd/shadow_wnd.cpp b/ui_components/shadow_wnd/shadow_wnd.cpp similarity index 100% rename from tool_kits/ui_components/shadow_wnd/shadow_wnd.cpp rename to ui_components/shadow_wnd/shadow_wnd.cpp diff --git a/tool_kits/ui_components/shadow_wnd/shadow_wnd.h b/ui_components/shadow_wnd/shadow_wnd.h similarity index 100% rename from tool_kits/ui_components/shadow_wnd/shadow_wnd.h rename to ui_components/shadow_wnd/shadow_wnd.h diff --git a/tool_kits/ui_components/stdafx.cpp b/ui_components/stdafx.cpp similarity index 100% rename from tool_kits/ui_components/stdafx.cpp rename to ui_components/stdafx.cpp diff --git a/tool_kits/ui_components/stdafx.h b/ui_components/stdafx.h similarity index 92% rename from tool_kits/ui_components/stdafx.h rename to ui_components/stdafx.h index a41f2ded..0e2cb7c8 100644 --- a/tool_kits/ui_components/stdafx.h +++ b/ui_components/stdafx.h @@ -23,8 +23,5 @@ // base #include "base/base.h" -// shared -#include "shared/shared.h" - // duilib #include "duilib/UIlib.h" diff --git a/tool_kits/ui_components/targetver.h b/ui_components/targetver.h similarity index 100% rename from tool_kits/ui_components/targetver.h rename to ui_components/targetver.h diff --git a/tool_kits/ui_components/toast/toast.cpp b/ui_components/toast/toast.cpp similarity index 97% rename from tool_kits/ui_components/toast/toast.cpp rename to ui_components/toast/toast.cpp index da2c9ae4..a5148f16 100644 --- a/tool_kits/ui_components/toast/toast.cpp +++ b/ui_components/toast/toast.cpp @@ -90,7 +90,7 @@ void Toast::SetDuration(int duration) if (duration <= 0) return; - nbase::ThreadManager::PostDelayedTask(kThreadUI, ToWeakCallback([this]() + nbase::ThreadManager::PostDelayedTask(kThreadMain, ToWeakCallback([this]() { this->Close(); }), nbase::TimeDelta::FromMilliseconds(duration)); diff --git a/tool_kits/ui_components/toast/toast.h b/ui_components/toast/toast.h similarity index 100% rename from tool_kits/ui_components/toast/toast.h rename to ui_components/toast/toast.h diff --git a/tool_kits/ui_components/ui_cef_control.h b/ui_components/ui_cef_control.h similarity index 100% rename from tool_kits/ui_components/ui_cef_control.h rename to ui_components/ui_cef_control.h diff --git a/tool_kits/ui_components/ui_components.h b/ui_components/ui_components.h similarity index 100% rename from tool_kits/ui_components/ui_components.h rename to ui_components/ui_components.h diff --git a/tool_kits/ui_components/ui_components.vcxproj b/ui_components/ui_components.vcxproj similarity index 87% rename from tool_kits/ui_components/ui_components.vcxproj rename to ui_components/ui_components.vcxproj index b8fa6e95..b752bff1 100644 --- a/tool_kits/ui_components/ui_components.vcxproj +++ b/ui_components/ui_components.vcxproj @@ -72,23 +72,23 @@ true - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\ true - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\x64\ false - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\ false - ..\..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ - ..\..\libs\x64\ + $(ProjectDir)..\tmp\$(PlatformName)\$(ProjectName)\$(Configuration)\ + $(ProjectDir)..\libs\x64\ @@ -98,7 +98,7 @@ true SUPPORT_CEF;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true - .\;..\;..\..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) + .\;..\;..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) MultiThreadedDebug @@ -106,7 +106,7 @@ true - ..\..\libs\;%(AdditionalLibraryDirectories) + ..\libs\;%(AdditionalLibraryDirectories) nim_libcef_d.lib;libcef_dll_wrapper_d.lib;%(AdditionalDependencies) /IGNORE:4006,4221 %(AdditionalOptions) @@ -119,7 +119,7 @@ true SUPPORT_CEF;_DEBUG;_LIB;%(PreprocessorDefinitions) true - .\;..\;..\..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) + .\;..\;..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) MultiThreadedDebug @@ -127,7 +127,7 @@ true - ..\..\libs\x64\;%(AdditionalLibraryDirectories) + ..\libs\x64\;%(AdditionalLibraryDirectories) nim_libcef_d.lib;%(AdditionalDependencies) /IGNORE:4006,4221 %(AdditionalOptions) @@ -142,7 +142,7 @@ true SUPPORT_CEF;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true - .\;..\;..\..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) + .\;..\;..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) MultiThreaded @@ -152,7 +152,7 @@ true - ..\..\libs\;%(AdditionalLibraryDirectories) + ..\libs\;%(AdditionalLibraryDirectories) nim_libcef.lib;%(AdditionalDependencies) /IGNORE:4006,4221 %(AdditionalOptions) @@ -167,7 +167,7 @@ true SUPPORT_CEF;NDEBUG;_LIB;%(PreprocessorDefinitions) true - .\;..\;..\..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) + .\;..\;..\third_party\cef_wrapper\;%(AdditionalIncludeDirectories) MultiThreaded @@ -177,12 +177,13 @@ true - ..\..\libs\x64\;%(AdditionalLibraryDirectories) + ..\libs\x64\;%(AdditionalLibraryDirectories) nim_libcef.lib;%(AdditionalDependencies) /IGNORE:4006,4221 %(AdditionalOptions) + @@ -241,7 +242,7 @@ - + {a9d6dc71-c0dc-4549-aea0-3b15b44e86a9} diff --git a/tool_kits/ui_components/ui_components.vcxproj.filters b/ui_components/ui_components.vcxproj.filters similarity index 98% rename from tool_kits/ui_components/ui_components.vcxproj.filters rename to ui_components/ui_components.vcxproj.filters index fb95b759..1ad65660 100644 --- a/tool_kits/ui_components/ui_components.vcxproj.filters +++ b/ui_components/ui_components.vcxproj.filters @@ -129,6 +129,9 @@ 头文件 + + cef_control\util + diff --git a/tool_kits/ui_components/windows_manager/window_ex.cpp b/ui_components/windows_manager/window_ex.cpp similarity index 100% rename from tool_kits/ui_components/windows_manager/window_ex.cpp rename to ui_components/windows_manager/window_ex.cpp diff --git a/tool_kits/ui_components/windows_manager/window_ex.h b/ui_components/windows_manager/window_ex.h similarity index 100% rename from tool_kits/ui_components/windows_manager/window_ex.h rename to ui_components/windows_manager/window_ex.h diff --git a/tool_kits/ui_components/windows_manager/windows_manager.cpp b/ui_components/windows_manager/windows_manager.cpp similarity index 94% rename from tool_kits/ui_components/windows_manager/windows_manager.cpp rename to ui_components/windows_manager/windows_manager.cpp index e7625bda..9243d353 100644 --- a/tool_kits/ui_components/windows_manager/windows_manager.cpp +++ b/ui_components/windows_manager/windows_manager.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "windows_manager.h" -#include "shared/log.h" namespace nim_comp { @@ -26,10 +25,6 @@ bool WindowsManager::RegisterWindow(const std::wstring wnd_class_name, const std if (it != windows_map_.end()) { std::map::iterator it2 = it->second.find(wnd_id); - if (it2 != it->second.end()) - { - QLOG_PRO(L"The window has already registered !") << wnd_class_name << wnd_id; - } it->second[wnd_id] = wnd; } else diff --git a/tool_kits/ui_components/windows_manager/windows_manager.h b/ui_components/windows_manager/windows_manager.h similarity index 100% rename from tool_kits/ui_components/windows_manager/windows_manager.h rename to ui_components/windows_manager/windows_manager.h