Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Subclassing di un Combo - Interpretare i messaggi

Sempre alle prese con l'aggiunta degli eventi MouseUp,
Down e Move su ComboBox, sto facendo qualche
esperimento con il subclassing.   Tutto sembra ok, e mi
pare sia la strada giusta, perchè posso intercettare gli
eventi che mi interessano.
Ora la domanda: Esiste qualche documentazione o
tabella che elenchi ed eventualmente descriva tali
messaggi ?   (Tipo messaggio, parametri, ecc.)
Ho cercato sull'help di VB, ma ovviamente niente....
Nemmeno su un help delle API che ho... nulla.
Grazie
--
Frogman
indirizzo e-mail corretto: 
be...@reboot.to
--------------------------------------------------------
Abito in un paese cosi' piccolo che non abbiamo nemmeno
lo scemo del villaggio.  Dobbiamo fare a turno.
--------------------------------------------------------

 Nemmeno su un help delle API che ho... nulla.
*********
WinUser.h
*********
/*
 * Combo Box return Values
 */
#define CB_OKAY             0
#define CB_ERR              (-1)
#define CB_ERRSPACE         (-2)
/*
 * Combo Box Notification Codes
 */
#define CBN_ERRSPACE        (-1)
#define CBN_SELCHANGE       1
#define CBN_DBLCLK          2
#define CBN_SETFOCUS        3
#define CBN_KILLFOCUS       4
#define CBN_EDITCHANGE      5
#define CBN_EDITUPDATE      6
#define CBN_DROPDOWN        7
#define CBN_CLOSEUP         8
#define CBN_SELENDOK        9
#define CBN_SELENDCANCEL    10
#ifndef NOWINSTYLES
/*
 * Combo Box styles
 */
#define CBS_SIMPLE            0x0001L
#define CBS_DROPDOWN          0x0002L
#define CBS_DROPDOWNLIST      0x0003L
#define CBS_OWNERDRAWFIXED    0x0010L
#define CBS_OWNERDRAWVARIABLE 0x0020L
#define CBS_AUTOHSCROLL       0x0040L
#define CBS_OEMCONVERT        0x0080L
#define CBS_SORT              0x0100L
#define CBS_HASSTRINGS        0x0200L
#define CBS_NOINTEGRALHEIGHT  0x0400L
#define CBS_DISABLENOSCROLL   0x0800L
#if(WINVER >= 0x0400)
#define CBS_UPPERCASE           0x2000L
#define CBS_LOWERCASE           0x4000L
#endif /* WINVER >= 0x0400 */
#endif  /* !NOWINSTYLES */
/*
 * Combo Box messages
 */
#ifndef NOWINMESSAGES
#define CB_GETEDITSEL               0x0140
#define CB_LIMITTEXT                0x0141
#define CB_SETEDITSEL               0x0142
#define CB_ADDSTRING                0x0143
#define CB_DELETESTRING             0x0144
#define CB_DIR                      0x0145
#define CB_GETCOUNT                 0x0146
#define CB_GETCURSEL                0x0147
#define CB_GETLBTEXT                0x0148
#define CB_GETLBTEXTLEN             0x0149
#define CB_INSERTSTRING             0x014A
#define CB_RESETCONTENT             0x014B
#define CB_FINDSTRING               0x014C
#define CB_SELECTSTRING             0x014D
#define CB_SETCURSEL                0x014E
#define CB_SHOWDROPDOWN             0x014F
#define CB_GETITEMDATA              0x0150
#define CB_SETITEMDATA              0x0151
#define CB_GETDROPPEDCONTROLRECT    0x0152
#define CB_SETITEMHEIGHT            0x0153
#define CB_GETITEMHEIGHT            0x0154
#define CB_SETEXTENDEDUI            0x0155
#define CB_GETEXTENDEDUI            0x0156
#define CB_GETDROPPEDSTATE          0x0157
#define CB_FINDSTRINGEXACT          0x0158
#define CB_SETLOCALE                0x0159
#define CB_GETLOCALE                0x015A
#if(WINVER >= 0x0400)
#define CB_GETTOPINDEX              0x015b
#define CB_SETTOPINDEX              0x015c
#define CB_GETHORIZONTALEXTENT      0x015d
#define CB_SETHORIZONTALEXTENT      0x015e
#define CB_GETDROPPEDWIDTH          0x015f
#define CB_SETDROPPEDWIDTH          0x0160
#define CB_INITSTORAGE              0x0161
#if(_WIN32_WCE >= 0x0400)
#define CB_MULTIPLEADDSTRING        0x0163
#endif
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WCE >= 0x0400)
#define CB_MSGMAX                   0x0163
#elif(WINVER >= 0x0400)
#define CB_MSGMAX                   0x0162
#else
#define CB_MSGMAX                   0x015B
#endif
#endif  /* !NOWINMESSAGES */
--
Ciao.
Maurizio
--------
?SPQR(C)
 X


