aboutsummaryrefslogtreecommitdiff
path: root/CruUI-Generate/cru_ui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CruUI-Generate/cru_ui.cpp')
-rw-r--r--CruUI-Generate/cru_ui.cpp53
1 files changed, 51 insertions, 2 deletions
diff --git a/CruUI-Generate/cru_ui.cpp b/CruUI-Generate/cru_ui.cpp
index 3036989d..252dfd9a 100644
--- a/CruUI-Generate/cru_ui.cpp
+++ b/CruUI-Generate/cru_ui.cpp
@@ -980,8 +980,24 @@ namespace cru::ui
bool Control::IsPointInside(const Point & point)
{
- const auto size = GetSize();
- return point.x >= 0.0f && point.x < size.width && point.y >= 0.0f && point.y < size.height;
+ if (border_geometry_ != nullptr)
+ {
+ if (IsBordered())
+ {
+ BOOL contains;
+ border_geometry_->FillContainsPoint(Convert(point), D2D1::Matrix3x2F::Identity(), &contains);
+ if (!contains)
+ border_geometry_->StrokeContainsPoint(Convert(point), GetBorderProperty().GetStrokeWidth(), nullptr, D2D1::Matrix3x2F::Identity(), &contains);
+ return contains != 0;
+ }
+ else
+ {
+ BOOL contains;
+ border_geometry_->FillContainsPoint(Convert(point), D2D1::Matrix3x2F::Identity(), &contains);
+ return contains != 0;
+ }
+ }
+ return false;
}
void Control::Draw(ID2D1DeviceContext* device_context)
@@ -1108,6 +1124,7 @@ namespace cru::ui
void Control::InvalidateBorder()
{
+ RegenerateBorderGeometry();
InvalidateLayout();
Repaint();
}
@@ -1275,6 +1292,7 @@ namespace cru::ui
void Control::OnSizeChangedCore(SizeChangedEventArgs & args)
{
+ RegenerateBorderGeometry();
#ifdef CRU_DEBUG_LAYOUT
margin_geometry_ = CalculateSquareRingGeometry(GetRect(RectRange::Margin), GetRect(RectRange::FullBorder));
padding_geometry_ = CalculateSquareRingGeometry(GetRect(RectRange::Padding), GetRect(RectRange::Content));
@@ -1295,6 +1313,32 @@ namespace cru::ui
size_changed_event.Raise(args);
}
+ void Control::RegenerateBorderGeometry()
+ {
+ if (IsBordered())
+ {
+ const auto bound_rect = GetRect(RectRange::HalfBorder);
+ const auto bound_rounded_rect = D2D1::RoundedRect(Convert(bound_rect),
+ GetBorderProperty().GetRadiusX(),
+ GetBorderProperty().GetRadiusY());
+
+ Microsoft::WRL::ComPtr<ID2D1RoundedRectangleGeometry> geometry;
+ ThrowIfFailed(
+ graph::GraphManager::GetInstance()->GetD2D1Factory()->CreateRoundedRectangleGeometry(bound_rounded_rect, &geometry)
+ );
+ border_geometry_ = std::move(geometry);
+ }
+ else
+ {
+ const auto bound_rect = GetRect(RectRange::Padding);
+ Microsoft::WRL::ComPtr<ID2D1RectangleGeometry> geometry;
+ ThrowIfFailed(
+ graph::GraphManager::GetInstance()->GetD2D1Factory()->CreateRectangleGeometry(Convert(bound_rect), &geometry)
+ );
+ border_geometry_ = std::move(geometry);
+ }
+ }
+
void Control::OnMouseEnter(MouseEventArgs & args)
{
}
@@ -2495,6 +2539,11 @@ namespace cru::ui
}
+ bool Window::IsPointInside(const Point& point)
+ {
+ return Rect(Point::Zero(), GetClientSize()).IsPointInside(point);
+ }
+
void Window::WindowInvalidateLayout()
{
if (is_layout_invalid_)