Newsgroup: it.comp.lang.visual-basic
Titolo: [.Net] "Assorbire" eventi in classe ereditata

Ciao.
Se creo un controllo che eredita da un controllo esistente per esempio
Inherits System.Windows.Forms.ComboBox
è possibile fare in modo che alcuni eventi non vengano gestiti dalla classe
base?
Per esempio, io vorrei intercettare il click del mouse ed evitare che venga
aperta la lista quando si preme sulla freccia.
Grazie.
Skysurfer


 Skysurfer racconta in giro che

Altra strada per Read-Only? ;)
bisognerebbe capire se puoi scrivere una cosa di questo tipo
Protected Overrides Sub OnClick(ByVal e ...............)
e.handled=true
end sub
Handled dice al sistema se deve o meno gestire l'evento ,per farti un
esempio è simile al concetto di Cancel=true per gli eventi x_Validate in VB6
Ciao
Alessandro
--
Morfeus®
Free Joint
:PII

 end sub
Nein! :)
Basta che eviti di richiamare MyBase.OnClick e non importa che valore dai a
e.handled!
                    Ciao
                                                Allanon
--
- SPAMKILLER
 L'indirizzo delle risposte é 
itlangv...@michele.sytes.net
 LASCIATE il NOSPAM fa parte dell'indirizzo :-)
  Per superare le impostazioni di protezione antispam scrivete
  nel testo del messaggio la scritta "SPAMKILLER"
Scusate il disturbo, ma non posso più di pubblicità

Fai l'override dei vari metodi OnXXX in modo da gestire ed eventualmente
delegare gli eventi generati dalla base class
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - 
http://www.ugidotnet.org

 esempio è simile al concetto di Cancel=true per gli eventi x_Validate in
VB6
Eh no... non mi pare che ci sia. C'è per quanto riguarda l'evento KeyPress
(tra l'altro ho visto che c'è un bug nell'evento KeyPress proprio del
ComboBox che non gestisce correttamente e.handle=true!), ma non ce n'è
traccia per quanto riguarda il mouse.
Grazie e ciao.
Skysurfer

                                                 Allanon
Ciao
Allanon
P.S. Hai ricevuto la mia e-mail?


 e.handled!
Ahime', credevo anch'io fosse cosi' semplice ma...
Public Class ComboTest
    Inherits System.Windows.Forms.ComboBox
    Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)
        Debug.WriteLine("OnDropDown")
    End Sub
    Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
        Debug.WriteLine("OnClick")
    End Sub
End Class
quello che succede e' che, piazzando su una form un istanza di ComboTest, i
rispettivi eventi non vengono effettivamente scatenati, ma per quanto
riguarda la lista, viene giu' allegramente.
Ci ho speso giusto 2 minuti, ma mi sa che bisogna subclassare...
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

Grazie a tutti per le risposte, ma non sono riuscito a risolvere il
problema.
La cosa più vicina al risultato è stata questa:
Protected Overrides Sub OnMouseDown(ByVal e As
System.Windows.Forms.MouseEventArgs)
    If m_SolaLettura Then
        MyBase.DroppedDown = False
    End If
End Sub
Così facendo la lista non si vede ma c'è!!!!!
Infatti se clicco sotto alla riga principale, mi seleziona il testo
(invisibile) che si trova in quella posizione!!!
Adesso sto provando con il subclassing.
Anche qui però succede una cosa strana. Viene visualizzata una riga sotto al
ComboBox, che rimane lì finchè non si clicca da un'altra parte.
Forse sbaglio qualcosa...
Secondo me una soluzione (anche se un pò brutale) potrebbe essere quella di
inviare un altro click, in modo che la lista venga chiusa. Ma come si fa a
mandare un click specificando le coordinate del mouse?
Grazie e ciao.
Skysurfer

 Forse sbaglio qualcosa...
Ehehhh... Immagino che tu fai circa così:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  If Not m.Msg = 8465 Then
    MyBase.WndProc(m)
  End If
End Sub
Sostituisci l'If con questo che credo blocchi Click e doppio click sul tasto
e vedrai che non compare... :)
If Not m.Msg = 513 AndAlso Not m.Msg = 515 Then 'Click e doppio click sul
tasto?
  MyBase.WndProc(m)
