Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 usare le forme

C'è un modo di usare, o costruire, una forma sullo stile di quelle contenute in word?
Nello specifico mi servirebbe avre un rettanfolo dove ci possa scrivere dentro e impostare il
colore di sfondo - e mi andrebbe bene una labl - ma anche che assomigli ad una freccia. Merci e
buone vacanze a tutti :)
 
-- 
Greg


Quelle cose si fanno velocemente con le API, disegnando su un Form o una
Picturebox.
Si usa la FillRect un paio di volte per il bordo e lo sfondo e poi la DrawText
per il testo.
 
 
Esempio al volo, sono in ferie, non ho molto tempo
e non ho nemmeno il vb per provare  :-)
 
Comunque ho accesso web al mio software VB
 
Crea un form con una PictureBox di nome Pic
 
Le API che ti servono sono queste:
____________________________________________-
 
 
 
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As
Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat
As Long) As Long
 
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long,
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
 
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As
RECT, ByVal hBrush As Long) As Long
 
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As
Long
 
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
 
Dim R As RECT, hBrush  as Long, Flgs as Long, TxB as String
 
Const DT_SINGLELINE As Long = &H20& 
Const DT_NOCLIP As Long = &H100&  
Const DT_CENTER As Long = &H1& 
 
Const C_DT_FLAGS = DT_SINGLELINE Or DT_NOCLIP Or DT_CENTER
 
    hBrush = CreateSolidBrush(vbBlack)
 
    SetRect R, 0, 0, 100, 100
    FillRect Pic.hdc, R, hBrush     'DISEGNA RETTANGOLO NERO
 
    SetRect R, 10,10, 90, 90 
 
    hBrush = CreateSolidBrush(vbCyan)
    FillRect Pic.hdc, R, hBrush     'DISEGNA RETTANGOLO SFONDO CIANO
 
TxB ="PROVA"
Flgs = C_DT_FLAGS
 
     SetRect R, 20,20, 80, 80 
 
      i = DrawText(Pic.hdc, TxB, Len(TxB), R, Flgs)
 
 
Chiaramente la DrawText userà il font della Pic con tutti i suoi attributi.
 
Non posso provare niente qui adesso ma ti dovrebbe bastare come spunto.
 
 
 
-- 
ciao
  Stefano

 Crea un form con una PictureBox di nome Pic
 
Ciao SB, grazie per avermi risposto, anhe se in vacanza :)
Il suggerimento è ottimo e lo terrò in considerazione per usarlo in altri punti, ma in questo caso
non posso usare la picture ma devo disegnare su una flexgrid, colpa mia non ho specificato subito
:( grazie ancora
 
-- 
Greg

Greg ha scritto:

Il sistema del drawing suggerito da SB non solo è ottimo in sé,
ma  può essere usato anche sulle Region, che hanno il vantaggio
di avere i margini trasparenti.
 
Il concetto è creare una region (cioè una forma "astratta")
usando una o più API, poi assegnarla a un oggetto che abbia
un .hWnd (Picturebox, Form o altro) per "ritagliarlo".
 
Ho fatto un po' di copia e incolla da degli esempi che ho
preso in rete. (Da qualche parte avevo un programma più
complesso già fatto, ma è roba di svariati anni fa :-(
e ritrovarlo è un po' un casino, ho fatto prima così)
 
Segui le istruzioni:
Crea un form, mettici sopra un command.
Metti qualche controllo, per esempio una Filelistbox, poi
aggiungi una Picturebox non enorme, ma abbastanza grande,
che la copra parzialmente.
Alla Picturebox metti un .BackColor diverso dal grigio,
diciamo blu,
 
Nelle dichiarazioni del Form incolla questo:
 
'***************
Option Explicit
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd _
As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 _
As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _
As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 _
As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, _
ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 _
As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _
As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint _
As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) _
As Long
'nPolyFillMode
'Exactly one of the following flags specifying the polygon
' filling mode to use:
Const ALTERNATE = 1
' The device alternates between filling and not filling
' contiguous sections whose boundaries are determined by
' the edge(s) of the polygon crossing through the polygon's
' interior.
Const WINDING = 2
' Any section inside the polygon is filled, regardless of
' any intra-polygonal boundaries and edges.
 
 
'Will hold the handle to the new region.
Dim hRegion As Long
 
Private Type POINTAPI
     X As Long
     Y As Long
End Type
'*******************
 
Nel command metti questo:
 
'*******************
Dim Punti() As POINTAPI
 
Dim NumeroPunti As Integer
NumeroPunti = 8
ReDim Punti(1 To NumeroPunti)
 
Punti(1).X = 100
Punti(1).Y = 10
 
Punti(2).X = 10
Punti(2).Y = 100
 
Punti(3).X = 100
Punti(3).Y = 200
 
Punti(4).X = 100
Punti(4).Y = 120
 
Punti(5).X = 200
Punti(5).Y = 120
 
Punti(6).X = 200
Punti(6).Y = 80
 
Punti(7).X = 100
Punti(7).Y = 80
 
Punti(8).X = 100
Punti(8).Y = 10
 
hRegion = CreatePolygonRgn(Punti(1), NumeroPunti, ALTERNATE)
 
'Change the Form to the new region shape.
  SetWindowRgn Freccia.hWnd, hRegion, True
'*******************
 
Lancia e clicca :-)
 
Bye, G.

 di avere i margini trasparenti.
 
Funziona alla grande :) Merci
 
-- 
Greg

non posso usare la picture ma devo disegnare su una flexgrid
 
Puoi usare qualunque cosa abbia l'handle, qiundi anche la flexgrid che ha la
proprietà hWnd.
 
E' buona anche l'idea di usare le Region, alla fine il risultato è migliore.
 
 
-- 
ciao
  Stefano

 E' buona anche l'idea di usare le Region, alla fine il risultato è migliore.
 
Mi hai dato un'idea.
Stavo pensando di applicare una Region a una Flexgrid... non per
qualche motivo serio,  giusto per vedere che succede e com'è
una Flex ritagliata a forma di freccia O:-)
 
Sarà il caldo che mi fa male... vado a buttarmi un po' d'acqua
fresca in testa :-)
 
Bye, G.

fresca in testa :-)
 
Fa davvero caldo qui oltre 2000 metri, non oso pensare come sia giù.
 
 
-- 
ciao
  Stefano

 Fa davvero caldo qui oltre 2000 metri, non oso pensare come sia giù.
 
37 gradi reali adesso. Percepiti non lo so, perché ho attaccato
l'aria condizionata e mi sono chiuso in casa :-D, ma se fai il
conto che è una città di mare e l'umidità è quel che è... =8-(
 
Bye, G.