diff options
Diffstat (limited to 'CruUI/ui')
-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 |
5 files changed, 99 insertions, 6 deletions
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; |