End If
Non giuro che funzioni e se il tuo PC esplode non morirò sulle sue ceneri
(ovvero: quando subclasso non mi fido di niente, questo post é "as is")


 (ovvero: quando subclasso non mi fido di niente, questo post é "as is")
Ribadisco! :)



Ciao...
ieri sono rimasto alzato fino a dopo mezzanotte, ho provato e riprovato con
il subclassing, prima studiandomi tutti i messaggi inviati quando facevo
click cul controllo, poi cercando di "eliminare" i messaggi che non mi
servivano. Risultato, la riga compariva sempre ed ho avuto una notte agitata
:)
Adesso provo con i tuoi suggerimenti.
Grazie.
Skysurfer

                 Ciao
Vaaaiiiiiii..... funzionaaaaa!!!
Se solo avessi letto il tuo post ieri sera mi sarei risparmiato una notte
insonne!!!
Anche io in genere non mi fido molto del subclassing, almeno per quanto
riguarda vb6, visto che in .Net non l'avevo mai provato.
Qui però sembra funzionare tutto senza problemi.
Ma una curiosità: come hai fatto a far saltar fuori quei numeri (513, 515,
8465) da intercettare? Dove li hai trovati?
Grazie ancora
Skysurfer

 Grazie ancora
Eheheh... "Sporco Trucco(tm)"... :)
C'é una classe che simula uno Stack in System.Collection
Ad ogni passaggio nella WndProc memorizzavo il messaggio nello Stack, ho
fatto un po' di prove e ho riletto i messaggi nello stack ed ho trovato
subito il 513. Poi facendo altre prove mi sono sfuggiti 2 click veloci ed ho
trovato il 515... Ah, non l'ho detto, ma ovviamente leggevo i messaggi
ricevuti all' override di OnDropDown (ovvero se scendeva il DropDown! ;) )
                    Ciao
                                                Allanon (il re della Sporca
Programmazione)


ricevuti all' override di OnDropDown (ovvero se scendeva il DropDown! ;) )
Ora pero' abbiate pieta' di chi in futuro dovra' manutenere il 
codice ;-)
Il 513, 515, ecc... sono questi messaggi:
#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209
-- 
ciao, hal

 #define WM_MBUTTONDBLCLK                0x0209
Ottimo... :)
Ma, per curiosità... Dove trovi queste costanti?
C'é un bell'elenco dei messaggi che un controllo può produrre/ricevere?
                            Ciao & grazie!
                                                            Allanon


