Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Subclassing sysmenu

salve a tutti,
mi sono da poco cominciato a studiare il suclasssing delle finestre per
creare un sistema di skinning sfruttando comunque le finestre standard di
windows (e quindi non utilizzando form senza bordi, per capirci). Per
intercettare il disegno dei bordi e della barra del titolo ho usato
WM_NCPAINT, inoltre, per l'aggiornamento della barra del titolo anche
WM_ACTIVATE e WM_NCACTIVATE. Questo funziona benissimo se, prima di eseguire
il subclassing, esegui la seguentae istruzione:
    SetWindowLong mRif.hwnd, GWL_STYLE, Style Xor WS_SYSMENU
che praticamente elimina dallo stile della finestra il menu di sistema. a me
andrebbe benissimo, ma il fatto e' che, perdendo quello, perdo anche il menu
(quello classico sposta ridimensiona ecc..) che appare cliccando sull'icona
a sinistra. mentre lasciando il menu di sistema, non ho il pieno controllo
della finestra, ovvero, i bordi e la barra vengono come voglio io, ma poi il
so ci stampa sopra i suoi pulsantini di sistema. quindi volevo chiedere se
siete a conoscenza del messaggio che windows invia nel momento in cui
disegna il sysmenu, ho cercato su msdn, ma non ne ho cavato un ragno dal
buco...
grazie in anticipo, assa.

 disegna il sysmenu
Non ho capito bene qual è il problema, ma il messaggio che cerchi dovrebbe
essere WM_DRAWITEM
Ciao

 ha scritto nel messaggio
news:9c839.165485$Jj7.3...@news1.tin.it...

me lo guardero'. il problema e' che io ridisegno la barra ed i bordi nel
wm_ncpaint, ma subito dopo il so ci disegna il suo sysmenu, inviando un
messaggio che non sapevo...
grazie, assa.

 buco...
non basta solo gestire un messaggio per quel che ho capito windows ridisegna
la title bar spesso ...
..
un po di tempo fa per cancellare i controlli di chiusura e visualizzazione
ho usato questa funzione ...
aggiungi un form con scalemode = pixel poi il solito setwindowlong per il
subclassing con questa funzione
Public Function CallWndProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim tmpDC As Long
Dim HiWord  As Long
Dim LoWord  As Long
Dim r As RECT
HiWord = (lParam And &HFFFF0000) \ &H10000
 If (lParam And &H8000&) <> 0 Then
      LoWord = lParam Or &HFFFF0000
  Else
      LoWord = lParam And &HFFFF&
 End If
If (uMsg = WM_NCMOUSEMOVE) Or (uMsg = WM_NCLBUTTONDOWN) Or (uMsg =
WM_NCRBUTTONDOWN) Then
  Form1.ScaleLeft = Form1.Left / Screen.TwipsPerPixelX
  Form1.ScaleTop = Form1.Top / Screen.TwipsPerPixelY
  If LoWord > (Form1.ScaleLeft + Form1.ScaleWidth - 66) Then
   ' gestione messaggi mouse
   Exit Function
  End If
End If
If (uMsg <> WM_SYSCOMMAND) Then
CallWndProc = CallWindowProc(lpPrevWndProc, Form1.hwnd, _
   uMsg, wParam, lParam)
End If
'Public Const WM_NCLBUTTONDBLCLK = &HA3
'Public Const WM_MENUSELECT = &H11F
        If (uMsg = WM_ACTIVATE) Or (uMsg = WM_MENUSELECT) Or (uMsg =
WM_NCLBUTTONDBLCLK) Or (uMsg = WM_SYSCOMMAND) Or (uMsg = WM_NCPAINT) Or
(uMsg = WM_INITMENUPOPUP) Or (uMsg = WM_NCHITTEST) Or (uMsg =
WM_EXITSIZEMOVE) Or (uMsg = WM_NCMOUSEMOVE) Or (uMsg = WM_NCRBUTTONDOWN) Or
(uMsg = WM_MOVE) Then
          tmpDC = GetWindowDC(hw)
           r.Top = 1
           r.Left = Form1.ScaleWidth - 66
           r.Bottom = 30
           r.Right = r.Left + 70
'qui io ho disegnato un quadrato epr nascondere il menu
           FillRect tmpDC, r, 255
           ReleaseDC hw, tmpDC
        End If
' solo per questo messaggio č meglio chiamare dopo la CallWindowProc
If (uMsg = WM_SYSCOMMAND) Then
CallWndProc = CallWindowProc(lpPrevWndProc, Form1.hwnd, _
   uMsg, wParam, lParam)
End If
End Function
č un po rozza sicuramente ci sarŕ in giro qualcosa di meglio ma per
nascondere e disegnare quello che vuoi sul controlbox del form credo vada
bene...
ciao

 la title bar spesso ...
[megacut]
me ne sono accorto :)
grazie mille dell'aiuto, mi studiero' la tua implementazione e ne trarro'
certamente qualcosa di utile :)
ciao, assa.