Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсоромC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором

Сообщение Anonymous »

Я делал проект в Visual Studio 2022 на C# в WPF, основанный на методе Коббса для измерения степени сколиоза. По сути, чтобы вы поняли, как я использовал этот метод для кодирования, я сделал следующее: при рисовании двух линий в реальном времени, где они пересекаются, они образуют угол, и этот угол является углом Коббса, который показывает степень сколиоза. . Я пытался понять, как нарисовать вторую красную точку на холсте WPF, чтобы закончить рисование первой линии, поскольку первая и вторая точки определяют, где начинается и заканчивается линия. Проблема в том, что когда я делаю второй щелчок в любом месте холста, но курсор не перемещается, вторая красная точка не рисуется, а только рисуется вторая красная точка, если я нажимаю при перемещении курсора, что очень неудобно для врач пользуется этой программой, и у меня со второй линией происходит то же самое. Однако когда я делаю первый щелчок в любой части холста, не перемещая курсор, в случае первой красной точки, где начинается линия, он ее рисует, и повторяет тот же процесс со второй линией. А в остальном, если все работает отлично, мне просто нужно было знать, есть ли кто-нибудь, кто знал об этом, могли бы вы прокомментировать что-то, что вы знаете, или какой-либо опыт. Спасибо за внимание, ребята.
Я перепробовал все, изменил код, но не знаю, почему мне кажется, что это небольшая ошибка, но я не могу ее найти.< /p>
Я собираюсь оставить здесь код MainWindow.xaml.cs:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace CobbAngleMeasurement
{
public partial class MainWindow : Window
{
private Point? startPoint = null;
private Point? endPoint = null;
private Point? secondStartPoint = null;
private Point? secondEndPoint = null;
private Point? currentPoint = null;
private bool drawingFirstLine = true;
private int lineCount = 0;

public MainWindow() {
InitializeComponent();
}

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
if (lineCount >= 2)
{
startPoint = null;
endPoint = null;
secondStartPoint = null;
secondEndPoint = null;
lineCount = 0;
canvas.Children.Clear();
}

if (drawingFirstLine)
{
if (!startPoint.HasValue)
{
startPoint = e.GetPosition(canvas);
DrawPoint(startPoint.Value);
}
else
{
endPoint = e.GetPosition(canvas);
drawingFirstLine = false;
lineCount++;
DrawPoint(endPoint.Value);
DrawLine(startPoint.Value, endPoint.Value);
}
}
else
{
if (!secondStartPoint.HasValue)
{
secondStartPoint = e.GetPosition(canvas);
DrawPoint(secondStartPoint.Value);
}
else
{
secondEndPoint = e.GetPosition(canvas);
drawingFirstLine = true;
lineCount++;
DrawPoint(secondEndPoint.Value);
DrawLine(secondStartPoint.Value, secondEndPoint.Value);
}
}
currentPoint = null;
e.Handled = true;

// Asegúrate de que el evento se maneje correctamente
}

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (startPoint.HasValue && !endPoint.HasValue)
{
currentPoint = e.GetPosition(canvas);
canvas.Children.Clear();
DrawAllElements();
DrawLine(startPoint.Value, currentPoint.Value);
}
else if (secondStartPoint.HasValue && !secondEndPoint.HasValue)
{
currentPoint = e.GetPosition(canvas);
canvas.Children.Clear();
DrawAllElements();
DrawLine(secondStartPoint.Value, currentPoint.Value);
if (startPoint.HasValue && endPoint.HasValue)
{
float intersectionAngle = CalculateIntersectionAngle(startPoint.Value, endPoint.Value, secondStartPoint.Value, currentPoint.Value);
DrawAngle(intersectionAngle, secondStartPoint.Value);
}
}e.Handled = true;
// Asegúrate de que el evento se maneje correctamente
}

private void Canvas_MouseEnter(object sender, MouseEventArgs e)
{
this.Cursor = Cursors.Cross;
}

private void Canvas_MouseLeave(object sender, MouseEventArgs e)
{
this.Cursor = Cursors.Arrow;
}

private void btnCalculateAngle_Click(object sender, RoutedEventArgs e)
{
if (startPoint.HasValue && endPoint.HasValue && secondStartPoint.HasValue && secondEndPoint.HasValue)
{
float intersectionAngle = CalculateIntersectionAngle(startPoint.Value, endPoint.Value, secondStartPoint.Value, secondEndPoint.Value);
MessageBox.Show($"El ángulo de intersección es: { intersectionAngle:F2} grados", "Ángulo Calculado", MessageBoxButton.OK, MessageBoxImage.Information);
}
else
{
MessageBox.Show("Por favor, dibuje ambas líneas antes de calcular el ángulo.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

private void DrawLine(Point p1, Point p2)
{
Line line = new Line { X1 = p1.X,Y1 = p1.Y,X2 = p2.X,Y2 = p2.Y,Stroke = Brushes.Red,StrokeThickness = 2} ;
canvas.Children.Add(line);
}

private void DrawPoint(Point p)
{
Ellipse ellipse = new Ellipse { Fill = Brushes.Red,Width = 6,Height = 6} ;
Canvas.SetLeft(ellipse, p.X - 3);
Canvas.SetTop(ellipse, p.Y - 3);
canvas.Children.Add(ellipse);
}

private void DrawAllElements()
{
if (startPoint.HasValue)
{
DrawPoint(startPoint.Value);
}
if (endPoint.HasValue)
{
DrawPoint(endPoint.Value);
DrawLine(startPoint.Value, endPoint.Value);
}
if (secondStartPoint.HasValue)
{
DrawPoint(secondStartPoint.Value);
}
if (secondEndPoint.HasValue)
{
DrawPoint(secondEndPoint.Value);
DrawLine(secondStartPoint.Value, secondEndPoint.Value);
}
}

private void btnClear_Click(object sender, RoutedEventArgs e)
{
startPoint = null;
endPoint = null;
secondStartPoint = null;
secondEndPoint = null;
lineCount = 0;
canvas.Children.Clear();
}

private void DrawAngle(float angle, Point position)
{
TextBlock angleText = new TextBlock
{
Text = $" { angle:F2} °",Foreground = Brushes.Red,FontWeight = FontWeights.Bold};
Canvas.SetLeft(angleText, position.X + 10);
Canvas.SetTop(angleText, position.Y - 20);
canvas.Children.Add(angleText);

if (angleTextBlock != null)
{
angleTextBlock.Text = $" { angle:F2} °";
}
}

private float CalculateAngle(Point p1, Point p2)
{
double deltaY = p2.Y - p1.Y;
double deltaX = p2.X - p1.X;
return (float)(Math.Atan2(deltaY, deltaX) * (180.0 / Math.PI));
}

private float CalculateIntersectionAngle(Point p1, Point p2, Point p3, Point p4)
{
float angle1 = CalculateAngle(p1, p2);
float angle2 = CalculateAngle(p3, p4);
float intersectionAngle = Math.Abs(angle1 - angle2);

if (intersectionAngle >= 90)
{
intersectionAngle = 180 - intersectionAngle;
}
if (intersectionAngle < 0)
{
intersectionAngle = -intersectionAngle;
}

if (intersectionAngle == 90)
{
return 90;
}

if (intersectionAngle > 90)
{
intersectionAngle = 180 - intersectionAngle;
}

return intersectionAngle;
}
}
}

Код MainWindow.xaml:















Подробнее здесь: https://stackoverflow.com/questions/790 ... r-inactive
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором
    Anonymous » » в форуме C#
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Как нарисовать точку на холсте WPF Visual Studio 2022 с неактивным курсором
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»