2009-07-22 19 views
8

Ho una finestra di dialogo MFC in cui sono presenti due pulsanti di opzione. Li ho messi in un bel gruppo, i loro IDC sono uno dopo l'altro (RB_LEFT, RB_RIGHT).Pulsanti radio MFC - Comportamento DDX_Radio e DDX_Control

voglio usare DDX_Radio modo posso accedere ai pulsanti usando un valore intero nel modo DoDataExchange funzione chiamo:

DDX_Radio(pDX, RB_LEFT, mRBLeftRight); 

dove mRBLeftRight è una variabile membro di tipo intero. Ho anche bisogno di modificare i tasti di proprietà così ho voluto usare un DDX_Control per mappare loro su variabili membro mRBLeft e mRBRight (CButton):

DDX_Control(pDX, RB_LEFT, mRBLeft); 
    DDX_Control(pDX, RB_RIGHT, mRBRight); 

Ora, se faccio la chiamata a DDX_Control, ogni volta che DoDataExchange viene chiamato, il l'applicazione si blocca perché DDX_Control forza RB_LEFT per gestire un messaggio che DDX_Radio non può gestire. Questa parte capisco.

Ho deciso di non utilizzare DDX_Control (rimosso le chiamate in DoDataExchange) e di mantenere un puntatore ai miei pulsanti di opzione (CButton *) nelle mie classi. Quindi, nella mia funzione OnInitDialog, faccio le seguenti chiamate:

mRBLeft= ((CButton*)GetDlgItem(RB_LEFT)); 
    mRBRight = ((CButton*)GetDlgItem(RB_RIGHT)); 

Ora finché io non uso mRBLeft sta andando bene, ma se lo faccio, bam, crash su DoDataExchange. La cosa che mi imbarazza davvero è che se cambio il mio pulsante radio sinistro utilizzando funzionerà. Così, qual è la differenza?

(lo so che è un sacco di problemi per poco, ma voglio solo capire la meccanica)

+0

Ho letto da qualche parte che non dovrei memorizzare un puntatore restituito da GetDlgItem, che probabilmente ha ragione, forse questa è la causa del mio problema? – levesque

risposta

7

TBH E 'ancora più facile di quello di JC ti porta a credere.

DDX_Control(pDX, IDC_RADIO3, m_r3); 
DDX_Control(pDX, IDC_RADIO4, m_r4); 

m_Val = 0; 
DDX_Radio(pDX, IDC_RADIO3, m_Val); 

è necessario marcare il pulsante prima radio nel gruppo con WS GROUP (In questo caso IDC_RADIO3). Ora sei a posto e selezionerà automaticamente IDC_RADIO3).

Ora per mantenere aggiornato m_Val è probabilmente utile inserire un gestore di clic su tutti i pulsanti di opzione nel gruppo. All'interno di questa funzione, semplicemente, chiama UpdateData (TRUE); m_Val punta ora all'indice del pulsante di opzione nel gruppo.

+0

Ho contrassegnato il primo pulsante di opzione con 'WS_GROUP' ... – levesque

+0

Ho fatto esattamente questo .. credetemi si bloccherà se si utilizza il m_r3. – levesque

+2

Strano ... per coniare una frase, "Funziona sulla mia macchina" ... – Goz

1

C'è un errore nei vostri locali. È possibile utilizzare DDX_Radio e DDX_Control per lo stesso controllo, altrimenti sarebbe abbastanza inutile. Puoi approfondire

"Ora, se faccio la chiamata a DDX_Control, ogni volta che DoDataExchange si chiama, l'applicazione si blocca perché le forze DDX_Control RB_LEFT per gestire un messaggio che DDX_Radio non può gestire. Questa parte capisco."

perché penso che questo sia già un sintomo del problema di fondo.

+0

Ho trovato la risposta, se ti interessa :) – levesque

3

ho trovato la risposta qui: http://www.flounder.com/getdlgitem.htm

c'è un problema con l'utilizzo DDX_Control e DDX_Radio allo stesso tempo :) Questo è un piccolo trucco per aggirare il problema.

Radio variabili pulsanti

Un altro problema intrinseco, che rappresenta una sorta di strana punto di vista filosofico di Microsoft, è che non deve essere permesso di creare variabili di controllo per radiofoniche pulsanti. Questo non ha senso. Sono hanno una strana idea che l'unico modo in cui si manipolano i pulsanti di opzione tramite un pulsante tramite un indice. Questo è irrimediabilmente inadeguato.Pertanto, è necessario passare attraverso alcune serie contorsioni a per ottenere le variabili di controllo per i pulsanti della radio .

La prima cosa che devi fare è andare indietro e contrassegnare tutti i pulsanti di opzione come con lo stile WS_GROUP. Solo i pulsanti di opzione con uno stile WS_GROUP possono avere una variabile di controllo. Tuttavia, se si contrassegna tutte con WS_GROUP, creare il controllo variabili, e quindi rimuovere l'attributo WS_GROUP, tutto funziona bene, grazie. Il motivo per cui dobbiamo eseguire questi passaggi aggiuntivi non rende il senso dello , ma come il problema delle classi derivate , mi sono lamentato di questo per anni senza alcun effetto. mio problema è che io continuo a dimenticare di tornare indietro e annullare tutte le WS_GROUP attributi, quindi la prima volta che ho eseguito il programma dopo questo trovo che tutti i miei pulsanti di opzione sono un unico pulsante gruppi. Ops. $ #%! Correggere e ricompilare/ricollegare.

+1

Hmm Ancora non capisco, questo ha sempre funzionato come previsto per me. Come accennato in seguito, è necessario impostare lo stile del primo controllo su WS_GROUP e quindi funziona. Ah bene, almeno hai risolto il problema. – Roel

+1

FYI, mi sono appena imbattuto in questa domanda e ho pensato di farti sapere, non ho questo problema, e il consiglio standard di Goz è quello che uso. Potrebbe indicare un problema più profondo per te. –

+0

@ Mark, per una strana coincidenza ho incontrato anche questo oggi. Questa risposta è un cattivo consiglio, rappresenta un fraintendimento del funzionamento di DDX_Radio. Ti si apre un sacco di dolore quando si va contro ciò che Microsoft si aspetta. C'era un altro problema di fondo nel codice che non è mai stato diagnosticato, e con una soluzione sul posto non lo sarà mai. –

Problemi correlati