diff options
author | crupest <crupest@outlook.com> | 2018-09-22 00:17:53 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-09-22 00:17:53 +0800 |
commit | e01800206050a0ed88cc4f4456fa3590021ab66f (patch) | |
tree | aaa6118d614ead6cd1865e4b2d160cade91d8057 | |
parent | 89f7277d47cd37f25a141ec2ebc13c4f6fceabd5 (diff) | |
download | cru-e01800206050a0ed88cc4f4456fa3590021ab66f.tar.gz cru-e01800206050a0ed88cc4f4456fa3590021ab66f.tar.bz2 cru-e01800206050a0ed88cc4f4456fa3590021ab66f.zip |
Add button.
-rw-r--r-- | CruUI/CruUI.vcxproj | 2 | ||||
-rw-r--r-- | CruUI/CruUI.vcxproj.filters | 6 | ||||
-rw-r--r-- | CruUI/main.cpp | 30 | ||||
-rw-r--r-- | CruUI/ui/control.cpp | 29 | ||||
-rw-r--r-- | CruUI/ui/control.h | 5 | ||||
-rw-r--r-- | CruUI/ui/controls/button.cpp | 33 | ||||
-rw-r--r-- | CruUI/ui/controls/button.h | 36 | ||||
-rw-r--r-- | CruUI/ui/window.cpp | 2 |
8 files changed, 127 insertions, 16 deletions
diff --git a/CruUI/CruUI.vcxproj b/CruUI/CruUI.vcxproj index b1402f7a..78e24f9b 100644 --- a/CruUI/CruUI.vcxproj +++ b/CruUI/CruUI.vcxproj @@ -164,6 +164,7 @@ <ClInclude Include="ui\animations\animation.h" /> <ClInclude Include="ui\control.h" /> <ClInclude Include="global_macros.h" /> + <ClInclude Include="ui\controls\button.h" /> <ClInclude Include="ui\controls\linear_layout.h" /> <ClInclude Include="ui\controls\text_block.h" /> <ClInclude Include="ui\controls\toggle_button.h" /> @@ -177,6 +178,7 @@ <ClCompile Include="base.cpp" /> <ClCompile Include="exception.cpp" /> <ClCompile Include="ui\animations\animation.cpp" /> + <ClCompile Include="ui\controls\button.cpp" /> <ClCompile Include="ui\layout_base.cpp" /> <ClCompile Include="main.cpp" /> <ClCompile Include="graph\graph.cpp" /> diff --git a/CruUI/CruUI.vcxproj.filters b/CruUI/CruUI.vcxproj.filters index b41bcb9f..f1cbe6e9 100644 --- a/CruUI/CruUI.vcxproj.filters +++ b/CruUI/CruUI.vcxproj.filters @@ -69,6 +69,9 @@ <ClInclude Include="ui\animations\animation.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="ui\controls\button.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="application.cpp"> @@ -116,5 +119,8 @@ <ClCompile Include="base.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="ui\controls\button.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> </Project>
\ No newline at end of file diff --git a/CruUI/main.cpp b/CruUI/main.cpp index 65e63af9..9cd566ab 100644 --- a/CruUI/main.cpp +++ b/CruUI/main.cpp @@ -3,6 +3,7 @@ #include "ui/controls/linear_layout.h" #include "ui/controls/text_block.h" #include "ui/controls/toggle_button.h" +#include "ui/controls/button.h" using cru::String; @@ -14,6 +15,7 @@ using cru::ui::LayoutLength; using cru::ui::controls::LinearLayout; using cru::ui::controls::TextBlock; using cru::ui::controls::ToggleButton; +using cru::ui::controls::Button; int APIENTRY wWinMain( @@ -82,20 +84,28 @@ int APIENTRY wWinMain( layout->AddChild(TextBlock::Create(L"Layout is clicked!")); }); - const auto inner_layout = LinearLayout::Create(LinearLayout::Orientation::Horizontal); - inner_layout->GetLayoutParams()->width.alignment = Alignment::End; + { + const auto inner_layout = LinearLayout::Create(LinearLayout::Orientation::Horizontal); + inner_layout->GetLayoutParams()->width.alignment = Alignment::End; - layout->AddChild(inner_layout); + layout->AddChild(inner_layout); - inner_layout->AddChild(TextBlock::Create(L"Toggle debug border")); + inner_layout->AddChild(TextBlock::Create(L"Toggle debug border")); - const auto toggle_button = ToggleButton::Create(); - toggle_button->toggle_event.AddHandler([&window](cru::ui::events::ToggleEventArgs& args) - { - window.SetDebugDrawControlBorder(args.GetNewState()); - }); + const auto toggle_button = ToggleButton::Create(); + toggle_button->toggle_event.AddHandler([&window](cru::ui::events::ToggleEventArgs& args) + { + window.SetDebugDrawControlBorder(args.GetNewState()); + }); - inner_layout->AddChild(toggle_button); + inner_layout->AddChild(toggle_button); + } + + { + const auto button = Button::Create(); + button->AddChild(TextBlock::Create(L"button")); + layout->AddChild(button); + } auto&& create_text_block = [](const String& text, const LayoutLength& width = LayoutLength::Content(), const LayoutLength& height = LayoutLength::Content()) { diff --git a/CruUI/ui/control.cpp b/CruUI/ui/control.cpp index 2f5a7ef8..bfe3f7a7 100644 --- a/CruUI/ui/control.cpp +++ b/CruUI/ui/control.cpp @@ -382,8 +382,14 @@ namespace cru { void Control::OnMouseLeaveCore(MouseEventArgs & args) { is_mouse_inside_ = false; - for (auto& is_mouse_leave : is_mouse_leave_) - is_mouse_leave.second = true; + for (auto& is_mouse_click_valid : is_mouse_click_valid_map_) + { + if (is_mouse_click_valid.second) + { + is_mouse_click_valid.second = false; + OnMouseClickEnd(is_mouse_click_valid.first); + } + } } void Control::OnMouseMoveCore(MouseEventArgs & args) @@ -393,13 +399,18 @@ namespace cru { void Control::OnMouseDownCore(MouseButtonEventArgs & args) { - is_mouse_leave_[args.GetMouseButton()] = false; + is_mouse_click_valid_map_[args.GetMouseButton()] = true; + OnMouseClickBegin(args.GetMouseButton()); } void Control::OnMouseUpCore(MouseButtonEventArgs & args) { - if (!is_mouse_leave_[args.GetMouseButton()]) + if (is_mouse_click_valid_map_[args.GetMouseButton()]) + { + is_mouse_click_valid_map_[args.GetMouseButton()] = false; RaiseMouseClickEvent(args); + OnMouseClickEnd(args.GetMouseButton()); + } } void Control::OnMouseClickCore(MouseButtonEventArgs& args) @@ -449,6 +460,16 @@ namespace cru { mouse_click_event.Raise(args); } + void Control::OnMouseClickBegin(MouseButton button) + { + + } + + void Control::OnMouseClickEnd(MouseButton button) + { + + } + void Control::OnGetFocus(FocusChangeEventArgs& args) { diff --git a/CruUI/ui/control.h b/CruUI/ui/control.h index 7b66ea57..44fbdfba 100644 --- a/CruUI/ui/control.h +++ b/CruUI/ui/control.h @@ -265,6 +265,9 @@ namespace cru void RaiseMouseUpEvent(events::MouseButtonEventArgs& args); void RaiseMouseClickEvent(events::MouseButtonEventArgs& args); + virtual void OnMouseClickBegin(MouseButton button); + virtual void OnMouseClickEnd(MouseButton button); + //*************** region: focus event *************** virtual void OnGetFocus(events::FocusChangeEventArgs& args); virtual void OnLoseFocus(events::FocusChangeEventArgs& args); @@ -315,7 +318,7 @@ namespace cru bool is_mouse_inside_ = false; - std::unordered_map<MouseButton, bool> is_mouse_leave_ + std::unordered_map<MouseButton, bool> is_mouse_click_valid_map_ { { MouseButton::Left, true }, { MouseButton::Middle, true }, diff --git a/CruUI/ui/controls/button.cpp b/CruUI/ui/controls/button.cpp new file mode 100644 index 00000000..b7614f93 --- /dev/null +++ b/CruUI/ui/controls/button.cpp @@ -0,0 +1,33 @@ +#include "button.h" + +#include "graph/graph.h" + +namespace cru::ui::controls +{ + using graph::CreateSolidBrush; + + Button::Button() : Control(true) + { + normal_border_brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::RoyalBlue)); + pressed_border_brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::MediumBlue)); + current_border_brush_ = normal_border_brush_.Get(); + } + + void Button::OnDraw(ID2D1DeviceContext* device_context) + { + Control::OnDraw(device_context); + device_context->DrawRoundedRectangle(D2D1::RoundedRect(D2D1::RectF(0, 0, GetSize().width, GetSize().height), 6, 6), current_border_brush_, 2); + } + + void Button::OnMouseClickBegin(MouseButton button) + { + current_border_brush_ = pressed_border_brush_.Get(); + Repaint(); + } + + void Button::OnMouseClickEnd(MouseButton button) + { + current_border_brush_ = normal_border_brush_.Get(); + Repaint(); + } +} diff --git a/CruUI/ui/controls/button.h b/CruUI/ui/controls/button.h new file mode 100644 index 00000000..f9ad7726 --- /dev/null +++ b/CruUI/ui/controls/button.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ui/control.h" + +namespace cru::ui::controls +{ + class Button : public Control + { + public: + static Button* Create() + { + return new Button(); + } + + protected: + Button(); + + public: + Button(const Button& other) = delete; + Button(Button&& other) = delete; + Button& operator=(const Button& other) = delete; + Button& operator=(Button&& other) = delete; + ~Button() override = default; + + protected: + void OnDraw(ID2D1DeviceContext* device_context) override; + + void OnMouseClickBegin(MouseButton button) override final; + void OnMouseClickEnd(MouseButton button) override final; + + private: + Microsoft::WRL::ComPtr<ID2D1Brush> normal_border_brush_; + Microsoft::WRL::ComPtr<ID2D1Brush> pressed_border_brush_; + ID2D1Brush* current_border_brush_; + }; +} diff --git a/CruUI/ui/window.cpp b/CruUI/ui/window.cpp index 21528d9d..b20abb61 100644 --- a/CruUI/ui/window.cpp +++ b/CruUI/ui/window.cpp @@ -16,7 +16,7 @@ namespace cru WNDCLASSEX window_class; window_class.cbSize = sizeof(WNDCLASSEX); - window_class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + window_class.style = CS_HREDRAW | CS_VREDRAW; window_class.lpfnWndProc = window_proc; window_class.cbClsExtra = 0; window_class.cbWndExtra = 0; |