L'aggiunta di eventi click / doppio clic sull'icona per controlli di casella di gruppo statico

StackOverflow https://stackoverflow.com/questions/2541714

Domanda

Dopo aver realizzato le mie ragioni erano troppo dubbia, ora ho andato su questo un modo diverso. Ma io sono ancora curioso ...

Per motivi di nostalgia, la familiarità e la pigrizia, mi sto codifica un'interfaccia utente con MFC. Per motivi di dubbie (come se quelli non bastasse), ho voluto aggiungere un (doppio) cliccare evento per una casella di gruppo. Naturalmente, la casella di gruppo contiene le cose - in realtà, contiene un altro elemento statico, a cui posso aggiungere un successo (doppio) cliccare gestore di eventi

.

C'è qualche motivo non riesco a ottenere un gestore di eventi di lavorare per i clic sulla mia casella di gruppo allo stesso modo posso farlo per il semplice elemento statico di testo? Nessuna quantità di cliccando su, nella zona di fuochi di controllo l'evento.

Nota - Ho letto attraverso http://www.codeproject.com/ KB / static / staticctrl_tut.aspx e ho cercato di rispondere ad entrambe le ON_STN _... eventi e messaggi ON_BN _..., impostare lo stile di notificare (BS_NOTIFY appare nel file rc) ... e ancora mi manca qualcosa - che cos'è? E 'anche possibile? La maggior parte di quello che ho su Google suggerisce che è ... ma senza risposte chiare per C ++ / MFC.

Dal primo distacco a questa domanda, ho trovato riferimento ad un messaggio WM_NCHITTEST, e suggerimenti che si deve creare un gestore per questo messaggio per ignorare il gruppo comportamento scatolare di default di rispondere con HT_TRANSPARENT ... pur avendo la sua proprietà trasparente in ClassWizard impostato su false. Hmmm. Qualcuno può confermare che questa è davvero la chiave?

È stato utile?

Soluzione

Credo WM_NCHHITTEST / HT_TRANSPARENT è davvero la chiave qui.

caselle di gruppo sono una strana controllo: mentre sembra che contengono altri controlli, in realtà sono fratelli di quei controlli nella struttura HWND. Quindi un GroupBox che sembra che contiene due pulsanti è in realtà un fratello di questi pulsanti -. E potrebbe venire prima o dopo di esso nella gerarchia HWND

caselle di gruppo rispondono al WM_NCHITTEST con HT_TRANSPARENT, in modo che i clic del mouse andare a destra attraverso di loro. Uno dei vantaggi di questo è che non importa se la casella di gruppo viene prima o dopo i controlli che sembra contenere nell'ordine finestra; i clic finirà per essere indirizzati a questi controlli, non il GroupBox.

Per ottenere un doppio clic (o semplicemente cliccando pianura) sulla groupbox al lavoro, avresti bisogno di fare due cose:

  • ignorare il comportamento predefinito WM_NCHITTEST e invece tornare HT_CLIENT, come un regolare controllo
  • ; a questo punto dovrebbe essere in grado di ottenere WM_LBUTTONDOWN e gli eventi correlati che altrimenti sarebbero andati altrove (ad un fratello, o per la finestra di dialogo in sé).
  • in modo che il contenuto della casella di gruppo vengono * prima * nel HWND z-ordine, in modo che essi non sono più si affidano a scatti che vanno 'attraverso' il GroupBox. (Almeno credo che si desidera che siano prima,. In entrambi i casi, potrebbe essere necessario giocare con l'ordinamento HWND ora che è di nuovo significativo)

Si noti che questo è un diverso tipo di trasparenza di nuovo dal WS_EX_TRANSPARENT, che potrebbe essere quello che le mappe di proprietà guidata classe trasparente per. Grossolanamente semplificata, HT_TRANSPARENT ha a che fare con l'essere trasparente per il mouse; WS_EX_TRANSPARENT è più di essere dipinta ultima in modo che i fratelli "spettacolo attraverso".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top