Pohyb textu spolu s kurzorom myši po Pictureboxe   zodpovězená otázka

VB.NET, WinForms, Grafika

Dobrý deň, mám tento problém. Užívateľ programu si do picture boxu natiahne obrázok do textboxu napíše text. Text treba umiestniť do obrázku na nejaké miesto (väčšinou vždy iné). Najlepšie by bolo text posúvať spolu s kurzorom myši po pictureboxe tak aby nemazal obsah pictureboxu (obrázok, prípadne čiary) pod ním a v momente kliknutia tlačítkom myši ho vložiť do pictureboxu. Nie je problém do pictureboxu vložiť akýkoľvek text zvoleného fontu, farby, veľkosti len neviem realizovať ten pohyb textu s kurzorom myši. Prosil by som o nejaké tipy ktorým smerom sa uberať, prípadne keby mal niekto nejaký ukážkový poríklad niečoho podobného... Ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Smím se zeptat, proč si z PictureBoxu děláte textové pole? K tomu slouží jiné komponenty, například RichTextBox. Není sice úplně ideální, ale měl by na tohle stačit. Psát si vlastní textové pole, to je běh na dlouhou trať a práce na půl roku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechcem robiť z pictureboxu textový editor. Ten textbox je mimo pictureboxu a slúži len na zadanie textu z klávesnice V podstate ide o jednoduchý program kde treba vložiť text a niekedy aj jednoduché čiary do nejakého obrázku a znovu to uložiť ako obrázok čo nie je problém. Len ten text musí byť umiestnený tak aby neprekryl podstatné veci v tom obrázku preto sa to nedá urobiť programove. Umiestňuje ho užívateľ programu a väčšinou je vždy na inom mieste v obrázku. Niečo približne podobné ako je tu jeden článok volá sa to "hromadné vkládaní vodoznaku do obrázku"

Len toto nie je vodoznak a nedá sa to (ani nie je potreba)vkladať hromadne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já bych použil když už nic jinýho tak Zoner Photo Editor (nebo tak nějak se to jmenuje). Kvůli takovýhle věci nemá cenu programovat vlastní program. Určitě existuje spousta free softwaru na tohle "téma".

Tím samozřejmě nechci odrazovat od programování ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Akým spôsobom vkladáte ten text?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Obrázky sú nejaké schémy nie fotografie. Teraz to mám tak že užívateľ klikne na nejaké miesto do pictureboxu získam súradnice e.X e.Y a tam umiestnim text tuším DrawString...... Visual studio mám iba doma a internet iba v práci tak Vám celý príkaz teraz neuvediem. Doteraz to kamarát robí jednoducho cez program Skicár v českých windows sa to asi volá Malování - súčasť OS WIN. Doteraz som robil vo vb4,5,6, z .net iba začínam tak sa chcem niečo naučiť.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ak to trochu pomôže...

Imports System.Drawing
Public Class Form1
    Dim x, y As Integer
    Dim mojText As String
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        e.Graphics.DrawString(mojText, DefaultFont, Brushes.Red, x, y)
    End Sub
    Private Sub TextBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
        Label1.BringToFront()
        Label1.Text = TextBox1.Text
        Timer1.Enabled = True
    End Sub
    Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        x = Cursor.Position.X - Me.Left - PictureBox1.Left - Label1.Width - 4
        y = Cursor.Position.Y - Me.Top - PictureBox1.Top - Label1.Height - 20
        Timer1.Enabled = False
        mojText = Label1.Text
        Me.Refresh()
        Label1.Text = ""
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Left = Cursor.Position.X - Me.Left - Label1.Width - 4
        Label1.Top = Cursor.Position.Y - Me.Top - Label1.Height - 20
    End Sub
End Class

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem večer ihneď vyskúšam...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proč na tohle používáte Timer? To je naprostá blbost, pokud už chcete něco dělat během hýbání myši, využijte událost MouseMove.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobre, nech je po Tvojom. Ďakujem za jadrné upozornenie. Chýba mi názor neregistrovaného.

Imports System.Drawing
Public Class Form1
    Dim x, y As Integer
    Dim mojText As String
    Dim pohyb As Boolean = False
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        e.Graphics.DrawString(mojText, DefaultFont, Brushes.Red, x, y)
    End Sub
    Private Sub TextBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
        pohyb = True
        Label1.BringToFront()
        Label1.Text = TextBox1.Text
    End Sub
    Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        pohyb = False
        x = Cursor.Position.X - Me.Left - PictureBox1.Left - Label1.Width - 4
        y = Cursor.Position.Y - Me.Top - PictureBox1.Top - Label1.Height - 30
        mojText = Label1.Text
        Me.Refresh()
        Label1.Text = ""
    End Sub
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove, Me.MouseMove
        If pohyb = True Then
            Label1.Left = Cursor.Position.X - Me.Left - Label1.Width - 4
            Label1.Top = Cursor.Position.Y - Me.Top - Label1.Height - 30
        End If
    End Sub
