Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] disabilitare menu contestuale textbox

Sto creando uno usercontrol per sostituire il DataTimePicker che non mi 
piace e oltretutto non si adatta ai nuovi stili di windows.
La finestra dropdown funziona perfettamente, il problema ora è l'input 
della data.
Volevo creare con CreateWindowEx una MaskedEdit ma non so quale 
windowclass usare, "EDIT" dovrebbe essere per la textbox normale, quindi 
sto usando una textbox con input forzato nell'evento keypress.
Volevo disabilitare il menu contestuale di una textbox.
Facendo ricerche ho letto che devo fare il subclassing, ho provato con 
tutti gli esempi che ho trovato ma non funziona.
Che parametri devo usare?
WM_CONTEXTMENU con il subclassing che uso io non funziona.
 
Carmelo

 ha scritto nel messaggio 
news:534d2e10$0$23125$4faf...@reader2.news.tin.it...

Vedi se ti funziona questo, non dovrebbe andare
ad impattare col resto del codice, spero:
 
Private Declare Function LockWindowUpdate Lib "user32" _
        (ByVal hwndLock As Long) As Long
 
     Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, _
        X As Single, Y As Single)
        If Button = vbRightButton Then
        ' Avoid the 'disabled' gray text by locking updates
           LockWindowUpdate Text1.hWnd
           ' A disabled TextBox will not display a context menu
           Text1.Enabled = False
           ' Give the previous line time to complete
           DoEvents
           ''''' Optional: display our own context menu
           '''' PopupMenu mnuPopup
           ' Enable the control again
           Text1.Enabled = True
           ' Unlock updates
           LockWindowUpdate 0&
        End If
     End Sub
 
 
Bye, G. 
 
 

 ha scritto nel messaggio news:534d2e10$0$23125$4faf...@reader2.news.tin.it...

Devi fare il subclassing del textbox tramite il suo hWnd, intercettare l'evento
WM_CONTEXTMENU, e imporre zero come valore di ritorno della funzione
 
-- 
wiki: 
http://salclem2.altervista.org/wiki/
 
sito: 
http://salclem2.altervista.org/
 
blog: 
http://salclem.blogspot.it/
 
 


Grazie ma non funziona
 
Carmelo


 
La routine che uso per il subclassing è questa:
Public Sub zSubclass_WndProc(ByVal bBefore As Boolean, ByRef bHandled As 
Boolean, ByRef lReturn As Long, ByRef lng_hWnd As Long, ByRef uMsg As 
Long, ByRef wParam As Long, ByRef lParam As Long)
 
come faccio impostare valore di ritorno.
 
Carmelo


 
Facciamo un riassunto. Per avviare il subclassing (cioe' la funzione di callback)
devi seguire questi passaggi
1) chiamare la SetWindowLong passando l'handle del textbox, con il parametro GWL_WNDPROC, esempio:
hDefEditProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf EditProc)
 
2) definire la funzione di callback rispettando lo standard di window procedure, esempio:
Function EditProc(ByVal hWnd As Long, ByVal hMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
3) in quest'ultima devi intercettare il messaggio desiderato, nel tuo caso:
   Select Case hMsg
   Case WM_CONTEXTMENU
      EditProc = 0 '<---- questo e' il famoso valore di ritorno
 
   Case ....  'gestione di eventuali altri messaggi+la chiamata alla window procedure di default
      EditProc = DefWindowProc(hWnd, hMsg, wParam, lParam)
 
   Case Else
      EditProc = CallWindowProc(hDefEditProc, hWnd, hMsg, wParam, lParam)
   End Select
 
4) infine, prima di chiudere l'applicazione, devi liberare la memoria, in questo modo:
ret = SetWindowLong(hWnd, GWL_WNDPROC, hDefEditProc)
