Newsgroup: it.comp.lang.visual-basic
Titolo: [Subclassing] Problema di tempi...?

Ciao.
Ho una MDI e una SDI, devo dimensionare la SDI alla ClientArea
della MDI qualsiasi variazione venga fatta.
Bene, ho pensato di intercettare solo 2 eventi:
      Case WM_SIZE
         NuovaLarghezza = HIWORD(lParam)
         NuovaAltezza = LOWORD(lParam)
         Select Case wParam
            Case SIZE_MAXIMIZED
               Procedura per il RESIZE
            Case SIZE_MINIMIZED
               Procedura per il RESIZE
            Case SIZE_RESTORED
               Procedura per il RESIZE
         End Select
      Case WM_EXITSIZEMOVE
         Procedura per il RESIZE
Bene, la procedura per il Resize attivata su WM_EXITSIZEMOVE funziona
regolarmente(con questo ho escluso eventuali malfunzionamenti della
funzione stessa), mentre quella su WM_SIZE no, pare che nonostante
il messaggio di notifica sia postumo all'azione, la MDI non abbia
ancora effettuato il PAINT pertanto la mia funzione non ricava le
dimensioni reali ma ancora quelle prima della variazione.
Ovviamente per ricavare le dimensioni della Cleint area
della Form MDI uso GetClientRect(se la SDI non è POPUP) 
altrimenti GetWindowRect passando l'handle di Windows.
Ho fatto un giochino settanto un Flag(Static) su intercettazione
di WM_SIZE, quindi su WM_PAINT in caso di Flag=True lancio la
procedura di Resize, e tutto funziona.
Mi pare una cavolata, o meglio speravo di sbagliarmi in qualcosa.
I dati di NuovaAltezza e NuovaLarghezza recuperati da lParam
di fatto non vanno bene, in quanto non si riferiscono alla ClientArea
quindi sono punto e a capo come prima.
Ho fatto qualche errore di valutazione che mi sfugge....?
Avete qualche consiglio per risolvere...?
Grazie
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Mi sono trovato in una situazione simile alla tua (ma non identica)
Nel mio caso avevo un MDI che conteneva un Child. All'interno di questo
inserivo come figlio un form creato a runtime (Con CreateWindow per
capirci). Quando ridimensionavo il Child volevo ridimensionare anche il
FormExt.
Io ho usato solamente il WM_EXITSIZEMOVE per gestire la cosa. Non è
molto bello da vedersi, ma questo dipende dal tipo di form.
Cmq, non potresti intercettare WM_SIZING e postare le nuove dimensioni
al form SDI? Per esempio:
Dim WndRect As RECT
Case WM_SIZING
	'Recupero l'handle del main form del PlugIn
	CopyMemory WndRect, ByVal lp, LenB(WndRect)
	MoveWindow SDIFormhwnd, _
                   0&, _
                   0&, _
                   WndRect.Right - WndRect.Left, _
                   WndRect.Bottom - WndRect.Top, _
                   True
Tu dovresti eliminare dall'altezza del RECT l'eventuiale TitleBar, Menu
e Status..
Ciao!
Daniele.
-- 
Free As In Freedom
www.fsf.org
http://blog.libero.it/LeleB/

 Daniele.


 wrote in message
news:KFNyf.47697$
eD5.7...@twister2.libero.it
Il SIZING potrebbe anche andare, non funziona il recupero della
TitleBar, della Status e delle ScrollBar....!
Se hai idee.


 Avete qualche consiglio per risolvere...?
Invece di tentare di ricavare le dimensioni della Client Area *effettiva* per
sottrazione, prova questo codice:
Dim lpRect  As RECT
Dim hwndCli  As Long
    hwndCli = FindWindowEx(MDIForm1.hwnd, 0, "MDIClient", vbNullString)
    If hwndCli <> 0 Then
        GetClientRect hwndCli, lpRect
    End If
Cosě becchi *esattamente* le dimensioni dell'area client effettiva, che non č
altro che una finestra nascosta di classe "MDIClient"...
Bye
Raf

 Raf
Grande Raf, non avevo pensato a questa soluzione, funziona, c'č solo
un difetto quando appaiono le ScrollBar, ma mi č bastato togliere
un Pixel alle dimensioni per essere sicuro che non appaiano le Scroll
altrimenti avrei dovuto verificarle e tenerne conto.
Un caffč pagato quando passi a Mantova.(anche un piatto di tortelli)


 altro che una finestra nascosta di classe "MDIClient"...
Ma quante ne sai?!
Questa me la segno! ;)
Daniele.

 ha scritto nel messaggio
news:QISyf.48317$eD5.8...@twister2.libero.it...

Ahem... San Google & Santa Msdn fanno miracoli! Ma devo ammettere che non ho
trovato nessun link specifico, ho dovuto "combinare" tra loro soluzioni ad altri
problemi.
Magari appena ho un attimo di tempo potrei farlo diventare un articolo...
Bye
Raf

 Un caffè pagato quando passi a Mantova.(anche un piatto di tortelli)
Vada per i tortelli... :-J
Ciao e buon lavoro
Raf