End Class

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Včera večer som vyskúšal obidva spôsoby pracujú dobre. Priznám sa simulovať pohyb textu po PB labelom ma nenapadlo. Len pohyb s timerom bol subjektívne trhanejší aj keď som znížil čas obnovy polohy. Teraz chcem urobiť label priehľadný tak som nastavil farbu pozadia labelu na transparent a pridal

label1.parent=picturebox1

Teraz mám síce label priehľadný ale kurzor mysi je nad labelom, čo spôsobuje značne trhaný pohyb. Budem musieť opraviť výpočet polohy labelu voči kurzoru.

Ďakujem za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není třeba průhlednost labelu nastavovat. Jde přece o vložení textu a ne labelu. Label má AutoSize, po nastavení prázdného textu (po klepnutí do PictureBox) zmizí, vloží se pouze font.

Možná by bylo dobré do TextBoxu i Labelu si ve vývoji nastavit vhodný font a ten (přes proměnnou typu Font) v PictureBox1_Paint použít.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokiaľ label nie je priehľadný nevidím čo je pod ním v pictureboxe v prípade že text treba umiestniť napr. tesne nad nejakú vodorovnú čiaru. Inak by to nevadilo nastavil by som back color labelu na back color pictureboxu.........

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kam jste přidal label1.parent=picturebox1? Zkusil jsem to do Form1_Load a jde to to. Sice se nesmí pohybovat myší moc rychle, to se při přesunu text nestačí vykreslovat, ale to přece nevadí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Modifikoval som picturebox1 mouse move a chodí to perfektne

text z labelu je presne na mieste kde sa vykreslí do pictureboxu po kliknutí myšou

Label1.Left = e.X - Label1.Width
Label1.Top = e.Y - Label1.Height

Trhanie je spôsobené tým že pri rýchlom pohybe myši sa kurzor dostane nad label tým sa prestane vykonávať picturebox1 mouse move a vykonáva sa label1 mouse move. Label sa potom na posunie až keď sa kurzor myši dostane znovu nad picturebox čo spôsobí veľký posun labelu a dojem trhnutia.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podobné riešenie bez použitia labelu.

Na forme sú 2 pictureboxy Pbox1 a Pbox2. Prvý je základný kde sa vykreslí nejaká grafika na ukážku som tam dal 4 čiary. Pbox2 leží nad Pbox1 a je priehľadný a slúži na posun textu pri posune textu sa pracuje iba s pbox2 čiže netreba neustále prekreslovať Pbox1.

Private Sub GP_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With PBox2
            .Parent = PBox1
            .BackColor = Color.Transparent
            .BringToFront()
            .Top = 0
            .Left = 0
            .Width = PBox1.Width
            .Height = PBox1.Height
        End With

        Dim G As Graphics
        Dim pero As New Pen(Color.Blue, 2)
        Dim BMP As Bitmap
        BMP = New Bitmap(PBox1.Width, PBox1.Height)
        PBox1.Image = BMP
        G = Graphics.FromImage(BMP)
        G.Clear(PBox1.BackColor)

        G.DrawLine(pero, 10, 10, 300, 300)
        G.DrawLine(pero, 10, 30, 200, 300)
        G.DrawLine(pero, 10, 30, 20, 300)
        G.DrawLine(pero, 10, 30, 250, 400)

End sub

Pri pohybe myši sa presúvaný text umiestni tak že kurzor je vodorovne v strede textu, zvisle pod textom.

   Private Sub PBox2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PBox2.MouseMove

        Dim pismo As New Font("times new roman", 12, FontStyle.Bold, GraphicsUnit.Point, 235)
        Dim textrozmer As SizeF
        Dim g2 As Graphics

        g2 = PBox2.CreateGraphics
        textrozmer = g2.MeasureString("Toto je testovací text", pismo)

        PBox2.Refresh()
        g2.DrawString("Toto je testovací text", New Font("times new roman", 12 * Zoom, FontStyle.Bold + FontStyle.Italic, GraphicsUnit.Point, 235), Brushes.Blue, e.X - textrozmer.Width \ 2, e.Y - textrozmer.Height)


    End Sub

Na rozdiel od predchádzajúceho riešenia s labelom je pohyb plynulý bez trhania presúvaný text však mierne bliká. Pri normálnych veľkostiach to nevadí pri väčších textoch je to dosť viditeľné. Text sa pekne presúva ponad čiary - alebo iný obsah) vykreslený do Pbox1 bez toho že by ich bolo treba neustále prekreslovať.

Neviem či je takéto riešenie správne po programátorskej stránke, preto by som poprosil skúsenejších programátorov o pripomienky (kritiku) k horeuvedenému riešeniu.

Ďakujem.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback