Newsgroup: it.comp.lang.visual-basic
Titolo: Caratteri del sistema

Ciao a tutti,
Nella applicazione che sto creando  con excel vba, ho notato che a causa
della grandezza eccessiva dei caratteri di sistema (impostabili da pannello
di controllo), si determina un ingrandimento eccessivo del form contenitore
con la conseguente errata visualizzazione dei controlli che la popolano.
Esiste in vba una funzione che mi restituisca il valore dei caratteri di
sistema in modo che io possa impostare la funzione zoom del form in modo da
adattarla alla grandezza deigli stessi!?
Scusate la prolissità e saluti a tutto il ng.

 adattarla alla grandezza deigli stessi!?
Scusa ma non ho capito perche' vuoi operare basandoti sui caratteri. Forse
mi spiego meglio con un esempio in cui lo UserForm, quale che siano le
dimensioni dell'area dello schermo, viene aperto con un rapporto di 5 a 2
rispetto alla larghezza del Desktop. Dovresti facilmente adattarlo alle tue
esigenze, se sono diverse.
Option Explicit
' 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()
  Const c_fRatio          As Single = 5! / 2!
  Dim hDesktopWindow      As Long
  Dim uRect               As RECT
  Dim fDesktopWidth       As Single
  Dim fUserFormCurWidth   As Single
  Dim fUserFormCurHeight  As Single
  Dim fUserFormNewWidth   As Single
  Dim fUserFormNewHeight  As Single
  Dim iUserFormZoom       As Integer
  hDesktopWindow = GetDesktopWindow
  Call GetWindowRect(hDesktopWindow, uRect)
  With uRect
    fDesktopWidth = .Right - .Left
  End With
  fUserFormNewWidth = fDesktopWidth / c_fRatio
  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
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------


In effetti nemmeno io ho capito perchč!! In effetti il tuo ottimo esempio mi
sarą di certo utile!
Grazie per la sveglia e a presto!

 mi sarà di certo utile! [...]
Ho una brutta notizia. Quel codice che ho scritto e' una vera ciofeca. Non
mi ricordavo che le misure degli UserForm fossero in *punti* e non in pixel.
Ho scritto in fretta senza testare, ora l'ho esaminato e mi sembra che puoi
tener buono solo il... concetto. Forse
:-( Mi spiace. Appena posso lo sistemo.


(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



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.



...non ho ancora trovato il tempo per adattarlo, ma ad occhio mi sembra che
dovrebbe funzionare.
Sono riuscito a trovare un sistema molto + semplice usando le funzioni excel
usableHeight ed usableWidht con un listato molto simile a quello tuo ma
molto + maccheronico (il tempo questo tiranno) ed ora sono alle prese su
come inviare i file listati su un combobox in allegato ad un messaggio
email....un vero incubo!! Perchè poi mi ostino a voler per forza utilizzare
excel non so....forse xchè non mi costa nulla e ho la licenza!? Be forse e'
proprio così! Ciao a presto ti confermo la bontà del tuo codice.

 e' proprio cosě!
Non so in che ambito operi, quindi non metto lingua nelle questioni di
licenza, ma potresti anche sviluppare degli ocx in VB5 CCE ed usarli nelle
tue applicazioni Excel. Bada bene, questo non e' un "consiglio".


 linguaggio e' lo stesso, le problematiche anche.
il vb6 è molto simile al suo "figlio" VBA, ma per quello che devo fare io
avere una base di excel è ottimale.
A mio parere infatti, vb6 in alcuni punti è carente, come nella stampa dei
report e nella gestione di tabelle.
(questo è solo un parere da profano!)
...grazie di tutto e a risentirci presto!