Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Adattare il form allo schermo

914 views
Skip to first unread message

Marco

unread,
Nov 1, 2003, 12:55:36 PM11/1/03
to
Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma insieme,
tutti i suoi comandi e, se si può, la dimensione del Font dei comandi. E'
possibile?


--
Marco
marcotog...@inwind.it


Roberto Restelli

unread,
Nov 1, 2003, 7:02:46 PM11/1/03
to
Ciao Marco.

Marco ha scritto:


> Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma

> insieme, tutti i suoi comandi e, se si puň, la dimensione del Font
> dei comandi. E' possibile?

Non mi risulta che ci siano automatismi per fare questo.
Dovresti gestire il ridimensionamento da codice.
Per VB6 avevo utilizzato dei componenti OCX aggiuntivi che permettevano il
ridimensionamento dei controlli sul form, ma non li ho mai utilizzati sugli
UserForm di VBA perchč la distribuzione e la registrazione dei componenti
non risultava troppo snella e ad essere sinceri dopo qualche test non si
sono dimostrati completamente funzionanti sugli UserForm stessi.

Per quanto riguarda la gestione via codice bisognerebbe ricorrere
all'utilizzo di un paio di API di sistema per rilevare la dimensione, poi
procedere alla variazione della posizione e delle dimensioni di ogni singolo
controllo; idem per i font. Non cosě banale se non hai sufficiente
dimestichezza con la programmazione.

Ciao
Roberto


Marco

unread,
Nov 2, 2003, 2:34:14 PM11/2/03
to

"Roberto Restelli" <roberto.res...@libero.it> ha scritto nel
messaggio news:bo1hj7$16t7fg$1...@ID-150503.news.uni-berlin.de...
> Ciao Marco.

> Non mi risulta che ci siano automatismi per fare questo.


Ho fatto una ricerca, chiedo scusa ma l'ho fatta dopo, su google ed ho visto
che è come dici tu.
C'era un esempio che mi restituiva la risoluzione dello schermo in quel
momento, questa:

Dim HRes As Integer, VRes As Integer
HRes = Screen.Width / Screen.TwipsPerPixelY
VRes = Screen.Height / Screen.TwipsPerPixelX
MsgBox "Risoluzione dello schermo: " & HRes & " x " & VRes, vbInformation

ma non funziona, o non sono capace io, o non funziona con excel.

Sai se questo è possibile?

Grazie


--
Marco
marcotog...@inwind.it


Tiziano Marmiroli

unread,
Nov 2, 2003, 3:31:00 PM11/2/03
to
Il Sun, 02 Nov 2003 19:34:14 GMT, Marco ha scritto:

> C'era un esempio che mi restituiva la risoluzione dello schermo in quel
> momento, questa:
>
> Dim HRes As Integer, VRes As Integer
> HRes = Screen.Width / Screen.TwipsPerPixelY
> VRes = Screen.Height / Screen.TwipsPerPixelX
> MsgBox "Risoluzione dello schermo: " & HRes & " x " & VRes, vbInformation
>
> ma non funziona, o non sono capace io, o non funziona con excel.
>
> Sai se questo è possibile?

Potresti provare con un trucco tipo:

Dim HExcel As Integer, VExcel As Integer
Application.WindowState = xlMaximized
HExcel = Application.Width
VExcel = Application.Height

--
Tiziano Marmiroli
Microsoft MVP - Office

Maurizio Borrelli

unread,
Nov 2, 2003, 6:00:04 PM11/2/03
to
"Marco" <marc...@inwind.it> ha scritto nel messaggio
news:ssSob.83634$vO5.3...@twister1.libero.it...

> Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma
> insieme,
> tutti i suoi comandi e, se si puņ, la dimensione del Font dei comandi. E'
> possibile?

Prova a vedere se riesci a ricavare qualcosa da questo abbozzo.

************************************************************
From: "Maurizio Borrelli"
Newsgroups: it.comp.lang.visual-basic
Subject: Re: Caratteri del sistema
Date: Mon, 13 May 2002 20:00:53 +0200

(Excel2000. Ridimensionamento UserForm)

Il codice che segue mi sembra vada meglio. Fammi sapere, grazie.

