Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [VB6] - textheight & textwidth

    salve ragazzi, ciao modereatori,

    allora... sto uscendo matto.
    Dovendo disegnare le quote sui bordi di un rettangolo in una picture,
    sto lavorando al posizionamento del testo.

    Ho impostato il seguente sistema di coordinate

    '-------------------------------------------------------------------
    Lx = 500
    Ly = 2000

    With Picture1
    .Cls
    .AutoRedraw = True

    .Width = 400
    .Height = 400

    margine = 0.5 * Picture1.Height 'Distanza dai margini = % dell'altezza della picture

    .ScaleWidth = Ly + margine
    .ScaleHeight = -(Ly + margine)

    .ScaleLeft = -.ScaleWidth / 2
    .ScaleTop = -.ScaleHeight / 2

    End With
    '-------------------------------------------------------------------

    Con

    picture1.currentX = 0
    picture1.currentY = 0
    picture1.print "quota"

    posiziono l'angolo in alto a sinistra della scritta "quote" nell'origine 0,0 del sistema di riferimento.

    se volessi posizionare invece dell'angolo superiore sinistro il centro della scritta "quota" scriverei:


    picture1.currentX = -TextWidth ("quota")/2
    picture1.currentY = 0
    picture1.print "quota"


    Il problema è che il testo "quota" non si sposta a metà, ma solo di un pezzettino.
    Credo che il problema sia su come si gestiscono le unità all'interno della picture ma non c'ho capito nulla.....
    sto provando ad usare

    ScaleX (textwidth("quota"), vbUser, vbTwips)

    o

    ScaleX (textwidth("quota"), vbPoints, vbTwips)

    ma senza alcun risultato.

    L'impostazione del sistema di riferimento cambia il modo di gestire le unità ma
    quando vado a spostare a sinistra con currentX il testo "quota" a metà della sua larghezza
    questo non si posiziona perfettamente a metà !!!

    Qualcuno può aiutarmi ?
    dove sto sbagliando ???
    grazie anticipatamente

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Per centrare devi calcolare il centro rispetto a 'qualcosa', nello specifico il 'qualcosa' è
    Picture1.ScaleWidth

    Fai così:

    codice:
    Picture1.CurrentX = (Picture1.ScaleWidth - Picture1.TextWidth("Quota")) / 2
    Picture1.Print "Quota"
    Ciao

  3. #3
    ciao gibra,
    intanto grazie per aver risposto.

    Allora, ho i seguenti dati:

    picture1.width = 2302.5
    Picture1.TextWidth(Testo_quota) = 104.4613

    l'asse delle Y del sistema di riferimento nella picure coincide con la mezzeria della picture,
    mentre l'asse X si trova poco sopra la mezzeria (diciamo a 1/4 della altezza della picture, a partire dall'altro).

    Se applico la formula che hai scritto, ho :

    Picture1.ScaleWidth - Picture1.TextWidth(Testo_quota)) / 2 =
    = ( 2302.5 - 104.46 ) / 2 = 2198.04 / 2 = 1099.02

    Significa che il .CurrentX punta quasi al margine destro della picture1.
    Ma anche se scrivo direttamente:

    picture1.CurrentX = - Picture1.TextWidth(Testo_quota) / 2

    "Testo_quota" non si posiziona nemmeno dove dovrebbe andare!!
    azz.....

  4. #4
    ho provato a creare una nuova picture (picture2) nella stessa form
    nella quale sto lavorando e inserire questo codice:


    '----------------------------------------------------------------
    Dim r As String
    With Picture2
    .Cls ' Cancella la picture
    .AutoRedraw = True
    '.Width = 400
    '.Height = 400
    '.ScaleWidth = Ly + margine
    '.ScaleHeight = -(Ly + margine) 'cioè Tutta la lunghezza del circuito + una percentuale
    .ScaleLeft = -.ScaleWidth / 2
    .ScaleTop = -.ScaleHeight / 2
    End With

    Picture2.DrawWidth = 2 'disegna un punto nell'origine
    Picture2.PSet (0, 0)
    r = Trim("PACO")
    Picture2.CurrentX = -TextWidth(r)
    Picture2.CurrentY = 0
    Picture2.Print r
    '----------------------------------------------------------------


    Questo funziona correttamente!!!

    Forse sto arginando l'nghippo!!!
    Sto usando le API (come suggerito da oregon in un altro post)
    per poter ruotare un testo col metodo print in una picturebox e riporto il codice che ho usato:


    '----------------------------------------------------------------
    '[in un modulo]
    Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
    Public Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
    Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

    Public Const LF_FACESIZE = 32
    Public Type LOGFONT
    lfHeight As Long
    lfWidth As Long
    lfEscapement As Long
    lfOrientation As Long
    lfWeight As Long
    lfItalic As Byte
    lfUnderline As Byte
    lfStrikeOut As Byte
    lfCharSet As Byte
    lfOutPrecision As Byte
    lfClipPrecision As Byte
    lfQuality As Byte
    lfPitchAndFamily As Byte
    lfFacename As String * LF_FACESIZE
    End Type


    '[nella stessa form]
    Dim Font As LOGFONT
    Dim prevFont As Long, hFont As Long, ret As Long
    Dim tipo_font As String

    tipo_font = "Arial" & Chr$(0)


    Picture1.ForeColor = QBColor(2) 'Colore del font

    FontSize = Zm * 50 ' Altezzafont
    Font.lfFacename = tipo_font 'Imposta il font

    (*) Font.lfEscapement = 900 ' Rotazione (= 0-3600; es. 1800 = 180 gradi)

    Font.lfHeight = (FontSize * -10) / Screen.TwipsPerPixelY

    hFont = CreateFontIndirect(Font)
    prevFont = SelectObject(Picture1.hDC, hFont)

    Testo_quota = Trim("PACO")

    (**) Picture1.CurrentX = Picture1.TextHeight(Testo_quota)
    Picture1.CurrentY = -Picture1.TextWidth(Testo_quota) / 2

    Picture1.Print Testo_quota

    ret = SelectObject(Picture1.hDC, prevFont)
    ret = DeleteObject(hFont)


    '----------------------------------------------------------------

    Il testo è ruotato di 90 gradi (riga *)
    nella riga ** se io inserisco il codice come riportato allora il testo vien posizionato correttamente al centro del sistema di riferimento 0,0, ossia non dividendo per due la textheight.

    Su CurrentY funziona mentre su CurrentX no! non riesco a fargli posizionare la mezzeria del testo nellorigine.
    Non ancora capisco perche!!

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Scusa ma mi sa che stai facendo un bel po' di confusione.

    - Apri un nuovo progetto
    - aggiungi un pictureBox sul form, senza impostare alcunchè
    - prova il mio codice

    vedrai che funziona, e nel caso avessi dubbi sappi che, come faccio sempre, il codice che posto prima lo testo.

    Ciao

    P.S.
    Solo adesso 'scopro' che vuoi anche ruotare il testo!
    Allora la faccenda è completamente diversa.

  6. #6
    gibra
    non ho mai detto che il codice che posti non funziona, anzi
    ti sono grato perche mi stai dando una mano.

    Infatti, il fatto che debba ruotare la label complica la situazione.

    Allora, ho abbandonato la tecnica delle API, perchè non riuscivo a gestire il centramento.
    Ho risolto cosi:


    1 - Ho aggiunto al progetto il controllo "RotateLabeVer2.ocx" che al suo interno ha il metodo lfEscapement che permette di ruotare di un angolo qualsiasi.

    2 - ho inserito sulla picture una label di questo control

    3 - inserito il seguente codice:

    With RotLabel1(0)
    .Font = tipo_font
    .Font.Size = alt_font
    .Escapement = 90 'rotazione
    .Caption = quota
    .Width = Zm * TextHeight(.Caption) * 8
    .Height = Zm * TextWidth(.Caption) * 8
    .Left = Xp10 - v - qo - .Width
    .Top = Yp10 + Abs(Yp10 - Yp1) / 2 + .Height / 2
    End With

    dove:
    tipo_font = "arial"
    alt_font = 12
    quota = [differenza tra coordinate orizz o vert]
    xp10, yp10, yp1 = coordinate delle quote
    v = distanza della quota dal bordo del rettangolo
    qo = distanza tra la quota e la linea principale disegnata delle quota


    Che ne pensi?

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Cosa ne penso ?
    Non saprei... Io non posso vedere quello che vedi tu, quindi non saprei proprio cosa dirti.
    Si potrebbe dire che se ti funziona... allora va bene.

    Però con la CreateFontIndirect c'eri ormai vicino.
    Da quello che vedo, devi impostare l'OCX tanto quanto impostavi i membri LOGFONT, quindi in sostanza non cambia molto.

    Il fatto è che io probabilmente non ho ancora capito cosa ti serve in pratica.

    A parte il fatto di stampare il testo in verticale (e qui ci siamo arrivati), mi sfugge perchè tu imposti le coordinate di scala 0,0 al centro del picturebox, non so quante etichette devi stampare, dove, ecc.

    Ti posto un'immagine di una prova che ho fatto, utilizzando il tuo codice (in modo parziale perchè alcuni dati io non li ho, poi ho fatto qualche piccola correzione).

    Per comodità ho disegnato anche le linee all'incrocio delle coordinate 0,0, in modo da avere un riferimento ottico preciso.

    Prova a postare tu un'immagine di cosa devi realizzare.

    Non è comunque difficile quello che vuoi fare, ad esempio guarda questa DLL che ho creato per subclassare i menu, in cui è possibile scrivere in verticale (anche con caratteri ruotati!) senza problemi.
    http://www.vbcorner.net/ita/menuextended.html

    Ciao
    Immagini allegate Immagini allegate

  8. #8
    Usando le API il problema che incontravo era proprio quello del centraggio, insomma mi sono incartato.

    Alla fine ho usato RotateLablVer2.ocx. L'unica cosa è che questa control non ha l'autosize, quindi faccio un po' di fatica ad adattare le dimensioni .width e .height al testo (in pratica c'è sempre quel bordino indorno, che si vede anche nella tua immagine postata) e che non mi piace tanto.
    Comunque ti posto la schermata che ottengo. Ho evidenziato con lo sfondo giallo le label dei testi cosi si possono vedere i limite del margine intorno.
    I puntini rossi sono punti di controllo e vanno dimensionati.
    La riga blu passa per il centro della picture, mentre l'altra quella verde sopra, passa per l'origine del sistema che avevo impostato (e che m'ha fatto dannare...perchè potevo prendere il centro della picture...ma ora è fatta, pazienza !!!).
    Immagini allegate Immagini allegate

  9. #9
    ti riporto il codice che gesisce la dimensione:

    '---------------------------------------------------------
    Call Quota("v", Xp8 + v, Yp8, Xp7 + v, Yp7, m, p, 1, 12, 3, 4, 1, 12)
    With RotLabel1(1)
    .Font = tipo_font
    .Font.Size = Zm * alt_font
    .Escapement = 90 'rotazione
    .Caption = Format(LTrim(Abs(Yp8 - Yp7) / Zm / 10), "#.0")
    .Width = Zm * TextHeight(.Caption) * 8
    .Height = Zm * TextWidth(.Caption) * 8
    .Left = Xp8 + v + qo
    .Top = Yp8 + Abs(Yp8 - Yp7) / 2 + .Height / 2
    End With
    '----------------------------------------------------------

    e varia a seconda se la dimensione è verticale o orizzontale.
    Le proprietà .width e .heigth vengono proporzionate in base alla caption della label e moltiplicate per 8 (qua non riesco a trovare un'altra soluzione, noin riesco a farle coincidere esattamente col testo della label)

    La call iniziale è questa:
    '----------------------------------------------------------
    'DISEGNA LA DIMENSIONI
    Private Sub Quota(orientamento As String, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, m As Single, p As Single, _
    sp1 As Integer, col1 As Integer, sp2 As Integer, col2 As Integer, sp3 As Integer, col3 As Integer)

    Dim mv As Single
    Dim pv As Single

    Dim mo As Single
    Dim po As Single


    'orientamento = "verticale" o "orizzontale"
    'X1, Y1 = coordinate primo punto (in basso per le verticali, a sinistra per le orizzontali)
    'X2, Y2 = secondo punto
    'a = sporgenza dei marcatori
    'b = sporgenza - prolungamento linea principale
    'v = distanza dal bordo (positivo se a destra del disegno, negativo se a sinistra)
    'q = distanza del testo della quota dalla linea principale
    'sp1 = spessore linea principale
    'sp2 = spessore linea marcatore
    'sp3 = spessore sporgenza - prolungamento linea principale
    'col1 = colore linea principale
    'col2 = colore marcatore perpendicolare
    'col3 = colore pezzetto sporgente

    Select Case orientamento

    Case "v" 'verticale

    mv = Zm * m ' lunghezza marcatore
    pv = Zm * p ' prolungamento della lina principale

    'linea principale
    Picture1.DrawWidth = sp1
    Picture1.Line (X1, Y1 - pv)-(X2, Y2 + pv), QBColor(col1) 'linea principale

    'linea marcatore punto 1
    Picture1.DrawWidth = sp2
    Picture1.Line (X1 - mv, Y1)-(X1 + mv, Y1), QBColor(col2)

    'linea marcatore punto 2
    Picture1.DrawWidth = sp2
    Picture1.Line (X2 - mv, Y2)-(X2 + mv, Y2), QBColor(col2)


    Case "o" 'orizzontale
    mo = Zm * m ' lunghezza marcatore
    po = Zm * p ' prolungamento linea principale

    'linea principale
    Picture1.DrawWidth = sp1
    Picture1.Line (X1 - po, Y1)-(X2 + po, Y2), QBColor(col1) 'linea principale

    'linea marcatore punto 1
    Picture1.DrawWidth = sp2
    Picture1.Line (X1, Y1 - mo)-(X1, Y1 + mo), QBColor(col2)

    'linea marcatore punto 2
    Picture1.DrawWidth = sp2
    Picture1.Line (X2, Y2 - mo)-(X2, Y2 + mo), QBColor(col2)

    End Select

    End Sub
    '----------------------------------------------------------


    zm è un fattore di scala che uso per far ridimesionare iil disegno nella picturebox.

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Non avendo il controllo OCX non posso testare il codice, comunque ci darò un'occhiata.

    Il codice che hai postato è completo, oppure manca qualcosa?
    Non vorrei fare dei test e scoprire poi che manca del codice.

    Se posti un progettino di esempi sarebbe ottimo.

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.