Condividi:        

UserForm Circolare

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

UserForm Circolare

Postdi A.Maurizio » 12/02/16 16:50

Ciao a Tutti , il mio problema e questo :
Anni fa avevo creato con il Vb6.0 un Form Circolare sfruttando questo codice :
------------------------------------------------------------------------------------------------------------
'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 Sub Form_Load()
hr& = CreateEllipticRgn(250, 250, 30, 30)
dl& = SetWindowRgn(Me.hWnd, hr, True)
End Sub

-------------------------------------------------------------------------------------------------------------------------------------------------------
Che funzionava Benissimo ; però ora io vorrei riproporre il tutto sfruttando un Userform di excel , però quando lancio l'applicazione continua a darmi errore in : (hWnd) Perche e come posso oviare a questo inconvegnente , visto che nella Libreria di Exce e contemplato tale codice .
Grazie sin da ora per tutto l'aiuto ce sarete ho vorrete darmi in merito Sinceri saòuti da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Sponsor
 

Re: UserForm Circolare

Postdi Anthony47 » 13/02/16 01:41

Le userform del vba non hanno una proprieta' hWnd.
Per far funzionare il metodo devi aggiungere sempre in testa la dichiarzione di questa funzione:
Codice: Seleziona tutto
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Poi invece di dl& = SetWindowRgn(Me.hWnd, hr, True) userai
Codice: Seleziona tutto
dl& = SetWindowRgn(FindWindow("ThunderDFrame", Me.Caption), hr, True)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: UserForm Circolare

Postdi Marius44 » 13/02/16 17:05

Scusate l'intromissione ma la Form circolare m'intriga.

Ho copiato il codice proposto da A.Maurizio, ho apportato le correzioni indicate da Anthony ma mi dà il seguente errore:
"Errore di compilazione. Utilizzo non valido della parola chiave Me"
Ho sostituito la parola chiave Me con UserForm1 e mi dà una Form circolare bianca al centro dello schermo e non si chiude. Devo bloccare il tutto da Gestione Attività (Ctrl+Alt+Canc).
Ho provato ad inserire un pulsante a cui ho associato una Sub con dentro Unload UserForm1 ma, ovviamente, non funziona perchè la Form mi impedisce di cliccarci sopra.

Come se ne può uscire?
Grazie e ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: UserForm Circolare

Postdi Anthony47 » 13/02/16 19:20

E' un forum, tutti possono "entrare" nelle discussione!
Ma l' istruzione che conteneva "Me" non era quella che avevo detto di sostituire?

Quanto al resto, il codice fa la ciambella, ma non il buco :D :D
Per il collaudo a me e' bastato andare sul vba e cliccare sul tasto "Ripristina", ma funziona anche il commandbutton purche' risulti poi visibile nella ciambella.
Quanto all'utilita' della form rotonda sono dubbioso; credo di aver usato questa tecnica una volta per spostare il focus su vari gruppi di controlli di una form ma il risultato era stato deludente e pericoloso, rispetto alle tecniche convenzionali.

Ciao!
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: UserForm Circolare

Postdi A.Maurizio » 15/03/16 10:35

Ciao Anthony come Stai ! Scusa del Ritardo nel Rispondere a questo Messaggio , ma ho avuto Problemi con la ADSL ; ora però e tutto a posto .
Detto questo Grazie per il tuo intervento , ma visto che ho avuto nel tempo che fù un buon maestro ,di nome (Anthony) , avevo immaginato già da me quello che avevi scitto tu per qui Apportato tali modifiche , solo dopo aver scritto questa mia Richiesta e andata a buon fine anche tutto il Resto .
In più ne approfitto : per salutare il fatitico (Marius) , anche lui e un grande Sai !
Comunque ho poi risolto tutto scrivendo questo Codice :

Codice: Seleziona tutto
Option Explicit
Dim I, K, Tx, Ty As Long
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 FindWindow Lib "User32.dll" Alias "FindWindowA" (ByVal ClassName As String, ByVal WindowName As String) As Long

Public Property Get hWnd() As Long
On Error Resume Next
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
End Property

Private Sub CommandButton1_Click()
On Error Resume Next
End
End Sub

Private Sub UserForm_Activate()
On Error Resume Next
  SetWindowRgn Me.hWnd, CreateEllipticRgn(350, 350, 35, 35), True
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
On Error Resume Next

If Button = 1 Then 'se si sta trascinando con il pulsante sinistro del mouse...
  Me.Left = Me.Left + (X - Tx) '(la distanza del form dal lato sinistro dello
                                'shermo) è uguale (alla stessa + (la coordinata X attuale
                                'del mouse - la coordinata X del mouse prima del click)
  Me.Top = Me.Top + (Y - Ty) '(la distanza del form dal lato superiore dello
                                'shermo) è uguale (alla stessa + (la coordinata Y attuale
                                'del mouse - la coordinata Y del mouse prima del click)
Else
    Tx = X  'queste variabili contengono le coordinate del mouse
    Ty = Y  'fin quando non si comincia a trascinare (prima del click sul form)
End If
End Sub


Solo che al posto del tuo :
dl& = SetWindowRgn(FindWindow("ThunderDFrame", Me.Caption), hr, True)

io ho scritto :
Codice: Seleziona tutto
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
            (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long


ma Funziona ugualmente ; Grazie ancora di tutto Sinceri saluti da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Re: UserForm Circolare

Postdi Anthony47 » 15/03/16 22:23

Come vedi ci sono cento modi per fare la stessa cosa...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "UserForm Circolare":


Chi c’è in linea

Visitano il forum: Nessuno e 52 ospiti