Per agevolare il test, nel foglio attivo ho assegnato a due celle i nomi:
"Desktop" e "UserForm". In queste celle ho messo i valori, per esempio, 5 e
1; 5 e 3, ecc. (Il rapporto cioe' che si vuole ottenere fra le due
larghezze). Ovviamente vale per finestre in cui larghezza > altezza. Vedi un
po' se puoi generalizzarlo, ammesso che il tutto realmente funzioni.

Option Explicit

' HWND GetActiveWindow(VOID)
Private Declare Function GetActiveWindow _
Lib "user32" () As Long

' HWND GetDesktopWindow(VOID)
Private Declare Function GetDesktopWindow _
Lib "user32" ( _
) As Long

' typedef struct _RECT {
' LONG left;
' LONG top;
' LONG right;
' LONG bottom;
' } RECT;
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

' BOOL GetWindowRect(
' HWND hWnd, // handle to window
' LPRECT lpRect // address of structure for window
' // coordinates
' );
Private Declare Function GetWindowRect _
Lib "user32" ( _
ByVal hwnd As Long _
, lpRect As RECT _
) As Long

Private Sub UserForm_Initialize()
Dim uRect As RECT
Dim fPixelsToPointsRatio As Single
Dim bDisplayFullScreen As Boolean
Dim fDesktopWidth As Single
Dim fUserFormCurWidth As Single
Dim fUserFormCurHeight As Single
Dim fUserFormNewWidth As Single
Dim fUserFormNewHeight As Single
Dim iUserFormZoom As Integer

Call GetWindowRect(GetActiveWindow, uRect)
With uRect
fPixelsToPointsRatio _
= Application.Width / (.Right - .Left)
End With
Call GetWindowRect(GetDesktopWindow, uRect)
With uRect
fDesktopWidth = (.Right - .Left) * fPixelsToPointsRatio
End With

With Application.ActiveWorkbook.Names
fUserFormNewWidth _
= fDesktopWidth _
* (.Item("UserForm").RefersToRange.Value _
/ .Item("Desktop").RefersToRange.Value)
End With
With Me
fUserFormCurWidth = .Width
fUserFormCurHeight = .Height
End With
iUserFormZoom = fUserFormNewWidth / fUserFormCurWidth * 100
Select Case True
Case iUserFormZoom < 10
iUserFormZoom = 10
Case iUserFormZoom > 400
iUserFormZoom = 400
Case Else
End Select
fUserFormNewWidth = iUserFormZoom * fUserFormCurWidth / 100
fUserFormNewHeight _
= fUserFormNewWidth * fUserFormCurHeight _
/ (fUserFormCurWidth)
With Me
.Zoom = iUserFormZoom
.Width = fUserFormNewWidth
.Height = fUserFormNewHeight
End With

End Sub

E facci sapere se trovi qualcosa di meno macchinoso, mi raccomando.
************************************************************

--
Ciao :o)
Maurizio Borrelli, Microsoft MVP Access
--------
?SPQR(C)
X
--------


Roberto Restelli

unread,
Nov 3, 2003, 3:27:46 AM11/3/03
to
Ciao Marco.

Marco ha scritto:


> C'era un esempio che mi restituiva la risoluzione dello schermo in
> quel momento, questa:

> [CUT]


> HRes = Screen.Width / Screen.TwipsPerPixelY
> VRes = Screen.Height / Screen.TwipsPerPixelX

> [CUT]


> ma non funziona, o non sono capace io, o non funziona con excel.

L'oggetto "Screen" non è disponibile in VBA; funziona invece con Visual
Basic. Quindi non dipende da te! ;-)
Esistono delle API di sistema per risalire alla risoluzione, vedi ad
esempio:

http://www.mvps.org/vbnet/index.html?code/core/getdesktopmaximumwidth.htm
"GetDesktopMaximumWidth"

http://www.mvps.org/vbnet/index.html?code/core/getdesktopmaximumheight.htm
"GetDesktopMaximumHeight"

Prova anche a seguire il suggerimento di Tiziano.
Ciao
Roberto


Roberto Restelli

unread,
Nov 3, 2003, 3:31:18 AM11/3/03
to
Ciao!

Tiziano Marmiroli ha scritto:


> Potresti provare con un trucco tipo:
> Dim HExcel As Integer, VExcel As Integer
> Application.WindowState = xlMaximized
> HExcel = Application.Width
> VExcel = Application.Height