Elenco considera le sbavature del Copia/Incolla
#define WM_NULL                         0x0000
#define WM_CREATE                       0x0001
#define WM_DESTROY                      0x0002
#define WM_MOVE                         0x0003
#define WM_SIZE                         0x0005
#define WM_ACTIVATE                     0x0006
#define WM_SETFOCUS                     0x0007
#define WM_KILLFOCUS                    0x0008
#define WM_ENABLE                       0x000A
#define WM_SETREDRAW                    0x000B
#define WM_SETTEXT                      0x000C
#define WM_GETTEXT                      0x000D
#define WM_GETTEXTLENGTH                0x000E
#define WM_PAINT                        0x000F
#define WM_CLOSE                        0x0010
#define WM_QUERYENDSESSION              0x0011
#define WM_QUIT                         0x0012
#define WM_QUERYOPEN                    0x0013
#define WM_ERASEBKGND                   0x0014
#define WM_SYSCOLORCHANGE               0x0015
#define WM_ENDSESSION                   0x0016
#define WM_SHOWWINDOW                   0x0018
#define WM_WININICHANGE                 0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE                WM_WININICHANGE
#endif /* WINVER >= 0x0400 */
#define WM_DEVMODECHANGE                0x001B
#define WM_ACTIVATEAPP                  0x001C
#define WM_FONTCHANGE                   0x001D
#define WM_TIMECHANGE                   0x001E
#define WM_CANCELMODE                   0x001F
#define WM_SETCURSOR                    0x0020
#define WM_MOUSEACTIVATE                0x0021
#define WM_CHILDACTIVATE                0x0022
#define WM_QUEUESYNC                    0x0023
#define WM_GETMINMAXINFO                0x0024
// end_r_winuser
/*
* Struct pointed to by WM_GETMINMAXINFO lParam
*/
typedef struct tagMINMAXINFO {
   POINT ptReserved;
   POINT ptMaxSize;
   POINT ptMaxPosition;
   POINT ptMinTrackSize;
   POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
// begin_r_winuser
#define WM_PAINTICON                    0x0026
#define WM_ICONERASEBKGND               0x0027
#define WM_NEXTDLGCTL                   0x0028
#define WM_SPOOLERSTATUS                0x002A
#define WM_DRAWITEM                     0x002B
#define WM_MEASUREITEM                  0x002C
#define WM_DELETEITEM                   0x002D
#define WM_VKEYTOITEM                   0x002E
#define WM_CHARTOITEM                   0x002F
#define WM_SETFONT                      0x0030
#define WM_GETFONT                      0x0031
#define WM_SETHOTKEY                    0x0032
#define WM_GETHOTKEY                    0x0033
#define WM_QUERYDRAGICON                0x0037
#define WM_COMPAREITEM                  0x0039
#if(WINVER >= 0x0500)
#define WM_GETOBJECT                    0x003D
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING                   0x0041
#define WM_COMMNOTIFY                   0x0044  /* no longer suported */
#define WM_WINDOWPOSCHANGING            0x0046
#define WM_WINDOWPOSCHANGED             0x0047
#define WM_POWER                        0x0048
#define WM_COPYDATA                     0x004A
#define WM_CANCELJOURNAL                0x004B
// end_r_winuser
/*
* lParam of WM_COPYDATA message points to...
*/
typedef struct tagCOPYDATASTRUCT {
   DWORD dwData;
   DWORD cbData;
   PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
// begin_r_winuser
#if(WINVER >= 0x0400)
#define WM_NOTIFY                       0x004E
#define WM_INPUTLANGCHANGEREQUEST       0x0050
#define WM_INPUTLANGCHANGE              0x0051
#define WM_TCARD                        0x0052
#define WM_HELP                         0x0053
#define WM_USERCHANGED                  0x0054
#define WM_NOTIFYFORMAT                 0x0055
#define NFR_ANSI                             1
#define NFR_UNICODE                          2
#define NF_QUERY                             3
#define NF_REQUERY                           4
#define WM_CONTEXTMENU                  0x007B
#define WM_STYLECHANGING                0x007C
#define WM_STYLECHANGED                 0x007D
#define WM_DISPLAYCHANGE                0x007E
#define WM_GETICON                      0x007F
#define WM_SETICON                      0x0080
#endif /* WINVER >= 0x0400 */
#define WM_NCCREATE                     0x0081
#define WM_NCDESTROY                    0x0082
#define WM_NCCALCSIZE                   0x0083
#define WM_NCHITTEST                    0x0084
#define WM_NCPAINT                      0x0085
#define WM_NCACTIVATE                   0x0086
#define WM_GETDLGCODE                   0x0087
#define WM_SYNCPAINT                    0x0088
#define WM_NCMOUSEMOVE                  0x00A0
#define WM_NCLBUTTONDOWN                0x00A1
#define WM_NCLBUTTONUP                  0x00A2
#define WM_NCLBUTTONDBLCLK              0x00A3
#define WM_NCRBUTTONDOWN                0x00A4
#define WM_NCRBUTTONUP                  0x00A5
#define WM_NCRBUTTONDBLCLK              0x00A6
#define WM_NCMBUTTONDOWN                0x00A7
#define WM_NCMBUTTONUP                  0x00A8
#define WM_NCMBUTTONDBLCLK              0x00A9
#define WM_KEYFIRST                     0x0100
#define WM_KEYDOWN                      0x0100
#define WM_KEYUP                        0x0101
#define WM_CHAR                         0x0102
#define WM_DEADCHAR                     0x0103
#define WM_SYSKEYDOWN                   0x0104
#define WM_SYSKEYUP                     0x0105
#define WM_SYSCHAR                      0x0106
#define WM_SYSDEADCHAR                  0x0107
#define WM_KEYLAST                      0x0108
#if(WINVER >= 0x0400)
#define WM_IME_STARTCOMPOSITION         0x010D
#define WM_IME_ENDCOMPOSITION           0x010E
#define WM_IME_COMPOSITION              0x010F
#define WM_IME_KEYLAST                  0x010F
#endif /* WINVER >= 0x0400 */
#define WM_INITDIALOG                   0x0110
#define WM_COMMAND                      0x0111
#define WM_SYSCOMMAND                   0x0112
#define WM_TIMER                        0x0113
#define WM_HSCROLL                      0x0114
#define WM_VSCROLL                      0x0115
#define WM_INITMENU                     0x0116
#define WM_INITMENUPOPUP                0x0117
#define WM_MENUSELECT                   0x011F
#define WM_MENUCHAR                     0x0120
#define WM_ENTERIDLE                    0x0121
#if(WINVER >= 0x0500)
#define WM_MENURBUTTONUP                0x0122
#define WM_MENUDRAG                     0x0123
#define WM_MENUGETOBJECT                0x0124
#define WM_UNINITMENUPOPUP              0x0125
#define WM_MENUCOMMAND                  0x0126
#endif /* WINVER >= 0x0500 */
#define WM_CTLCOLORMSGBOX               0x0132
#define WM_CTLCOLOREDIT                 0x0133
#define WM_CTLCOLORLISTBOX              0x0134
#define WM_CTLCOLORBTN                  0x0135
#define WM_CTLCOLORDLG                  0x0136
#define WM_CTLCOLORSCROLLBAR            0x0137
#define WM_CTLCOLORSTATIC               0x0138
#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL                   0x020A
#define WM_MOUSELAST                    0x020A
#else
#define WM_MOUSELAST                    0x0209
#endif /* if (_WIN32_WINNT < 0x0400) */
#if(_WIN32_WINNT >= 0x0400)
#define WHEEL_DELTA                     120     /* Value for rolling one
detent */
#endif /* _WIN32_WINNT >= 0x0400 */
#if(_WIN32_WINNT >= 0x0400)
#define WHEEL_PAGESCROLL                (UINT_MAX) /* Scroll one page */
#endif /* _WIN32_WINNT >= 0x0400 */
#define WM_PARENTNOTIFY                 0x0210
#define WM_ENTERMENULOOP                0x0211
#define WM_EXITMENULOOP                 0x0212
#if(WINVER >= 0x0400)
#define WM_NEXTMENU                     0x0213
// end_r_winuser
typedef struct tagMDINEXTMENU
{
   HMENU   hmenuIn;
   HMENU   hmenuNext;
   HWND    hwndNext;
} MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
// begin_r_winuser
#define WM_SIZING                       0x0214
#define WM_CAPTURECHANGED               0x0215
#define WM_MOVING                       0x0216
// end_r_winuser
#define WM_POWERBROADCAST               0x0218      // r_winuser pbt
// begin_pbt
#define PBT_APMQUERYSUSPEND             0x0000
#define PBT_APMQUERYSTANDBY             0x0001
#define PBT_APMQUERYSUSPENDFAILED       0x0002
#define PBT_APMQUERYSTANDBYFAILED       0x0003
#define PBT_APMSUSPEND                  0x0004
#define PBT_APMSTANDBY                  0x0005
#define PBT_APMRESUMECRITICAL           0x0006
#define PBT_APMRESUMESUSPEND            0x0007
#define PBT_APMRESUMESTANDBY            0x0008
#define PBTF_APMRESUMEFROMFAILURE       0x00000001
#define PBT_APMBATTERYLOW               0x0009
#define PBT_APMPOWERSTATUSCHANGE        0x000A
#define PBT_APMOEMEVENT                 0x000B
#define PBT_APMRESUMEAUTOMATIC          0x0012
// end_pbt
// begin_r_winuser
#define WM_DEVICECHANGE                 0x0219
#endif /* WINVER >= 0x0400 */
#define WM_MDICREATE                    0x0220
#define WM_MDIDESTROY                   0x0221
#define WM_MDIACTIVATE                  0x0222
#define WM_MDIRESTORE                   0x0223
#define WM_MDINEXT                      0x0224
#define WM_MDIMAXIMIZE                  0x0225
#define WM_MDITILE                      0x0226
#define WM_MDICASCADE                   0x0227
#define WM_MDIICONARRANGE               0x0228
#define WM_MDIGETACTIVE                 0x0229
#define WM_MDISETMENU                   0x0230
#define WM_ENTERSIZEMOVE                0x0231
#define WM_EXITSIZEMOVE                 0x0232
#define WM_DROPFILES                    0x0233
#define WM_MDIREFRESHMENU               0x0234
#if(WINVER >= 0x0400)
#define WM_IME_SETCONTEXT               0x0281
#define WM_IME_NOTIFY                   0x0282
#define WM_IME_CONTROL                  0x0283
#define WM_IME_COMPOSITIONFULL          0x0284
#define WM_IME_SELECT                   0x0285
#define WM_IME_CHAR                     0x0286
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define WM_IME_REQUEST                  0x0288
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
#define WM_IME_KEYDOWN                  0x0290
#define WM_IME_KEYUP                    0x0291
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WINNT >= 0x0400)
#define WM_MOUSEHOVER                   0x02A1
#define WM_MOUSELEAVE                   0x02A3
#endif /* _WIN32_WINNT >= 0x0400 */
#define WM_CUT                          0x0300
#define WM_COPY                         0x0301
#define WM_PASTE                        0x0302
#define WM_CLEAR                        0x0303
#define WM_UNDO                         0x0304
#define WM_RENDERFORMAT                 0x0305
#define WM_RENDERALLFORMATS             0x0306
#define WM_DESTROYCLIPBOARD             0x0307
#define WM_DRAWCLIPBOARD                0x0308
#define WM_PAINTCLIPBOARD               0x0309
#define WM_VSCROLLCLIPBOARD             0x030A
#define WM_SIZECLIPBOARD                0x030B
#define WM_ASKCBFORMATNAME              0x030C
#define WM_CHANGECBCHAIN                0x030D
#define WM_HSCROLLCLIPBOARD             0x030E
#define WM_QUERYNEWPALETTE              0x030F
#define WM_PALETTEISCHANGING            0x0310
#define WM_PALETTECHANGED               0x0311
#define WM_HOTKEY                       0x0312
#if(WINVER >= 0x0400)
#define WM_PRINT                        0x0317
#define WM_PRINTCLIENT                  0x0318
#define WM_HANDHELDFIRST                0x0358
#define WM_HANDHELDLAST                 0x035F
#define WM_AFXFIRST                     0x0360
#define WM_AFXLAST                      0x037F
#endif /* WINVER >= 0x0400 */
#define WM_PENWINFIRST                  0x0380
#define WM_PENWINLAST                   0x038F
#if(WINVER >= 0x0400)
#define WM_APP                          0x8000
#endif /* WINVER >= 0x0400 */


[Morfeus®] scrisse:
(snip)
Lodevole iniziativa, davvero.
Però....
imho, in questi casi, cioè quando si devono postare informazioni molto
pesanti, sarebbe meglio "raccontare" dove si trovano (link vari) piuttosto
che spedire 13k di post.
Salutoni
Sergio

Sorry . avevo tutto su un txt e crecare il link mi seccava un pochino


 C'é un bell'elenco dei messaggi che un controllo può produrre/ricevere?
L'elenco mi dispiace averlo postato a quel modo ma questo link è utilissimo
prova a dargli un occhiatina
http://www.rohitab.com/apimonitor/
Ciao
Alessandro
P.S. il 28 si avvicina ;)


 
http://www.rohitab.com/apimonitor/
A parte l'utilità indiscussa di questa *utiliy*,tra l'altro nota ai più, mi
scuso per il lapsus freudiano mi ricordavo qualcosa tipo *apifunction*.
In effetti questo nome è il nome di una classe di questo progetto
http://www.freevbcode.com/ShowCode.Asp?ID=2546
Dove viene applicata una suddivisione dei vari messaggi, tra i più comuni
spero che in tutta questa confusione,sorry, sono stato di aiuto(avevo tutto
su un file ma)
Ciao
Alessandro


 P.S. il 28 si avvicina ;)
Ahahahahhhhh... :)
Se perdiamo mi presentererò solo sotto mentite spoglie nel NG per un'intera
settimana...
Tra colleghi siamo già d'accordo:
5 milani e 5 juventini... I perdenti pagano una bottiglia di sforzato (a
scelta tra gli sforzati di valtellina) -a testa-!!!! :)
                            Ciao


                                             Allanon
Ciao
Alessandro
