Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 popup menu in textbox control

salve
formulo meglio la mia precedente richiesta di aiuto.
in rete ho trovato codice ma in 
vb.net
 che non conoscoancora,ma vorrei 
abbandonare vb6 e sostituirlo con 
vb.net
.
utilizzando un textbox e cliccando sul bottone destro appare il popupmenu di 
default che io vorrei sostituirlo con uno
mio personale.
leonello

leonello34 ha scritto:

Un consiglio: non aprire mai piï¿œ di un post per lo stesso argomento.
Scrivi sotto a quello che hai giï¿œ postato.
Ora veniamo al tuo problema. Non ho capito se vuoi sapere come si fa in
VB6 o in .NET.
Nicola

 Scrivi sotto a quello che hai gi� postato.


 mi dai?.
Qui non saprei aiutarti, perchï¿œ noi abbiamo l'ottimo libro di Balena in 
ufficio, ma tratta VB2005, mentre ora siamo al VB2008 (o frameword 3.5), 
con in uscita VB2010 e Framework 4.0
Nicola

poi fai Me.PopupMenu TuoMenu
Forse volevi dire MouseDown, di solito si usa quello.
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y
As Single)
If Button = vbRightButton Then
	 PopupMenu Shmnu, vbPopupMenuRightButton
End If
End Sub
--
ciao
  Stefano

 Forse volevi dire MouseDown, di solito si usa quello.
No no, intendevo proprio MouseUp.
Non � detto che all'evento mousedown corrisponda un evento mouseup sullo 
stesso controllo. Potresti infatti fare un mousedown su una casella di 
testo e spostare il mouse su un'altra.
Il comportamento standard di windows � quello di utilizzare MouseUp, 
quindi � bene conformarsi agli standard per non generare confusione 
negli utenti.
Nicola


ringrazio,ma NON e'quello che desidero.
sulla mia form ho un textbox control grande e multilinea  ,se clicco sul 
bottone destro mentre il cursore si trova all'interno del controllo textbox 
appare un SUO MENU di default .
io desidero annaullare il menu di default e farne apparire uno
disegnato da me con azioni da me stabilite.
spero ora di essermi spiegato bene.
circa il problema del mio stato di ipovisione ,al pc me la cavo bene in 
quanto utilizzo DUE monitor in contemporanea (ho installato una scheda video 
con doppia uscita VGA.
in un monitor vedo in modo normale ma non riesco a leggerci nulla causa le 
piccole dimensioni delle scritte).
sull'altro monitor vedo ingrandito per 5 ed e' come se avessi un monitor da 
100 inch,ma e' virtuale.
il software di ingrandimento fa in modo che vedo sempre 1/25 di schermo 
reale .
in conclusione una scrtta che voi normodotati vedete alta 8 mi��imetri sul 
secondo monitor la vedo alta 4 centimetri
cosi sono in grado di leggerla.
in centro schermo.
saluti
leonello

 disegnato da me con azioni da me stabilite.
http://www.vb-helper.com/howto_replace_textbox_menu.html
In breve, per evitare che esca il menu standard
devi disabilitare e riabilitare immediatamente il
controllo, per esempio nella MouseDown, cos�
dopo puoi richiamare il tuo.
TuaTextBox.Enabled = False
TuaTextBox.Enabled = True
PopupMenu TuoMenu
Bye, G.

 PopupMenu TuoMenu
Dove non arrivano le mie, limitate, conoscenze, arriva il buon Paperino :-)
Nicola

Da mettere nel Form:
'Text1 � il controllo in cui vuoi disabilitare il men� di default
Private Sub Form_Load()
    OldWindowProc = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf 
NoPopupWindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Text1.hWnd, GWL_WNDPROC, OldWindowProc
End Sub
- - - - - - - - - - - - - - - - -
Da mettere in un modulo:
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Public Const WM_CONTEXTMENU = &H7B
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" 
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal 
wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" 
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public OldWindowProc As Long
Public Function NoPopupWindowProc(ByVal hWnd As Long, ByVal msg As Long, 
ByVal wParam As Long, ByVal lParam As Long) As Long
    If msg <> WM_CONTEXTMENU Then NoPopupWindowProc = 
CallWindowProc(OldWindowProc, hWnd, msg, wParam, lParam)
End Function
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 NoPopupWindowProc)
E' un altro sistema, ma molto delicato. Se esci dal programma
senza fare l'unload e senza rimettere posto le cose, e non intendo
solo dal compilato, ma anche dall'IDE, rischi il blocco di entrambi,
programma e IDE. Altrettanto se usi pi� istanze dello stesso
controllo, e in qualche altro caso.
[Per ovviare a questi problemi si pu� usare la MsgHookEx.dll
di Balena, per esempio, o qualche equivalente (SSubTmr.dll
di Hardcore VB, la versione modificata da VbAccelerator...)].
Ma visto che c'� una soluzione semplicissima e perfettamente
sicura, in due linee di VB puro, beh...
Bye, G.

L'avevo vista anche io quella soluzione, ma sinceramente non mi � piaciuta.
Disabilitare il controllo per poi riabilitarlo subito dopo...
Sar� un mio difetto, ma propendo di pi� per le funzioni API!
E poi, quando scarichi un Form nel compilato passi necessariamente 
attraverso l'UnLoad,
quindi quello che dicevi prima non ha molto senso! Nell'IDE comportati da 
persona intelligente!
Comunque anche la tua soluzione � funzionale...
Per quanto riguarda le librerie che hai proposto, non val la pena 
aggiungerle al progetto, se questo � l'unico compito che devono svolgere. Al 
limite si potrebbe studiare il sorgente ed adattarlo alle proprie esigenze, 
importando direttamente la classe nel progetto!


 importando direttamente la classe nel progetto!
La SSubTmr.dll di vbAccellerator ti risparmia un sacco di grattacapi
proprio con questi tipi di SubClassing, evitandoti oltretutto la
menata, per via dei limiti di AddressOf, di dover mettere le funzioni
in un modulo BAS (che quando devi usarle in più posti, e soprattutto
dal codice di una classe è un grosso fastidio)
Visto che non ha altri prerequisiti da installare, è leggerisima e
free per tutti gli usi, vale la pena eccome.

 importando direttamente la classe nel progetto!
No. Mi sa che non hai ben chiaro quali siano i problemi sicuri
o potenziali, del subclassing. E' proprio nel fatto che siano
compilate come DLL esterne al programma e all'IDE, l'utilit�
di quelle funzioni. Integrarle nel progetto non avrebbe senso.
Bye, G.

 di quelle funzioni. Integrarle nel progetto non avrebbe senso.
???
Per me � semplicemente paura.
Ma ti ripeto, se usate nel modo corretto,
non danno problemi!


 casella di testo e spostare il mouse su un'altra.
1. AFAIK (in VB6) MouseDown e MouseUp corrispondono sempre, a prescindere 
dal fatto che il cursore possa trovarsi su controlli diversi in momenti 
diversi, ci� significa che viene generato l'evento MouseUp per il controllo 
su cui � stato effettuato il MouseDown, anche se quando si rilascia il mouse 
il cursore si trova su un controllo diverso (contrariamente a quanto alcuni 
credono).
2. in questo specifico caso usando MouseUp non � possibile sopprimere il 
menu default utilizzando la tecnica di disabilitazione del textbox, mentre 
con MouseDown s�.
A questo proposito consiglio di procedere come suggerito dallo stesso 
supporto Microsoft: 
http://support.microsoft.com/kb/191670
(la soluzione ottimale � leggermente pi� complessa di quella di Paperino, ma 
il succo � quello)
Bye
Raf