Newsgroup: it.comp.lang.visual-basic
Titolo: Subclassing di una listview

Ciao a tutti,
vorrei disegnare sullo sfondo di una listview, in particolare vorrei
scriverci
un testo. Per farlo ho utilizzato la tecnica del subclassing, impostando
la nuova WindowProcedure mediante la API SetWindowLong().
Nella nuova WindowProc semplicemente processo *solo* i messaggi WM_PAINT ed
utilizzo
le API BeginPaint, DrawText e EndPaint.
In coda richiamo la windowprocedure originale mediante una CallWindowProc().
Bene, i problemi sono:
. devo intercettare altri messaggi oltre al WM_PAINT?
. utilizzo la drawtext passando un rettangolo in modo che il testo sia
centrato nel
  rettangolo e quindi nella listview. Ovviamente la larghezza (Width) del
rettangolo
  dovrà essere uguale alla larghezza della listview. Come faccio a
conoscere, nella
  mia WindowProc, la Width della listview conoscendo solo l'handle del DC?
Esiste
  una API che mi permette di risalire alla Width di un DC? Ho provato ad
utilizzare
  semplicemente form.listview.Width ma non credo sia proprio la soluzione
ideale in
  una Window Procedure.
. Se ridimensiono la finestra, ridimensiono anche la listview di conseguenza
e il
  testo dovrebbe rimanere comunque centrato nella client area del controllo
ma così
  non è. E se continuo a giocare con il ridimensionamento e lo spostamento
della finestra
  il testo che disegno inizia a sporcarsi.

 la nuova WindowProcedure mediante la API SetWindowLong().
E usare la sua property Picture?
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 E usare la sua property Picture?
Che io sappia con la property Picture si può applicare una immagine come
sfondo
alla listview. Ma come faccio a scrivere del testo sullo sfondo? Ovviamente
il
testo deve essere elaborato in runtime, altrimenti lo andavo a scrivere
direttamente
sul file dell'immagine.

sul file dell'immagine.
Appunto ;-)
Intervengo solo ora perche' pensavo che sarebbe saltato fuori prima,
comunque...
Propongo quanto segue, che usa il solo vb, che, checche' se ne dica,
e' ben attrezzato per disegnare fin dai tempi del vecchio qbasic.
Non mi sembra il caso di impelagarsi in potenzialmente disastrosi subclassing.
In un progetto nuovo, mettiamo nel form predefinito: 
una listview, una picturebox ed un command button
e lasciamo le impostazioni di default.
Nel form inseriamo questo codice e lanciamo F5:
<codice>
Option Explicit
Private m_testo As String
Private Sub Command1_Click()
    m_testo = InputBox("Inserisci il testo da centrare nello sfondo:", "Test", "ciccio")
    ScriviSfondo m_testo
End Sub
Private Sub Form_Load()
    Command1.Move 0, 0, 4000, 500
    Command1.ZOrder 0
    Command1.Caption = "Inserisci il &testo"
    Picture1.Visible = False
    Picture1.AutoRedraw = True
End Sub
Private Sub Form_Resize()
    ListView1.Move 0, 0, ScaleWidth, ScaleHeight
    Picture1.Move 0, 0, ScaleWidth, ScaleHeight
    ScriviSfondo m_testo
End Sub
Private Sub ScriviSfondo(ByVal testo As String)
    Picture1.Cls
    Picture1.BackColor = vbYellow
    Picture1.ForeColor = vbBlue
    Picture1.Font.Size = 24
    Picture1.Font.Bold = True
    Picture1.CurrentX = (Picture1.ScaleWidth - Picture1.TextWidth(testo)) / 2
    Picture1.CurrentY = (Picture1.ScaleHeight - Picture1.TextHeight(testo)) / 2
    Picture1.Print testo
    ListView1.Picture = Picture1.Image
End Sub
</codice>
Se vogliamo, possiamo caricare un' immagine a piacere nella picture
box e gustarci ugualmente l' effetto.
-- 
hth, hal