Newsgroup: it.comp.lang.visual-basic
Titolo: [SubClass] Intercettare MDI Maximize

Ciao e buon anno a tutti.
Premetto che la form MDI di cui parlo è Access, ma non cambia nulla.
Ora quello che dovrei ottenere è che alla pressione del Maximize
(sia il Button nella Caption che l'HotKey) mi ridimension la form
Main aperta in quel momento.
Dalla Form Main subclasso la MDI in questo modo:
Private Sub Form_Load()
    lProcOld = SetWindowLong(Access.hWndAccessApp, _
                             GWL_WNDPROC, -
                             AddressOf WindowProc)
' Questa funzione effettua il RESIZE della form 
' e FUNZIONA regolarmente
    Call FillClientArea(Me)
End Sub
 
Ora la procedura di SubClass la eseguo in questo modo:
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
   If hWnd = Access.hWndAccessApp Then
      Select Case uMsg
         Case WM_NCDESTROY
            SetWindowLong hWnd, GWL_WNDPROC, lProcOld
 
          '--------------------------------------
          ' Altro tentativo 
          '--------------------------------------
          'Case WM_SYSCOMMAND
          '  Select Case wParam
          '     'Case wParam And &HFFF0 = SC_SIZE
          '     '   Exit Function
          '     Case SC_MAXIMIZE
          '        Call FillClientArea(Forms!Main)
          'End Select
          '--------------------------------------
 
         Case WM_SIZE
            Select Case wParam
               Case SIZE_MAXIMIZED
                  Call FillClientArea(Forms!Main)
 
               Case SIZE_RESTORED
 
               Case SIZE_MINIMIZED
 
 
            End Select
         Case WM_NCLBUTTONDOWN
            Select Case wParam
               Case HTMAXBUTTON
                  Call FillClientArea(Forms!Main)
            End Select
      End Select
   End If
Exit_Here:
   WindowProc = CallWindowProc(lProcOld, hWnd, uMsg, wParam, lParam)
End Function
PROBLEMA:
Se eseguo la procedura di Resize della FORM(Main) su intercettazione
Evento [SIZE_MAXIMIZED] o [HTMAXBUTTON] la form(Main) in realtà viene
ridimansionata, ho verificato e il SubClass entra regolarmente, il
problema è che parrebbe che non sia ancora stato eseguito il Maximize
della MDI(come è anche intuibile avendolo subclassato), pertanto il
ridimensionamento non è corretto.
A mio parere dovrei poter intercettare l'avvenuta esecuzione del
Maximize, ma non saprei dove guardare.
Con SPY++ ho provato a vedere ma non sono riuscito a capire cosa
potrebbe essermi utile.
Grazie.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:91547bd86483a87418...@mygate.mailgate.org
[CUT]
Ho trovato una soluzione, ma vorrei sapere se č sporca o 
se ci sono alternative piů valide.
Intercettando i messaggi di cui al Post originale setto
una variabile STATIC nella Procedura, quindi su Messaggio
WM_PAINT eseguo il Resize solo se la variabile STATIC=True
a quel punto la resetto nuovamente.
         Static sMaxi as Boolean
         ...........................
         Case WM_SIZE
            Select Case wParam
               Case SIZE_MAXIMIZED
                  sMaxi = True
               Case SIZE_RESTORED
                  sMaxi = True
            End Select
         Case WM_PAINT
            If sMaxi Then
               sMaxi = False
               Call FillClientArea(Forms!Main)
            End If
Per funzionare funziona, ma non benissimo con il SIZE_RESTORED.
Mi sorge il dubbio che mi sfugga qualche dettaglio.
Saluti


 a quel punto la resetto nuovamente.
Probabilmente bisogna gestire solo WM_PAINT, utilizzando WindowState del form
per sapere se č massimizzato oppure no.
          Case WM_PAINT
             If Forms!Main.WindowState = vbMaximized Then
                Call FillClientArea(Forms!Main)
             End If
Funziona?
Ciao
Raf

 Raf
Ciao Raf.
Il SubClassing riguarda la MDI di Access, ed è quella che viene
Massimizzata, la form MAIN viene solo Ridimensionata e non Massimizzata
pertanto è possibile che abbia frainteso il tuo suggerimento.!
Oltretutto da Access non ho la proprietà WindowsState della
MDI ma dovrei ricavarla(anche se non è un problema).
Come ti dicevo agendo su WM_PAINT funziona, ma in modo anomalo
in caso di Restore, e questo non capisco perchè.....!
Grazie per l'interesse.


 in caso di Restore, e questo non capisco perchè.....!
Probabilmente c'entra la sequenza con cui vengono processati i messaggi. Magari
quando arriva il WM_PAINT per l'MDI, Windows non ha ancora "sistemato" il form
Main.
E comunque temo che il VBA sia leggermente diverso da VB6 (ad esempio mi pare
che i form non abbiano l'evento Form_Paint).
Cosa fa di preciso FillClientArea?
Ciao
Raf

 Raf


  [CUT]
La cosa strana, leggendo MSDN č questa:
The WM_SIZE message is sent to a window after its size has changed.
Boh...!
A me non torna sia cosě, a meno chč come dicevi tu non faccia
a tempo a ridisegnarla.
A questo punto sempre intercettando WM_SIZE ed estraendo "lParam"
dovrei recuperare le nuove dimensioni della ClientArea:
lParam
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client
area.
Proviamo anche questa.
@Alex
