Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VB6 popup menu in textbox control

158 views
Skip to first unread message

leonello34

unread,
Aug 16, 2009, 9:41:13 AM8/16/09
to
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


Nicola Ottomano

unread,
Aug 16, 2009, 1:06:29 PM8/16/09
to
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

leonello34

unread,
Aug 17, 2009, 3:40:54 AM8/17/09
to
lo voglio sapere come si fa in vb6.
per quanto riguarda vb.net ho una forte intenzione a cominciare ad imparare
ad usarlo ed abbandonare vb6,ma ho dei seri problemi di vista xche sono un
ipovedente grave e non sono piu in grado di leggere libri stampati.
per leggere dovrei trovare un testo in formato elettronioco cosi lo
ingrandisco oascolto con voce sintetizzata..
per quanto cercare un testo che spighi vb.net ed il framework chee consigli
mi dai?.
leonello
"Nicola Ottomano" <spam...@nicolaottomano.it> ha scritto nel messaggio
news:4a883c90$0$704$5fc...@news.tiscali.it...

> leonello34 ha scritto:
>> 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
>
> Un consiglio: non aprire mai pi� di un post per lo stesso argomento.
> Scrivi sotto a quello che hai gi� postato.

Nicola Ottomano

unread,
Aug 17, 2009, 4:19:31 AM8/17/09
to
Il 17/08/2009 9.40, leonello34 ha scritto:
> lo voglio sapere come si fa in vb6.

Intercetti la pressione del tasto destro del mouse (evento MouseUp) e
poi fai Me.PopupMenu TuoMenu


> per quanto riguarda vb.net ho una forte intenzione a cominciare ad imparare
> ad usarlo ed abbandonare vb6,ma ho dei seri problemi di vista xche sono un
> ipovedente grave e non sono piu in grado di leggere libri stampati.
> per leggere dovrei trovare un testo in formato elettronioco cosi lo
> ingrandisco oascolto con voce sintetizzata..

C'era un ragazzo da noi alle superiori che era ipovedente grave.
Utilizzava uno screenreader per leggere le cose a schermo e una specie
di "proiettore" dove da una parte si poggiava il foglio (o il libro) e
dall'altra se ne vedeva l'immagine fortemente ingrandita.


> per quanto cercare un testo che spighi vb.net ed il framework chee consigli
> 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

SB

unread,
Aug 17, 2009, 4:52:33 AM8/17/09
to
Il giorno Mon, 17 Aug 2009 10:19:31 +0200, Nicola Ottomano
<spam...@nicolaottomano.it> ha scritto:

>Il 17/08/2009 9.40, leonello34 ha scritto:
>> lo voglio sapere come si fa in vb6.
>
>Intercetti la pressione del tasto destro del mouse (evento MouseUp) e
>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

Nicola Ottomano

unread,
Aug 17, 2009, 6:34:25 AM8/17/09
to
Il 17/08/2009 10.52, SB ha scritto:
> Il giorno Mon, 17 Aug 2009 10:19:31 +0200, Nicola Ottomano
> <spam...@nicolaottomano.it> ha scritto:
>
>> Il 17/08/2009 9.40, leonello34 ha scritto:
>>> lo voglio sapere come si fa in vb6.
>>
>> Intercetti la pressione del tasto destro del mouse (evento MouseUp) e
>> poi fai Me.PopupMenu TuoMenu
>
> 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


leonello34

unread,
Aug 17, 2009, 9:17:16 AM8/17/09
to

>
> 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


Paperino

unread,
Aug 17, 2009, 9:25:55 AM8/17/09
to
"leonello34" ha scritto

> 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.

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.


Nicola Ottomano

unread,
Aug 17, 2009, 10:29:20 AM8/17/09
to
Il 17/08/2009 15.25, Paperino ha scritto:

> 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

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

Nicola

Tiscali

unread,
Aug 17, 2009, 10:54:25 AM8/17/09
to
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


Paperino

unread,
Aug 17, 2009, 6:25:23 PM8/17/09
to
"Tiscali" ha scritto

> 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)

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.


Tiscali

unread,
Aug 18, 2009, 9:00:01 AM8/18/09
to
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!

Luca D

unread,
Aug 18, 2009, 3:45:31 PM8/18/09
to
On Aug 18, 3:00 pm, "Tiscali" <melis.federico...@tiscali.it> wrote:
> 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!

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.

Paperino

unread,
Aug 20, 2009, 6:28:02 PM8/20/09
to
"Tiscali" ha scritto

> L'avevo vista anche io quella soluzione, ma sinceramente non mi � piaciuta.
> Disabilitare il controllo per poi riabilitarlo subito dopo...

E' quella consigliata dalla Microsoft nella vecchia KB. E, anche
se non lo si capisce subito, ha un senso abbastanza logico
per chi conosce gli internals dell'interfaccia di Windows.

> Sar� un mio difetto, ma propendo di pi� per le funzioni API!

Se ce n'� bisogno per qualche motivo, anch'io.

> E poi, quando scarichi un Form nel compilato passi necessariamente
> attraverso l'UnLoad,

No.

> quindi quello che dicevi prima non ha molto senso! Nell'IDE
> comportati da persona intelligente!

Famm capire: rinunciare per esempio ad usare il break and
continue, che � forse la caratteristica pi� utile dell'IDE di VB,
perch� usandolo potrebbe piantarsi tutto, lo consideri intellligente ?

> 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!

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.


Tiscali

unread,
Aug 20, 2009, 10:49:30 PM8/20/09
to
Paperino ha scritto...

>> E poi, quando scarichi un Form nel compilato passi necessariamente
>> attraverso l'UnLoad,
>
> No.

Perch� no?

>> quindi quello che dicevi prima non ha molto senso! Nell'IDE
>> comportati da persona intelligente!
>

> Fammi capire: rinunciare per esempio ad usare il break and


> continue, che � forse la caratteristica pi� utile dell'IDE di VB,
> perch� usandolo potrebbe piantarsi tutto, lo consideri intellligente ?

A me non si � mai piantato niente!
Metti in pausa, correggi e riparti.
Se fermi l'applicazione, non premi STOP,
ma esci in maniera corretta!

>> 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!
>
> 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.

???

Per me � semplicemente paura.
Ma ti ripeto, se usate nel modo corretto,
non danno problemi!

Rafunk

unread,
Aug 26, 2009, 8:30:59 AM8/26/09
to
Nicola Ottomano wrote:
> Il 17/08/2009 10.52, SB ha scritto:
>> Il giorno Mon, 17 Aug 2009 10:19:31 +0200, Nicola Ottomano
>> <spam...@nicolaottomano.it> ha scritto:
>>
>>> Il 17/08/2009 9.40, leonello34 ha scritto:
>>>> lo voglio sapere come si fa in vb6.
>>>
>>> Intercetti la pressione del tasto destro del mouse (evento MouseUp)
>>> e poi fai Me.PopupMenu TuoMenu
>>
>> Forse volevi dire MouseDown, di solito si usa quello.
>
> No no, intendevo proprio MouseUp.

Scusate se "arrivo dopo la puzza", ma io credo che abbia ragione SB.
Per 2 motivi:

> 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.

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


0 new messages