Sono una noticina: attenzione che il tipo restituito dalle proprietà
".Width" e ".Height" è di tipo Double (anche perchè dipende dall'unità di
misura utilizzata).

Ciao
Roberto


Marco

unread,
Nov 3, 2003, 4:52:56 PM11/3/03
to

"Tiziano Marmiroli" <t.mar...@mvps.org> ha scritto nel messaggio
news:8vpaqv05c32ashdfn...@4ax.com...

> Microsoft MVP - Office+

Questo funziona, non mi dà i pixel, ma va bene ugualmente


--
Marco
marcotog...@inwind.it


Marco

unread,
Nov 3, 2003, 4:52:57 PM11/3/03
to

"Maurizio Borrelli" <maurizio...@freepass.it> ha scritto nel messaggio
news:eItdTTZo...@tk2msftngp13.phx.gbl...

> "Marco" <marc...@inwind.it> ha scritto nel messaggio
> news:ssSob.83634$vO5.3...@twister1.libero.it...
> > Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma
> > insieme,
> > tutti i suoi comandi e, se si può, la dimensione del Font dei comandi.

E'
> > possibile?
>
> Prova a vedere se riesci a ricavare qualcosa da questo abbozzo.
>
> super cut

Il tuo funziona benissimo, le API no (anche se sono sicuro che è colpa della
mia completa ignoranza in materia), non so proprio dove mettere il codice:

Public Const SM_CYVIRTUALSCREEN As Long = 79
Public Const SM_CMONITORS As Long = 80

Public Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long

Public Function GetDesktopMaximumHeight() As Long

'Return the maximum height of
'all monitors on the desktop. If
'only one monitor, return screen
'height.
If IsMultiMonitorSystem() Then
GetDesktopMaximumHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN)
Else
GetDesktopMaximumHeight = Screen.Height \ Screen.TwipsPerPixelY
End If

End Function


Public Function IsMultiMonitorSystem() As Boolean

'Returns True if a multi-monitor system
IsMultiMonitorSystem = GetSystemMetrics(SM_CMONITORS) > 1

End Function


--
Marco
marcotog...@inwind.it

Maurizio Borrelli

unread,
Nov 3, 2003, 5:00:38 PM11/3/03
to
"Marco" <marc...@inwind.it> ha scritto nel messaggio
news:Z6Apb.88526$vO5.3...@twister1.libero.it...

> "Maurizio Borrelli" <maurizio...@freepass.it> ha scritto nel
messaggio
> news:eItdTTZo...@tk2msftngp13.phx.gbl...
> > "Marco" <marc...@inwind.it> ha scritto nel messaggio
> > news:ssSob.83634$vO5.3...@twister1.libero.it...
> > > Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma
> > > insieme,
> > > tutti i suoi comandi e, se si puň, la dimensione del Font dei comandi.

> E'
> > > possibile?
> > Prova a vedere se riesci a ricavare qualcosa da questo abbozzo.
> > super cut
> Il tuo funziona benissimo, le API no (anche se sono sicuro che č colpa

della
> mia completa ignoranza in materia), non so proprio dove mettere il codice:
> Public Const SM_CYVIRTUALSCREEN As Long = 79
> Public Const SM_CMONITORS As Long = 80
>
> Public Declare Function GetSystemMetrics Lib "user32" _
> (ByVal nIndex As Long) As Long
>
> Public Function GetDesktopMaximumHeight() As Long
>
> 'Return the maximum height of
> 'all monitors on the desktop. If
> 'only one monitor, return screen
> 'height.
> If IsMultiMonitorSystem() Then
> GetDesktopMaximumHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN)
> Else
> GetDesktopMaximumHeight = Screen.Height \ Screen.TwipsPerPixelY
> End If
>
> End Function
>
>
> Public Function IsMultiMonitorSystem() As Boolean
>
> 'Returns True if a multi-monitor system
> IsMultiMonitorSystem = GetSystemMetrics(SM_CMONITORS) > 1
>
> End Function

Questo codice deve essere scritto in un modulo visual basic della
cartella. Hai presente?... Inserisci > Modulo

Quindi richiamerai queste funzioni pubbliche (del progetto visual basic
della tua cartella di lavoro excel) dal modulo che ha bisogno di usarle. Nel
tuo caso lo userform, immagino.

Per esempio:

If (IsMultiMonitorSystem = True) Then
' ...
Else
' ...
End If

0 new messages