Lasciate stare, ho trovato tutto quello che mi serve.
Grazie comunque



Grazie, ma nel frattempo ho trovato.... solo che io sto usando
i messaggi che windows invia al combo, relativi al movimento
del mouse, e cioe':
Const WM_MOUSEFIRST = &H200
Const WM_MOUSEMOVE = &H200
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
Const WM_LBUTTONDBLCLK = &H203
Const WM_RBUTTONDOWN = &H204
Const WM_RBUTTONUP = &H205
Const WM_RBUTTONDBLCLK = &H206
Const WM_MBUTTONDOWN = &H207
Const WM_MBUTTONUP = &H208
Const WM_MBUTTONDBLCLK = &H209
Const WM_MOUSELAST = &H209
sono quelli e funzionano....
Solo che ora ho un altro problema....
nel mio progettino di ocx ho inserito un ctl con un combo, e
nell'evento activate ho fatto il subclassing del combo delegando
una routine per intercettare i messaggi.   Per via delle limitazioni
dell'AddressOf ho dovuto inserire la mia routine in un modulo
bas nel progetto.    Quando questo rileva i messaggi che mi
interessano, dovrebbe chiamare una sub interna al modulo ctl
affinche' questo possa fare il RaiseEvent.
Il guaio e' che non riesco assolutamente a richiamare alcuna sub
interna al ctl...  sto diventando matto....
Grazie


interna al ctl...  sto diventando matto....
Puoi usare l'evento KeyDown del controllo
'Nel modulo
Public hWndCombo As Long
Call SendMessage(hWndCombo, WM_KEYDOWN, MY_MESSAGE, MY_PARAM)
'Nel Controllo
Sub Usercontrol_KeyDown
    Select Case KeyCode
    Case MY_MESSAGE_1
        RaiseEvent MyEvent
    ...
    EndSelect
End Sub
Ciao


Ti ringrazio, e' molto probabile che funzioni, anzi funziona
sicuramente....
Quindi, se ho capito bene, nel modulo bas, nella stessa
routine che intercetta i messaggi dovrei inviare un altro
messaggio al combo...
messaggio che ovviamente intercettera' anche lei, ma
lascera' passare, mentre nel controllo il combo la riceve e
la interpreta come segnale per lanciare l'evento... ma mi
mancano i parametri...
Button lo posso codificare nel KeyCode, Shift e' tal quale,
ma i parametri X e Y come glieli passo ?  Anche infilandoli
entrambi in un long (cosi' come li ho ricevuti) non so come
passarli al KeyDown.... Potrei fare tre messaggi successivi
(KeyDown riceve due parametri integer) che nel KeyDown
posso collezionare per poi inviare l'evento quando le info
sono complete...  ti sembra la strada giusta ?
Sigh
Mi chiedo se e' giusto ridursi a fare di queste acrobazie
Senza contare che non riesco neanche a far passare la
property Style...  e' read only, a design time nel combo la
si puo' modificare, ma se lo includo in un mio controllo mi
impedisce di settarla replicando la proprieta'.   acci..
Cmq gia' son contento di sapere che non ero io a scrivere
cacchiate, ma che proprio non si puo' da un modulo bas
lanciare una routine nel modulo ctl.   Unito alla limitazione
dell'AddressOf, fare subclassing per fare un OCX wrapper
e' un lavoro da macellai acrobati.
Scusa lo sfogo, ma a me piace il codice pulito, ordinato e
rigorosamente gerarchico.    Sto VB mi sta deludendo.
Grazie infinite come sempre per la tua disponibilita'
(e scusa lo sfogo)
Ciao


(e scusa lo sfogo)
A volte è bello sapere che c'è qualcuno che sta messo peggio di te :)
Magra consolazione vero?
Ciao


Mal comune..... Facciamo la gara ?
comunque grazie ancora, seguiro' la proposta n. 2...
Quando ho letto la 1 (quella col file) son caduto e ho rotto
la sedia.
Me la paghi tu la riparazione adesso?  ;-)
Ciao!


 interna al ctl...  sto diventando matto....
nel modulo:
Public inst As NomeControllo
nel controllo:
Private Sub UserControl_Initialize()
    Set inst = Me
End Sub
è l'unico modo che mi è venuto in mente :(


Ah... non ho provato...  ma non credo che Me venga accettato in un
controllo...   Cmq provo poi ti dico..
Grazie mille nel frattempo !!!
--
Frogman
indirizzo e-mail corretto: 
be...@reboot.to
--------------------------------------------------------
Non fate i bambini in provetta.
Fateli nella zuppiera che ce ne stanno di piu'.
--------------------------------------------------------