diff options
Diffstat (limited to 'CruUI-Generate/cru_ui.cpp')
| -rw-r--r-- | CruUI-Generate/cru_ui.cpp | 53 | 
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_)  | 
