Напечатайте текст непосредственно на растровом изображении в позиции мыши - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь записать (набрать) непосредственно на растровое изображение. Мне нужно иметь возможность печатать в позиции мыши, поэтому, когда бы я ни щелкал мышью на экране, я мог бы начать печатать текст с клавиатуры.

Вот рабочий код VS VB Win Form, который будет напечатайте "Hello World" в позиции mousedown. Но это работает только с предопределенным текстом. Я хотел бы иметь возможность просто печатать на этом месте. Я чувствую себя так близко, просто не могу заставить его работать.

Imports System.IO
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1

    Dim WithEvents Chart1 As New Chart
    Private Structure TextPoints
        Dim MPos As Point
        Dim Txt As String
    End Structure
    Private TextList As New List(Of TextPoints)
    Private TempPoint As Point
    Private FirstPoint As Point
    Dim xcnt As Integer = -1
    Dim ycnt As Integer = -1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.Size = New Size(1100, 700)
        Me.Location = New Point(10, 10)
        MakeBackImage()
        With Chart1
            .Name = "Chart1"
            .Location = New System.Drawing.Point(40, 40)
            .Size = New System.Drawing.Size(1010, 610)
            .BackImage = "BackImg.jpg"
            .Parent = Me
        End With
    End Sub

    Private Sub Chart1_MouseDown(ByVal sender As Object,
                                 ByVal e As System.Windows.Forms.MouseEventArgs) _
                                 Handles Chart1.MouseDown
        FirstPoint = New Point(e.X, e.Y)
        TempPoint = New Point(e.X, e.Y)
        Me.Refresh()
    End Sub

    Private Sub Chart1_MouseUp(ByVal sender As Object,
                           ByVal e As System.Windows.Forms.MouseEventArgs) _
                           Handles Chart1.MouseUp
        Dim T As New TextPoints With {
            .MPos = TempPoint,
            .Txt = "Hello World"}
        TextList.Add(T)
        Me.Refresh()
    End Sub

    Private Sub MakeBackImage()
        Dim x, y As Integer
        Dim img As Image = New Bitmap(1020, 620)
        Dim graphics As Graphics = Graphics.FromImage(img)
        graphics.Clear(Drawing.Color.White)
        For x = 0 To 1000 Step 20
            graphics.DrawLine(Pens.Black, x, 0, x, 600)
            xcnt += 1
        Next
        For y = 0 To 600 Step 20
            ycnt += 1
            graphics.DrawLine(Pens.Black, 0, y, 1000, y)
        Next
        img.Save("BackImg.jpg", Imaging.ImageFormat.Jpeg)
    End Sub

    Private Sub Chart1_Paint(ByVal sender As Object,
                             ByVal e As System.Windows.Forms.PaintEventArgs) _
                             Handles Chart1.Paint
        Dim drawString As String = "Hello World"
        Dim drawFont As New Font("Arial", 14)
        Dim drawBrush As New SolidBrush(Color.Black)
        For Each t As TextPoints In TextList
            e.Graphics.DrawString(t.Txt, drawFont,
                                  drawBrush, t.MPos.X, t.MPos.Y)
        Next
    End Sub

End Class

Это упрощенный код. На самом деле фоновое изображение создается только один раз, но я добавил код для его динамического создания, чтобы сделать демо лучше.

...