zdjęcia remisu Picture Box na myszy, przeciągając przy użyciu C#jak rysować rysunki w oknie obrazu
Odpowiedz
Można to zrobić poprzez uchwycenie mouseMove wydarzenie pole obrazu następnie dostać grafiki z obrazka polu podobnego.
Grafika g = pictureBox.CreateGraphics(); następnie możesz narysować, co chcesz, aby narysować za pomocą tego obiektu graficznego
Umieść PictureBox w formularzu i ustaw jego kolor BackColor na biały. Następnie dodać ten kod do formularza (trzeba faktycznie spięcie zdarzeń myszy poniżej, to znaczy, że nie można po prostu skopiować i wkleić ten kod do formularza):
private Point? _Previous = null;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
_Previous = e.Location;
pictureBox1_MouseMove(sender, e);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_Previous != null)
{
if (pictureBox1.Image == null)
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.White);
}
pictureBox1.Image = bmp;
}
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
g.DrawLine(Pens.Black, _Previous.Value, e.Location);
}
pictureBox1.Invalidate();
_Previous = e.Location;
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
_Previous = null;
}
A potem odciągnąć!
Jeśli chcesz, możesz nieco poprawić jakość narysowanego obrazu, ustawiając właściwość obiektu Graphics
obiektu SmoothingMode
.
Aktualizacja: Net CF nie podlega programowi zbierania Pens
i MoustEventArgs
nie posiada Location
, więc o to CF Wersja:
private Point? _Previous = null;
private Pen _Pen = new Pen(Color.Black);
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
_Previous = new Point(e.X, e.Y);
pictureBox1_MouseMove(sender, e);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_Previous != null)
{
if (pictureBox1.Image == null)
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.White);
}
pictureBox1.Image = bmp;
}
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
g.DrawLine(_Pen, _Previous.Value.X, _Previous.Value.Y, e.X, e.Y);
}
pictureBox1.Invalidate();
_Previous = new Point(e.X, e.Y);
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
_Previous = null;
}
dziękuję za pomoc, ale mam błąd, który nie zna długopisów i e.location – Gold
@Gold: po prostu dodano wersję tej metody zgodną z CF, ponieważ CF nie ma kolekcji długopisów, a MouseEventArgs nie ma Lokalizacja (tylko X i Y). – MusiGenesis
+1 za długą, szczegółową odpowiedź na krótkie, niezbyt dobrze sformułowane pytanie. :) – JYelton
Tutaj pictureBox1 == podpis . Przetłumaczyłem VB w ten sposób:
Globalny:
Dim _previous As Point = Nothing
Dim _pen As Pen = New Pen(Color.Black)
Dim drawing As Boolean = False
''' <summary>
''' This handles the signature drawing events (drawing)
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub signature_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseMove
If drawing = True Then
If signature.Image Is Nothing Then
Dim bmp As Bitmap = New Bitmap(signature.Width, signature.Height)
Using g As Graphics = Graphics.FromImage(bmp)
g.Clear(Color.White)
End Using
signature.Image = bmp
End If
Using g As Graphics = Graphics.FromImage(signature.Image)
g.DrawLine(_pen, _previous.X, _previous.Y, e.X, e.Y)
End Using
signature.Invalidate()
_previous = New Point(e.X, e.Y)
End If
End Sub
''' <summary>
''' this indicates somebody is going to write a signature
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub signature_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseDown
_previous = New Point(e.X, e.Y)
drawing = True
signature_MouseMove(sender, e)
End Sub
''' <summary>
''' the signature is done.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub signature_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseUp
_previous = Nothing
drawing = False
End Sub
- 1. Wyświetlanie obrazu .png w oknie wxPython
- 2. Jak rysować/zarządzać siatką sześciokątną?
- 3. Lokalizacja i rysunki
- 4. Jak rysować wiele kostek w OpenGL
- 5. Android Robilesmake i wektorowe rysunki
- 6. Jak rysować linie za pomocą XNA?
- 7. Jak rysować poza elementem canvas HTML?
- 8. Jak rysować tekst z konturem na obrazy?
- 9. Bardzo prosty D3: jak rysować łuk?
- 10. jak rysować na płótnie przeczytać json?
- 11. Jak konsekwentnie rysować NSAttributedString w UITextView w UITableViewCell
- 12. X11: Rysuj nakładkę/Usuń rysunki z nakładki
- 13. Jak ręcznie rysować wykres kołowy w systemie Android?
- 14. Jak rysować grafiki w języku C# bez formularza
- 15. Jak używać obrazów wektorowych Xaml jako źródła obrazu w oknie 8 app
- 16. Z "obrazem" w oknie kanału na Facebooku nieaktualne, jak mogę opublikować link do obrazu?
- 17. Zmiana koloru pojedynczego losowania w RecyclerView zmieni wszystkie rysunki.
- 18. Gdzie znajdują się rysunki ikon Androida w pakiecie SDK?
- 19. Czy mogę rysować poza obszarem Androida Canvas
- 20. Jak wyszukiwać obrazy z prywatnego rejestru 1.0 w oknie dokowanym?
- 21. Jak uzyskać spplot (kratownicę), aby nie rysować obramowań wokół wielokątów?
- 22. Wolno rysować palcami na Google Map
- 23. Jak rysować kwadraty i dynamicznie przypisywać właściwość koloru (PDFsharp)?
- 24. Jak rysować w RStudio i nie ma nowego okna wyskakującego (Grafika R: Urządzenie (AKTYWNE)?
- 25. Jak renderować/rysować obiekt bufora do bufora ramki bez glDrawPixels
- 26. Mydło w oknie SoapUI
- 27. Serwer proxy w oknie
- 28. Jak wyświetlać odpowiednią ikonę w oknie dialogowym?
- 29. Jak skutecznie przewijać obraz 1024x90000 w oknie?
- 30. Jak otworzyć status magit w pełnym oknie
Eeeeep, Boże, nie! Dostaniesz w ten sposób migotliwą grafikę, jedyną użytecznością dla .CreateGraphics(), o której wiem, jest pomiar ciągów. Zamiast tego chcesz zastąpić OnPaint. – Quibblesome
lub użyj właściwości .Image. Jeśli mamy zamiar wykonać rysunek niestandardowy, to całkowicie zabiję go i odziedziczę po Control. – Quibblesome